From b985a30f322f6e5d744e1b70a6d83e238543d652 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 13 Apr 1999 16:50:49 +0200 Subject: [PATCH] Jan Hubicka Jan Hubicka * i386.c (agi_dependent): Handle push operation more correctly. From-SVN: r26412 --- gcc/ChangeLog | 4 ++++ gcc/config/i386/i386.c | 26 +++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 396fd7d280a..57a18250825 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Tue Apr 13 14:49:13 1999 Jan Hubicka + + * i386.c (agi_dependent): Handle push operation more correctly. + Tue Apr 13 14:45:17 1999 Jan Hubicka * i386.md (anddi3): Add % constraint. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ab542355506..e6f807bc781 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5037,16 +5037,36 @@ int agi_dependent (insn, dep_insn) rtx insn, dep_insn; { + int push = 0, push_dep = 0; if (GET_CODE (dep_insn) == INSN && GET_CODE (PATTERN (dep_insn)) == SET - && GET_CODE (SET_DEST (PATTERN (dep_insn))) == REG) - return reg_mentioned_in_mem (SET_DEST (PATTERN (dep_insn)), insn); + && GET_CODE (SET_DEST (PATTERN (dep_insn))) == REG + && reg_mentioned_in_mem (SET_DEST (PATTERN (dep_insn)), insn)) + return 1; + + if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SET + && GET_CODE (SET_DEST (PATTERN (insn))) == MEM + && push_operand (SET_DEST (PATTERN (insn)), + GET_MODE (SET_DEST (PATTERN (insn))))) + push = 1; if (GET_CODE (dep_insn) == INSN && GET_CODE (PATTERN (dep_insn)) == SET && GET_CODE (SET_DEST (PATTERN (dep_insn))) == MEM && push_operand (SET_DEST (PATTERN (dep_insn)), GET_MODE (SET_DEST (PATTERN (dep_insn))))) - return reg_mentioned_in_mem (stack_pointer_rtx, insn); + push_dep = 1; + + /* CPUs contain special hardware to allow two pushes. */ + if (push && push_dep) + return 0; + + /* Push operation implicitly change stack pointer causing AGI stalls. */ + if (push_dep && reg_mentioned_in_mem (stack_pointer_rtx, insn)) + return 1; + + /* Push also implicitly read stack pointer. */ + if (push && modified_in_p (stack_pointer_rtx, dep_insn)) + return 1; return 0; }