i386.c: Don't error on EXTRA_CONSTRAINT defined.
authorRichard Henderson <rth@cygnus.com>
Tue, 29 Aug 2000 00:51:21 +0000 (17:51 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 29 Aug 2000 00:51:21 +0000 (17:51 -0700)
        * config/i386/i386.c: Don't error on EXTRA_CONSTRAINT defined.
        (call_insn_operand): Don't expect a surrounding mem.
        (constant_call_address_operand): Likewise.
        * config/i386/i386.h (PREDICATE_CODES): Update.
        * config/i386/i386.md (call patterns): Move the match_operand
        for the call destination inside the mem.

From-SVN: r36024

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md

index ac75927f35a7d8be1b8e0642121fe51865a525db..5e5f8e4c1d556eabc51a53bae83d9a000a872f68 100644 (file)
@@ -1,3 +1,12 @@
+2000-08-28  Richard Henderson  <rth@cygnus.com>
+
+       * config/i386/i386.c: Don't error on EXTRA_CONSTRAINT defined.
+       (call_insn_operand): Don't expect a surrounding mem.
+       (constant_call_address_operand): Likewise.
+       * config/i386/i386.h (PREDICATE_CODES): Update.
+       * config/i386/i386.md (call patterns): Move the match_operand
+       for the call destination inside the mem.
+
 2000-08-28  Richard Henderson  <rth@cygnus.com>
 
        * local-alloc.c (requires_inout): Don't use reserved range for
index 5ebf1c1c0c7955107c198f8a4bc84cd8260d32b9..a1746a15695388951b69815daa4f5d45ad6bf09d 100644 (file)
@@ -42,15 +42,6 @@ Boston, MA 02111-1307, USA. */
 #include "basic-block.h"
 #include "ggc.h"
 
-#ifdef EXTRA_CONSTRAINT
-/* If EXTRA_CONSTRAINT is defined, then the 'S'
-   constraint in REG_CLASS_FROM_LETTER will no longer work, and various
-   asm statements that need 'S' for class SIREG will break.  */
- error EXTRA_CONSTRAINT conflicts with S constraint letter
-/* The previous line used to be #error, but some compilers barf
-   even if the conditional was untrue.  */
-#endif
-
 #ifndef CHECK_STACK_LIMIT
 #define CHECK_STACK_LIMIT -1
 #endif
@@ -1078,10 +1069,6 @@ call_insn_operand (op, mode)
      rtx op;
      enum machine_mode mode ATTRIBUTE_UNUSED;
 {
-  if (GET_CODE (op) != MEM)
-    return 0;
-  op = XEXP (op, 0);
-
   /* Disallow indirect through a virtual register.  This leads to
      compiler aborts when trying to eliminate them.  */
   if (GET_CODE (op) == REG
@@ -1114,9 +1101,7 @@ constant_call_address_operand (op, mode)
      rtx op;
      enum machine_mode mode ATTRIBUTE_UNUSED;
 {
-  return (GET_CODE (op) == MEM
-         && CONSTANT_ADDRESS_P (XEXP (op, 0))
-         && GET_CODE (XEXP (op, 0)) !=  CONST_INT);
+  return GET_CODE (op) == SYMBOL_REF;
 }
 
 /* Match exactly zero and one.  */
index d7ced8669b9f8c8f623396ec46cc0608f07fb90b..e32a16822ca4bdba2fd5b96d667742725236698f 100644 (file)
@@ -2585,8 +2585,8 @@ do { long l;                                              \
   {"aligned_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,     \
                       LABEL_REF, SUBREG, REG, MEM}},                   \
   {"pic_symbolic_operand", {CONST}},                                   \
-  {"call_insn_operand", {MEM}},                                                \
-  {"constant_call_address_operand", {MEM}},                            \
+  {"call_insn_operand", {REG, SUBREG, MEM, SYMBOL_REF}},               \
+  {"constant_call_address_operand", {SYMBOL_REF}},                     \
   {"const0_operand", {CONST_INT, CONST_DOUBLE}},                       \
   {"const1_operand", {CONST_INT}},                                     \
   {"const248_operand", {CONST_INT}},                                   \
index 7d4faf347cb8356a4fb3ea96278ee55cd7272bab..c377978a5c437c72ecbdaeaf462304cea5697d82 100644 (file)
       && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF
          || !SYMBOL_REF_FLAG (XEXP (operands[0], 0))))
     current_function_uses_pic_offset_table = 1;
-  if (! call_insn_operand (operands[0], QImode))
+  if (! call_insn_operand (XEXP (operands[0], 0), Pmode))
     XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
 }")
 
 (define_insn "*call_pop_0"
-  [(call (match_operand:QI 0 "constant_call_address_operand" "")
+  [(call (mem:QI (match_operand:SI 0 "constant_call_address_operand" ""))
         (match_operand:SI 1 "" ""))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 3 "immediate_operand" "")))]
   [(set_attr "type" "call")])
   
 (define_insn "*call_pop_1"
-  [(call (match_operand:QI 0 "call_insn_operand" "m")
+  [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "rsm"))
         (match_operand:SI 1 "" ""))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 3 "immediate_operand" "i")))]
   ""
   "*
 {
-  if (constant_call_address_operand (operands[0], QImode))
+  if (constant_call_address_operand (operands[0], Pmode))
     {
       if (SIBLING_CALL_P (insn))
        return \"jmp\\t%P0\";
       else
        return \"call\\t%P0\";
     }
-  operands[0] = XEXP (operands[0], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%0\";
   else
       && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF
          || !SYMBOL_REF_FLAG (XEXP (operands[0], 0))))
     current_function_uses_pic_offset_table = 1;
-  if (! call_insn_operand (operands[0], QImode))
+  if (! call_insn_operand (XEXP (operands[0], 0), Pmode))
     XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
 }")
 
 (define_insn "*call_0"
-  [(call (match_operand:QI 0 "constant_call_address_operand" "")
+  [(call (mem:QI (match_operand:SI 0 "constant_call_address_operand" ""))
         (match_operand:SI 1 "" ""))]
   ""
   "*
   [(set_attr "type" "call")])
 
 (define_insn "*call_1"
-  [(call (match_operand:QI 0 "call_insn_operand" "m")
+  [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "rsm"))
         (match_operand:SI 1 "" ""))]
   ""
   "*
       else
        return \"call\\t%P0\";
     }
-  operands[0] = XEXP (operands[0], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%0\";
   else
       && (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF
          || !SYMBOL_REF_FLAG (XEXP (operands[1], 0))))
     current_function_uses_pic_offset_table = 1;
-  if (! call_insn_operand (operands[1], QImode))
+  if (! call_insn_operand (XEXP (operands[1], 0), Pmode))
     XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
 }")
 
       && (GET_CODE (XEXP (operands[1], 0)) != SYMBOL_REF
          || !SYMBOL_REF_FLAG (XEXP (operands[1], 0))))
     current_function_uses_pic_offset_table = 1;
-  if (! call_insn_operand (operands[1], QImode))
+  if (! call_insn_operand (XEXP (operands[1], 0), Pmode))
     XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
 }")
 
 
 (define_insn "*call_value_pop_0"
   [(set (match_operand 0 "" "")
-       (call (match_operand:QI 1 "constant_call_address_operand" "")
+       (call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
              (match_operand:SI 2 "" "")))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 4 "immediate_operand" "")))]
 
 (define_insn "*call_value_pop_1"
   [(set (match_operand 0 "" "")
-       (call (match_operand:QI 1 "call_insn_operand" "m")
+       (call (mem:QI (match_operand:SI 1 "call_insn_operand" "rsm"))
              (match_operand:SI 2 "" "")))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
                            (match_operand:SI 4 "immediate_operand" "i")))]
       else
        return \"call\\t%P1\";
     }
-  operands[1] = XEXP (operands[1], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%1\";
   else
 
 (define_insn "*call_value_0"
   [(set (match_operand 0 "" "")
-       (call (match_operand:QI 1 "constant_call_address_operand" "")
+       (call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
              (match_operand:SI 2 "" "")))]
   ""
   "*
 
 (define_insn "*call_value_1"
   [(set (match_operand 0 "" "")
-       (call (match_operand:QI 1 "call_insn_operand" "m")
+       (call (mem:QI (match_operand:SI 1 "call_insn_operand" "rsm"))
              (match_operand:SI 2 "" "")))]
   ""
   "*
       else
        return \"call\\t%P1\";
     }
-  operands[1] = XEXP (operands[1], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%1\";
   else