aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@superh.com>2002-07-22 14:29:28 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2002-07-22 15:29:28 +0100
commiteab2120d5efebd6b7c29730692ff165b471b7eac (patch)
treee276a9a3f88aafec442b7f818b014c0df9cf4b90 /gcc
parent0e902d98aee5f7d4f4ac9baf639d2fad0eaa848e (diff)
downloadgcc-eab2120d5efebd6b7c29730692ff165b471b7eac.zip
gcc-eab2120d5efebd6b7c29730692ff165b471b7eac.tar.gz
gcc-eab2120d5efebd6b7c29730692ff165b471b7eac.tar.bz2
rtlanal.c (subreg_regno_offset): Return correct offset for big endian paradoxical subregs.
* rtlanal.c (subreg_regno_offset): Return correct offset for big endian paradoxical subregs. From-SVN: r55650
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/rtlanal.c10
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1f413bb..398ce73 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,7 @@
-Mon Jul 22 15:21:41 2002 J"orn Rennecke <joern.rennecke@superh.com>
+Mon Jul 22 15:27:25 2002 J"orn Rennecke <joern.rennecke@superh.com>
+
+ * rtlanal.c (subreg_regno_offset): Return correct offset for
+ big endian paradoxical subregs.
* optabs.c (expand_vector_unop): Don't expand using sub_optab
if we got the wrong mode.
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index de7efae..c1fdb76 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -3117,6 +3117,16 @@ subreg_regno_offset (xregno, xmode, offset, ymode)
nregs_xmode = HARD_REGNO_NREGS (xregno, xmode);
nregs_ymode = HARD_REGNO_NREGS (xregno, ymode);
+
+ /* If this is a big endian paradoxical subreg, which uses more actual
+ hard registers than the original register, we must return a negative
+ offset so that we find the proper highpart of the register. */
+ if (offset == 0
+ && nregs_ymode > nregs_xmode
+ && (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
+ ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN))
+ return nregs_xmode - nregs_ymode;
+
if (offset == 0 || nregs_xmode == nregs_ymode)
return 0;