diff options
author | J"orn Rennecke <joern.rennecke@superh.com> | 2002-07-16 20:13:35 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2002-07-16 21:13:35 +0100 |
commit | dbf65c2f4ebc87d8cad5a805c9b56e0240390dd6 (patch) | |
tree | 0654a0eaf2c78a4f25b1a9a8b0ae119b3f56c05f /gcc | |
parent | 99b823ca2a6525632027b5fb489951478430edbe (diff) | |
download | gcc-dbf65c2f4ebc87d8cad5a805c9b56e0240390dd6.zip gcc-dbf65c2f4ebc87d8cad5a805c9b56e0240390dd6.tar.gz gcc-dbf65c2f4ebc87d8cad5a805c9b56e0240390dd6.tar.bz2 |
* regrename.c (copy_value): Don't record high part copies.
From-SVN: r55493
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/regrename.c | 20 |
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e36fdc3..eecf797 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Tue Jul 16 19:32:58 2002 J"orn Rennecke <joern.rennecke@superh.com> + + * regrename.c (copy_value): Don't record high part copies. + 2002-07-16 Steve Ellcey <sje@cup.hp.com> * gcc/config/pa/long_double.h (FIXUNS_TRUNCTFDI2_LIBCALL): New define. diff --git a/gcc/regrename.c b/gcc/regrename.c index 532d575..0ceab76 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -1268,6 +1268,26 @@ copy_value (dest, src, vd) if (vd->e[sr].mode == VOIDmode) set_value_regno (sr, vd->e[dr].mode, vd); + /* If we are narrowing the the input to a smaller number of hard regs, + and it is in big endian, we are really extracting a high part. + Since we generally associate a low part of a value with the value itself, + we must not do the same for the high part. + Note we can still get low parts for the same mode combination through + a two-step copy involving differently sized hard regs. + Assume hard regs fr* are 32 bits bits each, while r* are 64 bits each: + (set (reg:DI r0) (reg:DI fr0)) + (set (reg:SI fr2) (reg:SI r0)) + loads the low part of (reg:DI fr0) - i.e. fr1 - into fr2, while: + (set (reg:SI fr2) (reg:SI fr0)) + loads the high part of (reg:DI fr0) into fr2. + + We can't properly represent the latter case in our tables, so don't + record anything then. */ + else if (sn < (unsigned int) HARD_REGNO_NREGS (sr, vd->e[sr].mode) + && (GET_MODE_SIZE (vd->e[sr].mode) > UNITS_PER_WORD + ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN)) + return; + /* If SRC had been assigned a mode narrower than the copy, we can't link DEST into the chain, because not all of the pieces of the copy came from oldest_regno. */ |