OSDN Git Service

PR target/26459
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Mar 2006 01:25:35 +0000 (01:25 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Mar 2006 01:25:35 +0000 (01:25 +0000)
* config/rs6000/rs6000.h (CANNOT_CHANGE_MODE_CLASS): Limit 2003-12-08
change to FLOAT_REGS.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112561 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rs6000/rs6000.h

index 43acab7..706f592 100644 (file)
@@ -1,5 +1,9 @@
 2006-03-31  Alan Modra  <amodra@bigpond.net.au>
 
+       PR target/26459
+       * config/rs6000/rs6000.h (CANNOT_CHANGE_MODE_CLASS): Limit 2003-12-08
+       change to FLOAT_REGS.
+
        * config/rs6000/rs6000.c (rs6000_explicit_options): Add ieee.
        (rs6000_override_options): Use it.
        (rs6000_handle_option): Set it.  Set rs6000_explicit_options.abi
index b31d437..75ff4a6 100644 (file)
@@ -1112,22 +1112,19 @@ enum reg_class
   ? 1                                                                   \
   : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
 
-
-/* Return a class of registers that cannot change FROM mode to TO mode.  */
-
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)                        \
-  (!TARGET_IEEEQUAD                                                      \
-   && GET_MODE_SIZE (FROM) >= 8 && GET_MODE_SIZE (TO) >= 8               \
-   ? 0                                                                   \
-   : GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                                  \
-   ? reg_classes_intersect_p (FLOAT_REGS, CLASS)                         \
-   : (TARGET_E500_DOUBLE && (((TO) == DFmode) + ((FROM) == DFmode)) == 1) \
-   ? reg_classes_intersect_p (GENERAL_REGS, CLASS)                       \
-   : (TARGET_E500_DOUBLE && (((TO) == DImode) + ((FROM) == DImode)) == 1) \
-   ? reg_classes_intersect_p (GENERAL_REGS, CLASS)                       \
-   : (TARGET_SPE && (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1) \
-   ? reg_classes_intersect_p (GENERAL_REGS, CLASS)                       \
-   : 0)
+/* Return nonzero if for CLASS a mode change from FROM to TO is invalid.  */
+
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)                      \
+  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                          \
+   ? ((GET_MODE_SIZE (FROM) < 8 || GET_MODE_SIZE (TO) < 8              \
+       || TARGET_IEEEQUAD)                                             \
+      && reg_classes_intersect_p (FLOAT_REGS, CLASS))                  \
+   : (((TARGET_E500_DOUBLE                                             \
+       && ((((TO) == DFmode) + ((FROM) == DFmode)) == 1                \
+           || (((TO) == DImode) + ((FROM) == DImode)) == 1))           \
+       || (TARGET_SPE                                                  \
+          && (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1))    \
+      && reg_classes_intersect_p (GENERAL_REGS, CLASS)))
 
 /* Stack layout; function entry, exit and calling.  */