avr.c (out_movhi_r_mr): Only SBIW if X is not unused after.
authorGeorg-Johann Lay <avr@gjlay.de>
Mon, 28 Nov 2016 09:28:45 +0000 (09:28 +0000)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Mon, 28 Nov 2016 09:28:45 +0000 (09:28 +0000)
* config/avr/avr.c (out_movhi_r_mr) [REG_X + PLUS]: Only SBIW if
X is not unused after.

From-SVN: r242909

gcc/ChangeLog
gcc/config/avr/avr.c

index 5b8913f..0c09fb0 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-28  Georg-Johann Lay  <avr@gjlay.de>
+
+       * config/avr/avr.c (out_movhi_r_mr) [REG_X + PLUS]: Only SBIW if
+       X is not unused after.
+
 2016-11-28  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR rtl-optimization/78120
index ba00147..d0c54c2 100644 (file)
@@ -4028,16 +4028,22 @@ out_movhi_r_mr (rtx_insn *insn, rtx op[], int *plen)
          optimization options.  */
 
       if (reg_base == REG_X)
-        return reg_base == reg_dest
-          ? avr_asm_len ("adiw r26,%o1"      CR_TAB
-                         "ld __tmp_reg__,X+" CR_TAB
-                         "ld %B0,X"          CR_TAB
-                         "mov %A0,__tmp_reg__", op, plen, -4)
-
-          : avr_asm_len ("adiw r26,%o1" CR_TAB
-                         "ld %A0,X+"    CR_TAB
-                         "ld %B0,X"     CR_TAB
-                         "sbiw r26,%o1+1", op, plen, -4);
+        {
+          if (reg_base == reg_dest)
+            return avr_asm_len ("adiw r26,%o1"      CR_TAB
+                                "ld __tmp_reg__,X+" CR_TAB
+                                "ld %B0,X"          CR_TAB
+                                "mov %A0,__tmp_reg__", op, plen, -4);
+
+          avr_asm_len ("adiw r26,%o1" CR_TAB
+                       "ld %A0,X+"    CR_TAB
+                       "ld %B0,X", op, plen, -3);
+
+          if (!reg_unused_after (insn, XEXP (base, 0)))
+            avr_asm_len ("sbiw r26,%o1+1", op, plen, 1);
+
+          return "";
+        }
 
       return reg_base == reg_dest
         ? avr_asm_len ("ldd __tmp_reg__,%A1" CR_TAB