OSDN Git Service

Jan Hubicka <hubicka@freesoft.cz>
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Apr 1999 14:50:49 +0000 (14:50 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Apr 1999 14:50:49 +0000 (14:50 +0000)
        * i386.c (agi_dependent): Handle push operation more correctly.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26412 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c

index 396fd7d..57a1825 100644 (file)
@@ -1,3 +1,7 @@
+Tue Apr 13 14:49:13 1999  Jan Hubicka <hubicka@freesoft.cz>
+
+       * i386.c (agi_dependent): Handle push operation more correctly.
+
 Tue Apr 13 14:45:17 1999  Jan Hubicka <hubicka@freesoft.cz>
 
        * i386.md (anddi3): Add % constraint.
index ab54235..e6f807b 100644 (file)
@@ -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;
 }