loop.c (move_movables): Note issues with replacing REGs with SUBREGs.
authorJeffrey A Law <law@cygnus.com>
Thu, 17 Jun 1999 13:29:11 +0000 (13:29 +0000)
committerJeff Law <law@gcc.gnu.org>
Thu, 17 Jun 1999 13:29:11 +0000 (07:29 -0600)

        * loop.c (move_movables): Note issues with replacing REGs with
        SUBREGs.
        * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly.

From-SVN: r27573

gcc/ChangeLog
gcc/config/mips/mips.h
gcc/loop.c

index e09ddfe701478e023a6c288db3d425d50d339877..dabee24bdee5a2fa62e37d9abdf0e0af2e5636fa 100644 (file)
@@ -1,3 +1,9 @@
+Thu Jun 17 14:25:08 1999  Jeffrey A Law  (law@cygnus.com)
+
+       * loop.c (move_movables): Note issues with replacing REGs with
+       SUBREGs.
+       * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly.
+
 Thu Jun 17 13:28:30 1999  David O'Brien <obrien@FreeBSD.org>
 
        * i386/freebsd-elf.h (LINK_SPEC): Fix typo.
index 3c104a59fe75fa9b62760edc9bc582f7f58af20d..ed900962c4e434523e2261ad89b5171ef8934e3f 100644 (file)
@@ -2858,6 +2858,9 @@ typedef struct mips_args {
       GO_DEBUG_RTX (xinsn);                                            \
     }                                                                  \
                                                                        \
+  while (GET_CODE (xinsn) == SUBREG)                                   \
+    xinsn = SUBREG_REG (xinsn);                                                \
+                                                                       \
   /* The mips16 can only use the stack pointer as a base register when \
      loading SImode or DImode values.  */                              \
   if (GET_CODE (xinsn) == REG && REG_MODE_OK_FOR_BASE_P (xinsn, MODE)) \
@@ -2873,6 +2876,8 @@ typedef struct mips_args {
       register rtx xlow0 = XEXP (xinsn, 0);                            \
       register rtx xlow1 = XEXP (xinsn, 1);                            \
                                                                        \
+      while (GET_CODE (xlow0) == SUBREG)                               \
+       xlow0 = SUBREG_REG (xlow0);                                     \
       if (GET_CODE (xlow0) == REG                                      \
          && REG_MODE_OK_FOR_BASE_P (xlow0, MODE)                       \
          && mips_check_split (xlow1, MODE))                            \
@@ -2883,8 +2888,16 @@ typedef struct mips_args {
     {                                                                  \
       register rtx xplus0 = XEXP (xinsn, 0);                           \
       register rtx xplus1 = XEXP (xinsn, 1);                           \
-      register enum rtx_code code0 = GET_CODE (xplus0);                        \
-      register enum rtx_code code1 = GET_CODE (xplus1);                        \
+      register enum rtx_code code0;                                    \
+      register enum rtx_code code1;                                    \
+                                                                       \
+      while (GET_CODE (xplus0) == SUBREG)                              \
+       xplus0 = SUBREG_REG (xplus0);                                   \
+      code0 = GET_CODE (xplus0);                                       \
+                                                                       \
+      while (GET_CODE (xplus1) == SUBREG)                              \
+       xplus1 = SUBREG_REG (xplus1);                                   \
+      code1 = GET_CODE (xplus1);                                       \
                                                                        \
       /* The mips16 can only use the stack pointer as a base register  \
          when loading SImode or DImode values.  */                     \
index 6f0637fcf2024cd15daf51319ea7594ceb0e74f3..dcddba681b4ff5c40a99257282461eca7ad14695 100644 (file)
@@ -2170,7 +2170,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
                      /* Schedule the reg loaded by M1
                         for replacement so that shares the reg of M.
                         If the modes differ (only possible in restricted
-                        circumstances, make a SUBREG.  */
+                        circumstances, make a SUBREG.
+
+                        Note this assumes that the target dependent files
+                        treat REG and SUBREG equally, including within
+                        GO_IF_LEGITIMATE_ADDRESS and in all the
+                        predicates since we never verify that replacing the
+                        original register with a SUBREG results in a
+                        recognizable insn.  */
                      if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
                        reg_map[m1->regno] = m->set_dest;
                      else