OSDN Git Service

* config/i386/predicates.md (call_register_no_elim_operand):
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Nov 2009 14:31:13 +0000 (14:31 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Nov 2009 14:31:13 +0000 (14:31 +0000)
New predicate.  Reject stack register as valid call operand
for 32bit targets.
(call_insn_operand): Use call_register_no_elim_operand.

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

gcc/ChangeLog
gcc/config/i386/predicates.md

index 22640fa..ed5f059 100644 (file)
@@ -1,3 +1,10 @@
+2009-11-14  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/predicates.md (call_register_no_elim_operand):
+       New predicate.  Reject stack register as valid call operand
+       for 32bit targets.
+       (call_insn_operand): Use call_register_no_elim_operand.
+
 2009-11-13  Richard Henderson  <rth@redhat.com>
 
        * function.c (stack_protect_prologue): Don't bypass expand_expr
index b21e895..3ade8f5 100644 (file)
                        FIRST_PSEUDO_REGISTER, LAST_VIRTUAL_REGISTER));
 })
 
+;; P6 processors will jump to the address after the decrement when %esp
+;; is used as a call operand, so they will execute return address as a code.
+;; See Pentium Pro errata 70, Pentium 2 errata A33 and Pentium 3 errata E17.
+
+(define_predicate "call_register_no_elim_operand"
+  (match_operand 0 "register_operand")
+{
+  if (GET_CODE (op) == SUBREG)
+    op = SUBREG_REG (op);
+
+  if (!TARGET_64BIT && op == stack_pointer_rtx)
+    return 0;
+
+  return register_no_elim_operand (op, mode);
+})
+
 ;; Similarly, but include the stack pointer.  This is used to prevent esp
 ;; from being used as an index reg.
 (define_predicate "index_register_operand"
 ;; Test for a valid operand for a call instruction.
 (define_predicate "call_insn_operand"
   (ior (match_operand 0 "constant_call_address_operand")
-       (ior (match_operand 0 "index_register_operand")
+       (ior (match_operand 0 "call_register_no_elim_operand")
            (match_operand 0 "memory_operand"))))
 
 ;; Similarly, but for tail calls, in which we cannot allow memory references.