From: Roger Sayle Date: Thu, 21 Dec 2006 04:35:05 +0000 (+0000) Subject: simplify-rtx.c (simplify_subreg): Use the correct mode when determining whether a... X-Git-Tag: releases/gcc-4.3.0~7878 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a957d77fc36e52b459a42043b8ea9cadab574277;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aeb0ab4bbc9e..40f7c77cbcac 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 149ee6b652e7..2199c634b83d 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);