]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR67383][ARM][4.9]Backport of "Allow any register for DImode values in Thumb2"
authorRenlin Li <renlin.li@arm.com>
Wed, 2 Dec 2015 14:06:31 +0000 (14:06 +0000)
committerRenlin Li <renlin@gcc.gnu.org>
Wed, 2 Dec 2015 14:06:31 +0000 (14:06 +0000)
This partially fix PR67383. It allows the reload more flexibility to choose
spilling pseudo registers.

gcc/ChangeLog:

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

Backport from mainline.
2014-04-22  Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>

* config/arm/arm.c (arm_hard_regno_mode_ok): Loosen
restrictions on core registers for DImode values in Thumb2.

From-SVN: r231177

gcc/ChangeLog
gcc/config/arm/arm.c

index ee1d24075cdda1778d93796309310e70509e1a9a..f0e5d6f245e97cf0644d972f9913d14ce68f22cd 100644 (file)
@@ -1,3 +1,11 @@
+2015-12-02  Renlin Li  <renlin.li@arm.com>
+
+       Backport from mainline.
+       2014-04-22  Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+       * config/arm/arm.c (arm_hard_regno_mode_ok): Loosen
+       restrictions on core registers for DImode values in Thumb2.
+
 2015-11-25  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/67954
index 8ba60608a8fc0a05d70e787c9e0914e4f8dcbb8f..d9028a1aed6b7dc3448520b0d82a4ffc6b1c1733 100644 (file)
@@ -22624,12 +22624,19 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
     }
 
   /* We allow almost any value to be stored in the general registers.
-     Restrict doubleword quantities to even register pairs so that we can
-     use ldrd.  Do not allow very large Neon structure opaque modes in
-     general registers; they would use too many.  */
+     Restrict doubleword quantities to even register pairs in ARM state
+     so that we can use ldrd.  Do not allow very large Neon structure
+     opaque modes in general registers; they would use too many.  */
   if (regno <= LAST_ARM_REGNUM)
-    return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0)
-      && ARM_NUM_REGS (mode) <= 4;
+    {
+      if (ARM_NUM_REGS (mode) > 4)
+         return FALSE;
+
+      if (TARGET_THUMB2)
+       return TRUE;
+
+      return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0);
+    }
 
   if (regno == FRAME_POINTER_REGNUM
       || regno == ARG_POINTER_REGNUM)