diff options
author | Richard Henderson <rth@cygnus.com> | 1999-09-13 15:22:48 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-09-13 15:22:48 -0700 |
commit | 28d52ffb6d738d6f92db2abc6d6d171473206cd4 (patch) | |
tree | bd5e50ca077aa2a17cd0c36f8a538b6d4dc19c5a /gcc | |
parent | 06b8b73051f29a32542ddc23dcc92dc94a4a7339 (diff) | |
download | gcc-28d52ffb6d738d6f92db2abc6d6d171473206cd4.zip gcc-28d52ffb6d738d6f92db2abc6d6d171473206cd4.tar.gz gcc-28d52ffb6d738d6f92db2abc6d6d171473206cd4.tar.bz2 |
i386.c (call_insn_operand): Reject const_int.
* i386.c (call_insn_operand): Reject const_int.
(expander_call_insn_operand): Use call_insn_operand.
From-SVN: r29385
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 36 |
2 files changed, 18 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bdf5bb6..38f5718 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Mon Sep 13 15:21:46 1999 Richard Henderson <rth@cygnus.com> + + * i386.c (call_insn_operand): Reject const_int. + (expander_call_insn_operand): Use call_insn_operand. + Mon Sep 13 17:44:28 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * gcc.c (getrusage): Wrap prototype arguments in PROTO(). diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 38ef20e..3042df6 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -931,10 +931,9 @@ pic_symbolic_operand (op, mode) return 0; } -/* Test for a valid operand for a call instruction. - Don't allow the arg pointer register or virtual regs - since they may change into reg + const, which the patterns - can't handle yet. */ +/* Test for a valid operand for a call instruction. Don't allow the + arg pointer register or virtual regs since they may decay into + reg + const, which the patterns can't handle. */ int call_insn_operand (op, mode) @@ -953,36 +952,27 @@ call_insn_operand (op, mode) && REGNO (op) <= LAST_VIRTUAL_REGISTER))) return 0; + /* Disallow `call 1234'. Due to varying assembler lameness this + gets either rejected or translated to `call .+1234'. */ + if (GET_CODE (op) == CONST_INT) + return 0; + /* Otherwise we can allow any general_operand in the address. */ return general_operand (op, Pmode); } -/* Like call_insn_operand but allow (mem (symbol_ref ...)) - even if pic. */ +/* Like call_insn_operand but allow (mem (symbol_ref ...)) even if pic. */ int expander_call_insn_operand (op, mode) rtx op; - enum machine_mode mode ATTRIBUTE_UNUSED; + enum machine_mode mode; { - if (GET_CODE (op) != MEM) - return 0; - op = XEXP (op, 0); - - /* Direct symbol references. */ - if (CONSTANT_ADDRESS_P (op)) + if (GET_CODE (op) == MEM + && GET_CODE (XEXP (op, 0)) == SYMBOL_REF) return 1; - /* Disallow indirect through a virtual register. This leads to - compiler aborts when trying to eliminate them. */ - if (GET_CODE (op) == REG - && (op == arg_pointer_rtx - || (REGNO (op) >= FIRST_PSEUDO_REGISTER - && REGNO (op) <= LAST_VIRTUAL_REGISTER))) - return 0; - - /* Otherwise we can allow any general_operand in the address. */ - return general_operand (op, mode); + return call_insn_operand (op, mode); } int |