diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-12-21 04:35:05 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-12-21 04:35:05 +0000 |
commit | a957d77fc36e52b459a42043b8ea9cadab574277 (patch) | |
tree | a5b050ff53d642560fe932ca38025f8052b40f6b /gcc/simplify-rtx.c | |
parent | 128ccfb078668575a6665eb889df77740dfc1bfa (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 19 |
1 files changed, 14 insertions, 5 deletions
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); |