From dbf65c2f4ebc87d8cad5a805c9b56e0240390dd6 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Tue, 16 Jul 2002 20:13:35 +0000 Subject: * regrename.c (copy_value): Don't record high part copies. From-SVN: r55493 --- gcc/regrename.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'gcc/regrename.c') 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. */ -- cgit v1.1