From caf38dcaa735a5a7d606f309063c22c8e6cea2e2 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sat, 14 Nov 2009 17:43:22 +0100 Subject: [PATCH] predicates.md (call_register_no_elim_operand): New predicate. * 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. From-SVN: r154180 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/predicates.md | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50045a5bc252..efbcb8554430 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-11-14 Uros Bizjak + + * 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 Uros Bizjak PR target/41900 diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 5a81557c6392..0d2b54a794d7 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -517,6 +517,22 @@ 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" @@ -545,7 +561,7 @@ ;; 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. -- 2.47.2