diff options
author | Richard Henderson <rth@cygnus.com> | 2000-08-28 17:51:21 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-08-28 17:51:21 -0700 |
commit | e1ff012cf8b1019dde2d1a65346f0b1c4a6fbaea (patch) | |
tree | 8f525e55c0a3ddb2de3321636646544d9b0e18b6 /gcc/config/i386 | |
parent | c2cba7a96e04069011ae508e3027bbf128208040 (diff) | |
download | gcc-e1ff012cf8b1019dde2d1a65346f0b1c4a6fbaea.zip gcc-e1ff012cf8b1019dde2d1a65346f0b1c4a6fbaea.tar.gz gcc-e1ff012cf8b1019dde2d1a65346f0b1c4a6fbaea.tar.bz2 |
i386.c: Don't error on EXTRA_CONSTRAINT defined.
* 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
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/i386.c | 17 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 4 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 30 |
3 files changed, 16 insertions, 35 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5ebf1c1..a1746a1 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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. */ diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index d7ced866..e32a168 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -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}}, \ diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 7d4faf3..c377978 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -8457,12 +8457,12 @@ && (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" "")))] @@ -8477,21 +8477,20 @@ [(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 @@ -8513,12 +8512,12 @@ && (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 "" ""))] "" "* @@ -8531,7 +8530,7 @@ [(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 "" ""))] "" "* @@ -8543,7 +8542,6 @@ else return \"call\\t%P0\"; } - operands[0] = XEXP (operands[0], 0); if (SIBLING_CALL_P (insn)) return \"jmp\\t%*%0\"; else @@ -8576,7 +8574,7 @@ && (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)); }") @@ -8595,7 +8593,7 @@ && (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)); }") @@ -11056,7 +11054,7 @@ (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" "")))] @@ -11072,7 +11070,7 @@ (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")))] @@ -11086,7 +11084,6 @@ else return \"call\\t%P1\"; } - operands[1] = XEXP (operands[1], 0); if (SIBLING_CALL_P (insn)) return \"jmp\\t%*%1\"; else @@ -11096,7 +11093,7 @@ (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 "" "")))] "" "* @@ -11110,7 +11107,7 @@ (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 "" "")))] "" "* @@ -11122,7 +11119,6 @@ else return \"call\\t%P1\"; } - operands[1] = XEXP (operands[1], 0); if (SIBLING_CALL_P (insn)) return \"jmp\\t%*%1\"; else |