From a957d77fc36e52b459a42043b8ea9cadab574277 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 21 Dec 2006 04:35:05 +0000 Subject: [PATCH] simplify-rtx.c (simplify_subreg): Use the correct mode when determining whether a SUBREG of a CONCAT refers to... * simplify-rtx.c (simplify_subreg): Use the correct mode when determining whether a SUBREG of a CONCAT refers to the first or second component. From-SVN: r120101 --- gcc/ChangeLog | 6 ++++++ gcc/simplify-rtx.c | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aeb0ab4bbc9..40f7c77cbca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-12-20 Roger Sayle + + * simplify-rtx.c (simplify_subreg): Use the correct mode when + determining whether a SUBREG of a CONCAT refers to the first or + second component. + 2006-12-21 Ben Elliston * config/spu/spu.c (spu_builtin_mul_widen_even): Remove unused diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 149ee6b652e..2199c634b83 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -4648,13 +4648,22 @@ simplify_subreg (enum machine_mode outermode, rtx op, of real and imaginary part. */ if (GET_CODE (op) == CONCAT) { - unsigned int inner_size, final_offset; + unsigned int part_size, final_offset; rtx part, res; - inner_size = GET_MODE_UNIT_SIZE (innermode); - part = byte < inner_size ? XEXP (op, 0) : XEXP (op, 1); - final_offset = byte % inner_size; - if (final_offset + GET_MODE_SIZE (outermode) > inner_size) + part_size = GET_MODE_UNIT_SIZE (GET_MODE (XEXP (op, 0))); + if (byte < part_size) + { + part = XEXP (op, 0); + final_offset = byte; + } + else + { + part = XEXP (op, 1); + final_offset = byte - part_size; + } + + if (final_offset + GET_MODE_SIZE (outermode) > part_size) return NULL_RTX; res = simplify_subreg (outermode, part, GET_MODE (part), final_offset);