Allow any general purpose register to hold an SImode (or smaller) value.
authorNick Clifton <nickc@cambridge.redhat.com>
Fri, 25 Jan 2002 11:44:12 +0000 (11:44 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Fri, 25 Jan 2002 11:44:12 +0000 (11:44 +0000)
From-SVN: r49213

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

index 52937b1639adb5b23cdae23fa459dd49c32e51a9..a76845cffaaf209ae749297f10b258ce5483fbb5 100644 (file)
@@ -1,3 +1,8 @@
+2002-01-25  Nick Clifton  <nickc@cambridge.redhat.com>
+
+       * config/arm/arm.c (arm_hard_regno_mode_ok): Allow any general
+       purpose register to hold an SImode (or smaller) value.
+
 2002-01-25  Jakub Jelinek  <jakub@redhat.com>
 
        * unwind-dw2-fde-glibc.c: If inhibit_libc, use __register_frame*
index 1999af04e4ee0d2d105f711de7d2d1e176c21d04..dd823a2b206e8dc4840e5b2b625ace0662c69e32 100644 (file)
@@ -9139,24 +9139,20 @@ arm_hard_regno_mode_ok (regno, mode)
     return (NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM);
 
   if (regno <= LAST_ARM_REGNUM)
-    /* If the register is a general purpose ARM register we allow
-       it only if it not a special register (SP, LR, PC) and only
-       if there will be enough (non-special) registers to hold the
-       entire value.  */
-    {
-      /* As a special exception we allow an SImode value to be
-        "assigned" to the stack pointer.  This is not intended
-        to actually allow a value to be stored in the SP, but so
-        that the stack pointer can be referenced from C code like
-        this:
-        
-          register char * stack_ptr asm ("sp");
-
-        This expression is actually used in newlib...  */
-      if (mode == SImode && regno == SP_REGNUM)
-       return 1;
-      return regno < (SP_REGNUM - (unsigned) NUM_REGS (mode));
-    }
+    /* We allow an SImode or smaller value to be stored in any
+       general purpose register.  This does not mean, for example
+       that GCC will choose to store a variable in the stack pointer
+       since it is a fixed register.  But it is important to allow
+       access to these special registers, so that they can be
+       referenced from C code via the asm assembler alias, eg:
+
+          register char * stack_ptr asm ("sp");
+
+       For any mode requiring more than one register to hold the
+       value we restrict the choice so that r13, r14, and r15
+       cannot be part of the register set.  */
+    return (NUM_REGS (mode) <= 1)
+      || (regno < (SP_REGNUM - (unsigned) NUM_REGS (mode)));
 
   if (   regno == FRAME_POINTER_REGNUM
       || regno == ARG_POINTER_REGNUM)