aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-09-13 15:22:48 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-09-13 15:22:48 -0700
commit28d52ffb6d738d6f92db2abc6d6d171473206cd4 (patch)
treebd5e50ca077aa2a17cd0c36f8a538b6d4dc19c5a /gcc
parent06b8b73051f29a32542ddc23dcc92dc94a4a7339 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c36
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