]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[ARM] Allow any register for DImode values in Thumb2
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Tue, 22 Apr 2014 10:05:48 +0000 (10:05 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Tue, 22 Apr 2014 10:05:48 +0000 (10:05 +0000)
Ramana commented in the submission email:

    I noticed that for T32 we don't allow any old register for DImode
    values. The restriction of an even register is true only for ARM state
    because the ISA doesn't allow any old register in this place. In a few
    large .i files that I had knocking about, noticed a nice drop in stack
    usage and a generally improved register allocation strategy.

From-SVN: r209615

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

index e640faf2210526761b6f7680cccef32415c63fd1..80ffa581870660ce3648e2d685c6842d4e398df5 100644 (file)
@@ -1,3 +1,8 @@
+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.
+
 2014-04-22  Ian Bolton  <ian.bolton@arm.com>
 
        * config/arm/arm.md (*anddi_notdi_zesidi): New pattern.
index 08b52557586ce4e86eb12103dd7af646a81d4cd0..88d957a21f6df369eab795e506898a091457c1e8 100644 (file)
@@ -22646,12 +22646,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)