i386.c (ix86_avoid_lea_for_addr): Return false for SImode_address_operand operands...
authorUros Bizjak <ubizjak@gmail.com>
Mon, 20 Jan 2014 17:59:14 +0000 (18:59 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 20 Jan 2014 17:59:14 +0000 (18:59 +0100)
* config/i386/i386.c (ix86_avoid_lea_for_addr): Return false
for SImode_address_operand operands, having only a REG argument.

From-SVN: r206847

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md

index cd9667c..a199b8d 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.c (ix86_avoid_lea_for_addr): Return false
+       for SImode_address_operand operands, having only a REG argument.
+
 2014-01-20  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
        * config/aarch64/aarch64-linux.h (GLIBC_DYNAMIC_LINKER): Expand
index 9991c30..1a4d568 100644 (file)
@@ -18160,17 +18160,16 @@ ix86_avoid_lea_for_addr (rtx insn, rtx operands[])
     return false;
 
   /* The "at least two components" test below might not catch simple
-     *mov[sd]i_internal or *zero_extendsidi2 insns if parts.base is
-     non-NULL and parts.disp is const0_rtx as the only components in
-     the address, e.g. if the register is %rbp or %r13.  As this
-     test is much cheaper and moves or zero extensions are the common
-     case, do this check first.  */
+     move or zero extension insns if parts.base is non-NULL and parts.disp
+     is const0_rtx as the only components in the address, e.g. if the
+     register is %rbp or %r13.  As this test is much cheaper and moves or
+     zero extensions are the common case, do this check first.  */
   if (REG_P (operands[1])
-      || (GET_CODE (operands[1]) == ZERO_EXTEND
+      || (SImode_address_operand (operands[1], VOIDmode)
          && REG_P (XEXP (operands[1], 0))))
     return false;
 
-  /* Check it is correct to split here.  */
+  /* Check if it is OK to split here.  */
   if (!ix86_ok_to_clobber_flags (insn))
     return false;
 
index 603fd8a..53edacf 100644 (file)
   /* Zero-extend return register to DImode for zero-extended addresses.  */
   if (mode != <MODE>mode)
     emit_insn (gen_zero_extendsidi2
-              (operands[0], gen_lowpart ((mode), operands[0])));
+              (operands[0], gen_lowpart (mode, operands[0])));
 
   DONE;
 }