[PATCH][AARCH64]Use mov for add with large immediate.
authorRenlin Li <renlin.li@arm.com>
Tue, 5 May 2015 10:16:46 +0000 (10:16 +0000)
committerRenlin Li <renlin@gcc.gnu.org>
Tue, 5 May 2015 10:16:46 +0000 (10:16 +0000)
gcc/

2015-05-05  Renlin Li  <renlin.li@arm.com>

* config/aarch64/aarch64.md (add<mode>3): Use mov when allowed.

From-SVN: r222800

gcc/ChangeLog
gcc/config/aarch64/aarch64.md

index 83509a04b392e0e44e6af7a3358de879d4ebaf2d..5667dd45f737af394e88ce526dc298bbdf40d21b 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-05  Renlin Li  <renlin.li@arm.com>
+
+       * config/aarch64/aarch64.md (add<mode>3): Use mov when allowed.
+
 2015-05-05  Yvan Roux  <yvan.roux@linaro.org>
 
        * config/aarch64/aarch64-elf-raw.h (CA53_ERR_843419_SPEC): Define.
index 11c470951dc77067a1b3859e0b49639f306f542d..1c2c5fba4c3a4f7a4136764d3dbed7b5eaa62341 100644 (file)
   "
   if (! aarch64_plus_operand (operands[2], VOIDmode))
     {
-      rtx subtarget = ((optimize && can_create_pseudo_p ())
-                      ? gen_reg_rtx (<MODE>mode) : operands[0]);
       HOST_WIDE_INT imm = INTVAL (operands[2]);
 
-      if (imm < 0)
-       imm = -(-imm & ~0xfff);
+      if (aarch64_move_imm (imm, <MODE>mode) && can_create_pseudo_p ())
+        {
+         rtx tmp = gen_reg_rtx (<MODE>mode);
+         emit_move_insn (tmp, operands[2]);
+         operands[2] = tmp;
+        }
       else
-        imm &= ~0xfff;
-
-      emit_insn (gen_add<mode>3 (subtarget, operands[1], GEN_INT (imm)));
-      operands[1] = subtarget;
-      operands[2] = GEN_INT (INTVAL (operands[2]) - imm);
+        {
+         rtx subtarget = ((optimize && can_create_pseudo_p ())
+                          ? gen_reg_rtx (<MODE>mode) : operands[0]);
+
+         if (imm < 0)
+           imm = -(-imm & ~0xfff);
+         else
+           imm &= ~0xfff;
+
+         emit_insn (gen_add<mode>3 (subtarget, operands[1], GEN_INT (imm)));
+         operands[1] = subtarget;
+         operands[2] = GEN_INT (INTVAL (operands[2]) - imm);
+        }
     }
   "
 )