summaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-02 01:56:17 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-02 01:56:17 +0000
commitf31c6cbf8af08b5e6ede02c4080f36aac962e162 (patch)
tree922ce3c162ba7fe51d2e1c2fb79adbdb13372e37 /gcc/final.c
parentcfff67e27f79bd39593fe5c99f3bb58161c1267c (diff)
downloadgcc-f31c6cbf8af08b5e6ede02c4080f36aac962e162.tar.gz
* final.c (alter_subreg): Allow the target to hook by-mode subreg
hard register number changes. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@18946 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/final.c b/gcc/final.c
index 74a6d15d743..6b851f20be7 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2891,9 +2891,20 @@ alter_subreg (x)
if (GET_CODE (y) == REG)
{
- /* If the containing reg really gets a hard reg, so do we. */
+ /* If the word size is larger than the size of this register,
+ adjust the register number to compensate. */
+ /* ??? Note that this just catches stragglers created by/for
+ integrate. It would be better if we either caught these
+ earlier, or kept _all_ subregs until now and eliminate
+ gen_lowpart and friends. */
+
PUT_CODE (x, REG);
+#ifdef ALTER_HARD_SUBREG
+ REGNO (x) = ALTER_HARD_SUBREG(GET_MODE (x), SUBREG_WORD (x),
+ GET_MODE (y), REGNO (y));
+#else
REGNO (x) = REGNO (y) + SUBREG_WORD (x);
+#endif
}
else if (GET_CODE (y) == MEM)
{