diff options
author | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-23 21:51:16 +0000 |
---|---|---|
committer | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-23 21:51:16 +0000 |
commit | e76144f9de9fa236980d6e36a9e3c04b9fe2ce7d (patch) | |
tree | 6e88fe0134950aa4cc047f5a9e5be02f13167fdf /gcc | |
parent | 308d5709c3a9965b7cc7c17c7d5ac81c59f0d3a1 (diff) | |
download | ppe42-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sparc/predicates.md | 8 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 15 |
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; |