arm.h (BASE_REG_CLASS): Always return LO_REGS for Thumb.
authorRichard Earnshaw <rearnsha@arm.com>
Mon, 30 Sep 2002 11:18:38 +0000 (11:18 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Mon, 30 Sep 2002 11:18:38 +0000 (11:18 +0000)
* arm.h (BASE_REG_CLASS): Always return LO_REGS for Thumb.
(MODE_BASE_REG_CLASS, case Thumb): Only return BASE_REGS if we know
that we have a SImode access, and only then if reload hasn't completed;
for all other cases, use LO_REGS.

From-SVN: r57644

gcc/ChangeLog
gcc/config/arm/arm.h

index 6bd1e0e1cc9701c48d7e2ffbf546b945db1998c2..15dfb25db7f2269a46a5ef424647dccdfea36f94 100644 (file)
@@ -1,3 +1,10 @@
+2002-09-30  Richard Earnshaw  <rearnsha@arm.com>
+
+       * arm.h (BASE_REG_CLASS): Always return LO_REGS for Thumb.
+       (MODE_BASE_REG_CLASS, case Thumb): Only return BASE_REGS if we know
+       that we have a SImode access, and only then if reload hasn't completed;
+       for all other cases, use LO_REGS.
+
 2002-09-29  Richard Henderson  <rth@redhat.com>
 
        * real.c (real_from_string): Apply sign last.  Tidy exponent handling.
index 9c0ce4437abc0ed1edbc1c05b8b6518e68949294..3b3e38a629b7ca996dc5c5cac969b06ad03fafad 100644 (file)
@@ -1070,14 +1070,16 @@ enum reg_class
 
 /* The class value for index registers, and the one for base regs.  */
 #define INDEX_REG_CLASS  (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
-#define BASE_REG_CLASS   (TARGET_THUMB ? BASE_REGS : GENERAL_REGS)
+#define BASE_REG_CLASS   (TARGET_THUMB ? LO_REGS : GENERAL_REGS)
 
-/* For the Thumb the high registers cannot be used as base
-   registers when addressing quanitities in QI or HI mode.  */
+/* For the Thumb the high registers cannot be used as base registers
+   when addressing quanitities in QI or HI mode; if we don't know the
+   mode, then we must be conservative.  After reload we must also be
+   conservative, since we can't support SP+reg addressing, and we
+   can't fix up any bad substitutions.  */
 #define MODE_BASE_REG_CLASS(MODE)                                      \
-    (TARGET_ARM ? BASE_REGS :                                          \
-     (((MODE) == QImode || (MODE) == HImode || (MODE) == VOIDmode)     \
-     ? LO_REGS : BASE_REGS))
+    (TARGET_ARM ? GENERAL_REGS :                                       \
+     (((MODE) == SImode && !reload_completed) ? BASE_REGS : LO_REGS))
 
 /* When SMALL_REGISTER_CLASSES is nonzero, the compiler allows
    registers explicitly used in the rtl to be used as spill registers