aboutsummaryrefslogtreecommitdiff
path: root/gcc/sched-deps.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2005-04-26 04:11:56 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2005-04-26 04:11:56 +0000
commitc3bdeea8f3a629555c7de26b2f49079b01b7a6fc (patch)
tree750c0c54709164debb5d4dcac47541a1e6d2b318 /gcc/sched-deps.c
parent21dad7e6b95a0b777b1b4f7d6c57e8813bd733f0 (diff)
downloadgcc-c3bdeea8f3a629555c7de26b2f49079b01b7a6fc.zip
gcc-c3bdeea8f3a629555c7de26b2f49079b01b7a6fc.tar.gz
gcc-c3bdeea8f3a629555c7de26b2f49079b01b7a6fc.tar.bz2
sched-deps.c (sched_analyze_1): On STACK_REGS targets...
* sched-deps.c (sched_analyze_1): On STACK_REGS targets, x87, treat all writes to any stack register as a read/write dependency on FIRST_STACK_REG. (sched_analyze_2): Likewise, for reads from any stack register. From-SVN: r98762
Diffstat (limited to 'gcc/sched-deps.c')
-rw-r--r--gcc/sched-deps.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 933d74d..6b54fc8 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -534,6 +534,15 @@ sched_analyze_1 (struct deps *deps, rtx x, rtx insn)
{
regno = REGNO (dest);
+#ifdef STACK_REGS
+ /* Treat all writes to a stack register as modifying the TOS. */
+ if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
+ {
+ SET_REGNO_REG_SET (reg_pending_uses, FIRST_STACK_REG);
+ regno = FIRST_STACK_REG;
+ }
+#endif
+
/* A hard reg in a wide mode may really be multiple registers.
If so, mark all of them just like the first. */
if (regno < FIRST_PSEUDO_REGISTER)
@@ -684,6 +693,16 @@ sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
case REG:
{
int regno = REGNO (x);
+
+#ifdef STACK_REGS
+ /* Treat all reads of a stack register as modifying the TOS. */
+ if (regno >= FIRST_STACK_REG && regno <= LAST_STACK_REG)
+ {
+ SET_REGNO_REG_SET (reg_pending_sets, FIRST_STACK_REG);
+ regno = FIRST_STACK_REG;
+ }
+#endif
+
if (regno < FIRST_PSEUDO_REGISTER)
{
int i = hard_regno_nregs[regno][GET_MODE (x)];