Commit 28356f52 by Jan Beulich Committed by Jan Beulich

i386.c (ix86_expand_branch, [...]): Handle TImode in 64-bit mode the same as DImode in 32-bit mode.

gcc/
2005-07-18  Jan Beulich  <jbeulich@novell.com>

	* config/i386/i386.c (ix86_expand_branch, ix86_expand_setcc,
	ix86_expand_carry_flag_compare, ix86_expand_int_movcc): Handle TImode
	in 64-bit mode the same as DImode in 32-bit mode.
	(ix86_expand_ashl_const, ix86_split_ashl, ix86_split_ashr,
	ix86_split_lshr): Likewise. Rename to no longer refer to a specific
	mode. Add new mode parameter.
	* config/i386/i386.h (CONST_OK_FOR_LETTER_P): Describe and handle 'O'.
	* config/i386/i386.md (cmpti, addti3, subti3, negti2, ashlti3, ashrti3,
	x86_64_shift_adj): New expanders.
	(*addti3_1, *subti3_1, *negti2_1, ashlti3_1, *ashlti3_2, ashrti3_1,
	*ashrti3_2, lshrti3_1, *lshrti3_2, x86_64_shld, x86_64_shrd): New
	insns.
	Respective new splitters. Use renamed shift splitter helpers in 32-bit
	DImode shift splitters.
	* config/i386/i386-protos.h (ix86_split_ashl, ix86_split_ashr,
	ix86_split_lshr): Renamed from ix86_split_[al]sh[rl]di. Added new
	mode parameter.

From-SVN: r102129
parent 422edd6f
2005-07-18 Jan Beulich <jbeulich@novell.com> 2005-07-18 Jan Beulich <jbeulich@novell.com>
* config/i386/i386.c (ix86_expand_branch, ix86_expand_setcc,
ix86_expand_carry_flag_compare, ix86_expand_int_movcc): Handle TImode
in 64-bit mode the same as DImode in 32-bit mode.
(ix86_expand_ashl_const, ix86_split_ashl, ix86_split_ashr,
ix86_split_lshr): Likewise. Rename to no longer refer to a specific
mode. Add new mode parameter.
* config/i386/i386.h (CONST_OK_FOR_LETTER_P): Describe and handle 'O'.
* config/i386/i386.md (cmpti, addti3, subti3, negti2, ashlti3, ashrti3,
x86_64_shift_adj): New expanders.
(*addti3_1, *subti3_1, *negti2_1, ashlti3_1, *ashlti3_2, ashrti3_1,
*ashrti3_2, lshrti3_1, *lshrti3_2, x86_64_shld, x86_64_shrd): New
insns.
Respective new splitters. Use renamed shift splitter helpers in 32-bit
DImode shift splitters.
* config/i386/i386-protos.h (ix86_split_ashl, ix86_split_ashr,
ix86_split_lshr): Renamed from ix86_split_[al]sh[rl]di. Added new
mode parameter.
2005-07-18 Jan Beulich <jbeulich@novell.com>
* i386.md (movdi_extzv_1): New. * i386.md (movdi_extzv_1): New.
(zero_extendhidi2): Combine alternatives and never force use of (zero_extendhidi2): Combine alternatives and never force use of
REX64 prefix. REX64 prefix.
......
...@@ -155,9 +155,9 @@ extern void ix86_expand_call (rtx, rtx, rtx, rtx, rtx, int); ...@@ -155,9 +155,9 @@ extern void ix86_expand_call (rtx, rtx, rtx, rtx, rtx, int);
extern void x86_initialize_trampoline (rtx, rtx, rtx); extern void x86_initialize_trampoline (rtx, rtx, rtx);
extern rtx ix86_zero_extend_to_Pmode (rtx); extern rtx ix86_zero_extend_to_Pmode (rtx);
extern void ix86_split_long_move (rtx[]); extern void ix86_split_long_move (rtx[]);
extern void ix86_split_ashldi (rtx *, rtx); extern void ix86_split_ashl (rtx *, rtx, enum machine_mode);
extern void ix86_split_ashrdi (rtx *, rtx); extern void ix86_split_ashr (rtx *, rtx, enum machine_mode);
extern void ix86_split_lshrdi (rtx *, rtx); extern void ix86_split_lshr (rtx *, rtx, enum machine_mode);
extern rtx ix86_find_base_term (rtx); extern rtx ix86_find_base_term (rtx);
extern int ix86_check_movabs (rtx, int); extern int ix86_check_movabs (rtx, int);
......
...@@ -1218,7 +1218,7 @@ enum reg_class ...@@ -1218,7 +1218,7 @@ enum reg_class
(C) == 'l' ? INDEX_REGS : \ (C) == 'l' ? INDEX_REGS : \
NO_REGS) NO_REGS)
/* The letters I, J, K, L and M in a register constraint string /* The letters I, J, K, L, M, N, and O in a register constraint string
can be used to stand for particular ranges of immediate operands. can be used to stand for particular ranges of immediate operands.
This macro defines what the ranges are. This macro defines what the ranges are.
C is the letter, and VALUE is a constant value. C is the letter, and VALUE is a constant value.
...@@ -1230,6 +1230,7 @@ enum reg_class ...@@ -1230,6 +1230,7 @@ enum reg_class
L is for andsi as zero-extending move. L is for andsi as zero-extending move.
M is for shifts that can be executed by the "lea" opcode. M is for shifts that can be executed by the "lea" opcode.
N is for immediate operands for out/in instructions (0-255) N is for immediate operands for out/in instructions (0-255)
O is for TImode shifts.
*/ */
#define CONST_OK_FOR_LETTER_P(VALUE, C) \ #define CONST_OK_FOR_LETTER_P(VALUE, C) \
...@@ -1239,6 +1240,7 @@ enum reg_class ...@@ -1239,6 +1240,7 @@ enum reg_class
: (C) == 'L' ? (VALUE) == 0xff || (VALUE) == 0xffff \ : (C) == 'L' ? (VALUE) == 0xff || (VALUE) == 0xffff \
: (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 \ : (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 \
: (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 \ : (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 \
: (C) == 'O' ? (VALUE) >= 0 && (VALUE) <= 127 \
: 0) : 0)
/* Similar, but for floating constants, and defining letters G and H. /* Similar, but for floating constants, and defining letters G and H.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment