]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix sparc so that reload doesn't try to load non-trivial vector consts directly.
authorDavid S. Miller <davem@davemloft.net>
Sun, 23 Oct 2011 21:51:16 +0000 (21:51 +0000)
committerDavid S. Miller <davem@gcc.gnu.org>
Sun, 23 Oct 2011 21:51:16 +0000 (14:51 -0700)
* config/sparc/predicates.md (input_operand): Disallow vector
constants other than 0 and -1.
* config/sparc/sparc.c (sparc_preferred_reload_class): Return
NO_REGS for vector constants other than 0 and -1.

From-SVN: r180351

gcc/ChangeLog
gcc/config/sparc/predicates.md
gcc/config/sparc/sparc.c

index e647a6037cc5c1c2dab69d5f6c449048c25bd4b0..3dc4ba9bd749f85d819f9cf51e4678688108b396 100644 (file)
@@ -1,5 +1,10 @@
 2011-10-23  David S. Miller  <davem@davemloft.net>
 
+       * config/sparc/predicates.md (input_operand): Disallow vector
+       constants other than 0 and -1.
+       * config/sparc/sparc.c (sparc_preferred_reload_class): Return
+       NO_REGS for vector constants other than 0 and -1.
+
        * config/sparc/sparc.h (SPARC_FIRST_INT_REG, SPARC_LAST_INT_REG,
        SPARC_INT_REG_P): Define.
        (HARD_REGNO_NREGS): Use SPARC_INT_REG_P.
index f0be14997afcc3bf8b724664fe1984e7016c642e..4dd734f047e3a5958a9ff177814650b9bca1995f 100644 (file)
       && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
     return true;
 
-  if ((mclass == MODE_FLOAT && GET_CODE (op) == CONST_DOUBLE)
-      || (mclass == MODE_VECTOR_INT && GET_CODE (op) == CONST_VECTOR))
+  if (mclass == MODE_FLOAT && GET_CODE (op) == CONST_DOUBLE)
+    return true;
+
+  if (mclass == MODE_VECTOR_INT && GET_CODE (op) == CONST_VECTOR
+      && (const_zero_operand (op, mode)
+          || const_all_ones_operand (op, mode)))
     return true;
 
   if (register_operand (op, mode))
index 415ece8c647ec06f705906b28fbc6872da54866f..df0d825dbc486d662e5e56bf6b802d9ddeaa8a10 100644 (file)
@@ -11116,17 +11116,26 @@ sparc_conditional_register_usage (void)
 static reg_class_t
 sparc_preferred_reload_class (rtx x, reg_class_t rclass)
 {
+  enum machine_mode mode = GET_MODE (x);
   if (CONSTANT_P (x))
     {
       if (FP_REG_CLASS_P (rclass)
          || rclass == GENERAL_OR_FP_REGS
          || rclass == GENERAL_OR_EXTRA_FP_REGS
-         || (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT && ! TARGET_FPU)
-         || (GET_MODE (x) == TFmode && ! const_zero_operand (x, TFmode)))
+         || (GET_MODE_CLASS (mode) == MODE_FLOAT && ! TARGET_FPU)
+         || (mode == TFmode && ! const_zero_operand (x, mode)))
        return NO_REGS;
 
-      if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
+      if (GET_MODE_CLASS (mode) == MODE_INT)
        return GENERAL_REGS;
+
+      if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
+       {
+         if (! FP_REG_CLASS_P (rclass)
+             || !(const_zero_operand (x, mode)
+                  || const_all_ones_operand (x, mode)))
+           return NO_REGS;
+       }
     }
 
   return rclass;