mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-18 15:09:37 +08:00
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
This commit is contained in:
parent
0e902d98ae
commit
eab2120d5e
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user