Jan Hubicka <hubicka@freesoft.cz>
authorJan Hubicka <hubicka@freesoft.cz>
Tue, 13 Apr 1999 14:50:49 +0000 (16:50 +0200)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 13 Apr 1999 14:50:49 +0000 (07:50 -0700)
Jan Hubicka <hubicka@freesoft.cz>
        * i386.c (agi_dependent): Handle push operation more correctly.

From-SVN: r26412

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

index 396fd7d280a719f3c5a6cc549b4becbd4d170e89..57a182508250a32e4406fd5fa7ac8976099203bd 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 ab5423555067d66ee0a5dd4fb3d909bcde9b1905..e6f807bc781b0f433a35118fb28859cace2d410c 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;
 }