From 9e071d06dfb8dbd1e2f76f26c918bce0a1e5fb9e Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 5 Aug 2008 13:53:20 +0000 Subject: [PATCH] spu.h (CANNOT_CHANGE_MODE_CLASS): Allow (multi)word-sized SUBREG of multi-word hard register. * config/spu/spu.h (CANNOT_CHANGE_MODE_CLASS): Allow (multi)word-sized SUBREG of multi-word hard register. * config/spu/spu.c (valid_subreg): Likewise. (adjust_operand): Handle SUBREGs of multi-word hard registers. From-SVN: r138711 --- gcc/ChangeLog | 7 +++++++ gcc/config/spu/spu.c | 9 ++++++--- gcc/config/spu/spu.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 02ca43300fa1..10385d926f89 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-08-05 Ulrich Weigand + + * config/spu/spu.h (CANNOT_CHANGE_MODE_CLASS): Allow (multi)word-sized + SUBREG of multi-word hard register. + * config/spu/spu.c (valid_subreg): Likewise. + (adjust_operand): Handle SUBREGs of multi-word hard registers. + 2008-08-04 Richard Guenther * tree-ssa-loop-ivopts.c (add_iv_value_candidates): Also add diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 83bd9f51315c..b40d12c01496 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -419,7 +419,8 @@ valid_subreg (rtx op) enum machine_mode im = GET_MODE (SUBREG_REG (op)); return om != VOIDmode && im != VOIDmode && (GET_MODE_SIZE (im) == GET_MODE_SIZE (om) - || (GET_MODE_SIZE (im) <= 4 && GET_MODE_SIZE (om) <= 4)); + || (GET_MODE_SIZE (im) <= 4 && GET_MODE_SIZE (om) <= 4) + || (GET_MODE_SIZE (im) >= 16 && GET_MODE_SIZE (om) >= 16)); } /* When insv and ext[sz]v ar passed a TI SUBREG, we want to strip it off @@ -429,8 +430,10 @@ adjust_operand (rtx op, HOST_WIDE_INT * start) { enum machine_mode mode; int op_size; - /* Strip any SUBREG */ - if (GET_CODE (op) == SUBREG) + /* Strip any paradoxical SUBREG. */ + if (GET_CODE (op) == SUBREG + && (GET_MODE_BITSIZE (GET_MODE (op)) + > GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op))))) { if (start) *start -= diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h index 729e0d707a8c..4180c4e46384 100644 --- a/gcc/config/spu/spu.h +++ b/gcc/config/spu/spu.h @@ -263,6 +263,7 @@ enum reg_class { only true for SPU. */ #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ ((GET_MODE_SIZE (FROM) > 4 || GET_MODE_SIZE (TO) > 4) \ + && (GET_MODE_SIZE (FROM) < 16 || GET_MODE_SIZE (TO) < 16) \ && GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)) #define REGISTER_TARGET_PRAGMAS() do { \ -- 2.47.2