summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-23 21:51:16 +0000
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-23 21:51:16 +0000
commite76144f9de9fa236980d6e36a9e3c04b9fe2ce7d (patch)
tree6e88fe0134950aa4cc047f5a9e5be02f13167fdf /gcc
parent308d5709c3a9965b7cc7c17c7d5ac81c59f0d3a1 (diff)
downloadppe42-gcc-e76144f9de9fa236980d6e36a9e3c04b9fe2ce7d.tar.gz
ppe42-gcc-e76144f9de9fa236980d6e36a9e3c04b9fe2ce7d.zip
Fix sparc so that reload doesn't try to load non-trivial vector consts directly.
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180351 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/sparc/predicates.md8
-rw-r--r--gcc/config/sparc/sparc.c15
3 files changed, 23 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e647a6037cc..3dc4ba9bd74 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/sparc/predicates.md b/gcc/config/sparc/predicates.md
index f0be14997af..4dd734f047e 100644
--- a/gcc/config/sparc/predicates.md
+++ b/gcc/config/sparc/predicates.md
@@ -427,8 +427,12 @@
&& (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))
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 415ece8c647..df0d825dbc4 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -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;
OpenPOWER on IntegriCloud