re PR target/49781 ([x32] Unnecessary lea in x32 mode)
PR target/49781 * config/i386/i386.c (ix86_decompose_address): Allow zero-extended SImode addresses. (ix86_print_operand_address): Handle zero-extended addresses. (memory_address_length): Add length of addr32 prefix for zero-extended addresses. (ix86_secondary_reload): Handle moves to/from double-word general registers from/to zero-extended addresses. * config/i386/predicates.md (lea_address_operand): Reject zero-extended operands. From-SVN: r177566
This commit is contained in:
parent
d7cfa3145f
commit
473b30ce95
@ -1,8 +1,20 @@
|
|||||||
|
2011-08-07 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/49781
|
||||||
|
* config/i386/i386.c (ix86_decompose_address): Allow zero-extended
|
||||||
|
SImode addresses.
|
||||||
|
(ix86_print_operand_address): Handle zero-extended addresses.
|
||||||
|
(memory_address_length): Add length of addr32 prefix for
|
||||||
|
zero-extended addresses.
|
||||||
|
(ix86_secondary_reload): Handle moves to/from double-word general
|
||||||
|
registers from/to zero-extended addresses.
|
||||||
|
* config/i386/predicates.md (lea_address_operand): Reject
|
||||||
|
zero-extended operands.
|
||||||
|
|
||||||
2011-08-08 H.J. Lu <hongjiu.lu@intel.com>
|
2011-08-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR other/48007
|
PR other/48007
|
||||||
* config.gcc (libgcc_tm_file): Add i386/value-unwind.h for
|
* config.gcc (libgcc_tm_file): Add i386/value-unwind.h for Linux/x86.
|
||||||
Linux/x86.
|
|
||||||
|
|
||||||
* system.h (REG_VALUE_IN_UNWIND_CONTEXT): Poisoned.
|
* system.h (REG_VALUE_IN_UNWIND_CONTEXT): Poisoned.
|
||||||
(ASSUME_EXTENDED_UNWIND_CONTEXT): Likewise.
|
(ASSUME_EXTENDED_UNWIND_CONTEXT): Likewise.
|
||||||
@ -43,10 +55,8 @@
|
|||||||
|
|
||||||
* config/sparc/driver-sparc.c: New file.
|
* config/sparc/driver-sparc.c: New file.
|
||||||
* config/sparc/x-sparc: New file.
|
* config/sparc/x-sparc: New file.
|
||||||
* config.host: Use driver-sparc.o, sparc/x-sparc on
|
* config.host: Use driver-sparc.o, sparc/x-sparc on sparc*-*-solaris2*.
|
||||||
sparc*-*-solaris2*.
|
* config/sparc/sparc.opt (native): New value for enum processor_type.
|
||||||
* config/sparc/sparc.opt (native): New value for enum
|
|
||||||
processor_type.
|
|
||||||
* config/sparc/sparc-opts.h (PROCESSOR_NATIVE): Declare.
|
* config/sparc/sparc-opts.h (PROCESSOR_NATIVE): Declare.
|
||||||
* config/sparc/sparc.c (sparc_option_override): Abort if
|
* config/sparc/sparc.c (sparc_option_override): Abort if
|
||||||
PROCESSOR_NATIVE gets here.
|
PROCESSOR_NATIVE gets here.
|
||||||
@ -93,7 +103,7 @@
|
|||||||
(TARGET_INSTANTIATE_DECLS): New define.
|
(TARGET_INSTANTIATE_DECLS): New define.
|
||||||
|
|
||||||
2011-08-06 Paolo Bonzini <bonzini@gnu.org>
|
2011-08-06 Paolo Bonzini <bonzini@gnu.org>
|
||||||
Mikael Morin <mikael.morin@sfr.fr>
|
Mikael Morin <mikael.morin@sfr.fr>
|
||||||
|
|
||||||
* Makefile.in (INCLUDES_FOR_TARGET): New.
|
* Makefile.in (INCLUDES_FOR_TARGET): New.
|
||||||
(LIBGCC2_CFLAGS): Use it.
|
(LIBGCC2_CFLAGS): Use it.
|
||||||
|
@ -11142,6 +11142,14 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
|||||||
int retval = 1;
|
int retval = 1;
|
||||||
enum ix86_address_seg seg = SEG_DEFAULT;
|
enum ix86_address_seg seg = SEG_DEFAULT;
|
||||||
|
|
||||||
|
/* Allow zero-extended SImode addresses,
|
||||||
|
they will be emitted with addr32 prefix. */
|
||||||
|
if (TARGET_64BIT
|
||||||
|
&& GET_CODE (addr) == ZERO_EXTEND
|
||||||
|
&& GET_MODE (addr) == DImode
|
||||||
|
&& GET_MODE (XEXP (addr, 0)) == SImode)
|
||||||
|
addr = XEXP (addr, 0);
|
||||||
|
|
||||||
if (REG_P (addr))
|
if (REG_P (addr))
|
||||||
base = addr;
|
base = addr;
|
||||||
else if (GET_CODE (addr) == SUBREG)
|
else if (GET_CODE (addr) == SUBREG)
|
||||||
@ -14159,8 +14167,12 @@ ix86_print_operand_address (FILE *file, rtx addr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Print DImode registers on 64bit targets to avoid addr32 prefixes. */
|
int code = 0;
|
||||||
int code = TARGET_64BIT ? 'q' : 0;
|
|
||||||
|
/* Print SImode registers for zero-extended addresses to force
|
||||||
|
addr32 prefix. Otherwise print DImode registers to avoid it. */
|
||||||
|
if (TARGET_64BIT)
|
||||||
|
code = (GET_CODE (addr) == ZERO_EXTEND) ? 'l' : 'q';
|
||||||
|
|
||||||
if (ASSEMBLER_DIALECT == ASM_ATT)
|
if (ASSEMBLER_DIALECT == ASM_ATT)
|
||||||
{
|
{
|
||||||
@ -21772,7 +21784,8 @@ assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate the length of the memory address in the instruction
|
/* Calculate the length of the memory address in the instruction
|
||||||
encoding. Does not include the one-byte modrm, opcode, or prefix. */
|
encoding. Includes addr32 prefix, does not include the one-byte modrm,
|
||||||
|
opcode, or other prefixes. */
|
||||||
|
|
||||||
int
|
int
|
||||||
memory_address_length (rtx addr)
|
memory_address_length (rtx addr)
|
||||||
@ -21799,7 +21812,9 @@ memory_address_length (rtx addr)
|
|||||||
base = parts.base;
|
base = parts.base;
|
||||||
index = parts.index;
|
index = parts.index;
|
||||||
disp = parts.disp;
|
disp = parts.disp;
|
||||||
len = 0;
|
|
||||||
|
/* Add length of addr32 prefix. */
|
||||||
|
len = (GET_CODE (addr) == ZERO_EXTEND);
|
||||||
|
|
||||||
/* Rule of thumb:
|
/* Rule of thumb:
|
||||||
- esp as the base always wants an index,
|
- esp as the base always wants an index,
|
||||||
@ -28233,6 +28248,15 @@ ix86_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
|
|||||||
enum machine_mode mode,
|
enum machine_mode mode,
|
||||||
secondary_reload_info *sri ATTRIBUTE_UNUSED)
|
secondary_reload_info *sri ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
|
/* Double-word spills from general registers to non-offsettable memory
|
||||||
|
references (zero-extended addresses) go through XMM register. */
|
||||||
|
if (TARGET_64BIT
|
||||||
|
&& MEM_P (x)
|
||||||
|
&& GET_MODE_SIZE (mode) > UNITS_PER_WORD
|
||||||
|
&& rclass == GENERAL_REGS
|
||||||
|
&& !offsettable_memref_p (x))
|
||||||
|
return SSE_REGS;
|
||||||
|
|
||||||
/* QImode spills from non-QI registers require
|
/* QImode spills from non-QI registers require
|
||||||
intermediate register on 32bit targets. */
|
intermediate register on 32bit targets. */
|
||||||
if (!TARGET_64BIT
|
if (!TARGET_64BIT
|
||||||
|
@ -801,6 +801,10 @@
|
|||||||
struct ix86_address parts;
|
struct ix86_address parts;
|
||||||
int ok;
|
int ok;
|
||||||
|
|
||||||
|
/* LEA handles zero-extend by itself. */
|
||||||
|
if (GET_CODE (op) == ZERO_EXTEND)
|
||||||
|
return false;
|
||||||
|
|
||||||
ok = ix86_decompose_address (op, &parts);
|
ok = ix86_decompose_address (op, &parts);
|
||||||
gcc_assert (ok);
|
gcc_assert (ok);
|
||||||
return parts.seg == SEG_DEFAULT;
|
return parts.seg == SEG_DEFAULT;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user