diff options
Diffstat (limited to 'gcc/config/spu/spu.c')
-rw-r--r-- | gcc/config/spu/spu.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 83bd9f51315..b40d12c0149 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 -= |