aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2003-10-06 15:56:07 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2003-10-06 15:56:07 +0000
commit6357135a0e6e8d95d05b370f15e6daff39d7dfee (patch)
treec18ad9ed7b7463770d1ceca5a1b5e735e8be8eba /gcc/reload.c
parentfffeb871a114219c8aa729064632af142b1bf6c6 (diff)
downloadgcc-6357135a0e6e8d95d05b370f15e6daff39d7dfee.zip
gcc-6357135a0e6e8d95d05b370f15e6daff39d7dfee.tar.gz
gcc-6357135a0e6e8d95d05b370f15e6daff39d7dfee.tar.bz2
reload.c (find_reloads_subreg_address): Use correct offset for paradoxical MEM subregs on big-endian targets.
* reload.c (find_reloads_subreg_address): Use correct offset for paradoxical MEM subregs on big-endian targets. From-SVN: r72153
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index dc088730..59852ba 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -5806,9 +5806,16 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
if (force_replace
|| ! rtx_equal_p (tem, reg_equiv_mem[regno]))
{
- int offset = SUBREG_BYTE (x);
unsigned outer_size = GET_MODE_SIZE (GET_MODE (x));
unsigned inner_size = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)));
+ int offset;
+
+ /* For big-endian paradoxical subregs, SUBREG_BYTE does not
+ hold the correct (negative) byte offset. */
+ if (BYTES_BIG_ENDIAN && outer_size > inner_size)
+ offset = inner_size - outer_size;
+ else
+ offset = SUBREG_BYTE (x);
XEXP (tem, 0) = plus_constant (XEXP (tem, 0), offset);
PUT_MODE (tem, GET_MODE (x));