aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1999-06-17 13:29:11 +0000
committerJeff Law <law@gcc.gnu.org>1999-06-17 07:29:11 -0600
commit51f0646f8a46b03d0fd01c79daf82a9ae5a2fceb (patch)
tree399c423c555ce3ac267265c912e79063686f2837
parent048f60dcb1e7663c2fcd5e1d5f0aaad621e786c4 (diff)
downloadgcc-51f0646f8a46b03d0fd01c79daf82a9ae5a2fceb.zip
gcc-51f0646f8a46b03d0fd01c79daf82a9ae5a2fceb.tar.gz
gcc-51f0646f8a46b03d0fd01c79daf82a9ae5a2fceb.tar.bz2
loop.c (move_movables): Note issues with replacing REGs with SUBREGs.
� * loop.c (move_movables): Note issues with replacing REGs with SUBREGs. * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly. From-SVN: r27573
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/mips/mips.h17
-rw-r--r--gcc/loop.c9
3 files changed, 29 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e09ddfe..dabee24 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Thu Jun 17 14:25:08 1999 Jeffrey A Law (law@cygnus.com)
+
+ * loop.c (move_movables): Note issues with replacing REGs with
+ SUBREGs.
+ * mips.h (GO_IF_LEGITIMATE_ADDRESS): Handle SUBREGs properly.
+
Thu Jun 17 13:28:30 1999 David O'Brien <obrien@FreeBSD.org>
* i386/freebsd-elf.h (LINK_SPEC): Fix typo.
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 3c104a5..ed90096 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -2858,6 +2858,9 @@ typedef struct mips_args {
GO_DEBUG_RTX (xinsn); \
} \
\
+ while (GET_CODE (xinsn) == SUBREG) \
+ xinsn = SUBREG_REG (xinsn); \
+ \
/* The mips16 can only use the stack pointer as a base register when \
loading SImode or DImode values. */ \
if (GET_CODE (xinsn) == REG && REG_MODE_OK_FOR_BASE_P (xinsn, MODE)) \
@@ -2873,6 +2876,8 @@ typedef struct mips_args {
register rtx xlow0 = XEXP (xinsn, 0); \
register rtx xlow1 = XEXP (xinsn, 1); \
\
+ while (GET_CODE (xlow0) == SUBREG) \
+ xlow0 = SUBREG_REG (xlow0); \
if (GET_CODE (xlow0) == REG \
&& REG_MODE_OK_FOR_BASE_P (xlow0, MODE) \
&& mips_check_split (xlow1, MODE)) \
@@ -2883,8 +2888,16 @@ typedef struct mips_args {
{ \
register rtx xplus0 = XEXP (xinsn, 0); \
register rtx xplus1 = XEXP (xinsn, 1); \
- register enum rtx_code code0 = GET_CODE (xplus0); \
- register enum rtx_code code1 = GET_CODE (xplus1); \
+ register enum rtx_code code0; \
+ register enum rtx_code code1; \
+ \
+ while (GET_CODE (xplus0) == SUBREG) \
+ xplus0 = SUBREG_REG (xplus0); \
+ code0 = GET_CODE (xplus0); \
+ \
+ while (GET_CODE (xplus1) == SUBREG) \
+ xplus1 = SUBREG_REG (xplus1); \
+ code1 = GET_CODE (xplus1); \
\
/* The mips16 can only use the stack pointer as a base register \
when loading SImode or DImode values. */ \
diff --git a/gcc/loop.c b/gcc/loop.c
index 6f0637f..dcddba6 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -2170,7 +2170,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
/* Schedule the reg loaded by M1
for replacement so that shares the reg of M.
If the modes differ (only possible in restricted
- circumstances, make a SUBREG. */
+ circumstances, make a SUBREG.
+
+ Note this assumes that the target dependent files
+ treat REG and SUBREG equally, including within
+ GO_IF_LEGITIMATE_ADDRESS and in all the
+ predicates since we never verify that replacing the
+ original register with a SUBREG results in a
+ recognizable insn. */
if (GET_MODE (m->set_dest) == GET_MODE (m1->set_dest))
reg_map[m1->regno] = m->set_dest;
else