aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-12-21 04:35:05 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-12-21 04:35:05 +0000
commita957d77fc36e52b459a42043b8ea9cadab574277 (patch)
treea5b050ff53d642560fe932ca38025f8052b40f6b
parent128ccfb078668575a6665eb889df77740dfc1bfa (diff)
downloadgcc-a957d77fc36e52b459a42043b8ea9cadab574277.zip
gcc-a957d77fc36e52b459a42043b8ea9cadab574277.tar.gz
gcc-a957d77fc36e52b459a42043b8ea9cadab574277.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/simplify-rtx.c19
2 files changed, 20 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aeb0ab4..40f7c77 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-12-20 Roger Sayle <roger@eyesopen.com>
+
+ * 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 <bje@au.ibm.com>
* config/spu/spu.c (spu_builtin_mul_widen_even): Remove unused
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 149ee6b..2199c63 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);