i386.c (call_insn_operand): Reject const_int.
authorRichard Henderson <rth@cygnus.com>
Mon, 13 Sep 1999 22:22:48 +0000 (15:22 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 13 Sep 1999 22:22:48 +0000 (15:22 -0700)
        * i386.c (call_insn_operand): Reject const_int.
        (expander_call_insn_operand): Use call_insn_operand.

From-SVN: r29385

gcc/ChangeLog
gcc/config/i386/i386.c

index bdf5bb67debadd6f9025efc643924fc955e3c23b..38f571820627df6918bdec828dd5e4e94736e22c 100644 (file)
@@ -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().
index 38ef20ea0a5850077ae5e78ccc86470fb42e895c..3042df60bedf7efe7adb666e345a9cfa5d425f74 100644 (file)
@@ -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