From dca52d8026885a3bfa6e67859a36b453bb41ead7 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Thu, 31 Dec 1992 14:31:24 -0800 Subject: [PATCH] (operands_match_p): For WORDS_BIG_ENDIAN machines, make multiple register operands equivalent if the last register of the groups are the same. (subst_reloads): Use gen_lowpart_common to change mode of reloadreg. From-SVN: r3030 --- gcc/reload.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/reload.c b/gcc/reload.c index 7757dd7f0454..1b98a42854d5 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -1592,6 +1592,16 @@ operands_match_p (x, y) else j = REGNO (y); + /* On a WORDS_BIG_ENDIAN machine, point to the last register of a + multiple hard register group, so that for example (reg:DI 0) and + (reg:SI 1) will be considered the same register. */ + if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD + && i < FIRST_PSEUDO_REGISTER) + i += (GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD) - 1; + if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (y)) > UNITS_PER_WORD + && j < FIRST_PSEUDO_REGISTER) + j += (GET_MODE_SIZE (GET_MODE (y)) / UNITS_PER_WORD) - 1; + return i == j; } /* If two operands must match, because they are really a single @@ -4348,7 +4358,7 @@ subst_reloads () /* Encapsulate RELOADREG so its machine mode matches what used to be there. */ if (GET_MODE (reloadreg) != r->mode && r->mode != VOIDmode) - reloadreg = gen_rtx (REG, r->mode, REGNO (reloadreg)); + reloadreg = gen_lowpart_common (r->mode, reloadreg); /* If we are putting this into a SUBREG and RELOADREG is a SUBREG, we would be making nested SUBREGs, so we have to fix -- 2.43.5