From 28d52ffb6d738d6f92db2abc6d6d171473206cd4 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 13 Sep 1999 15:22:48 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/config/i386/i386.c | 36 +++++++++++++----------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bdf5bb67deb..38f57182062 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Mon Sep 13 15:21:46 1999 Richard Henderson + + * 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 * gcc.c (getrusage): Wrap prototype arguments in PROTO(). diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 38ef20ea0a5..3042df60bed 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