aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-08-28 17:51:21 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-08-28 17:51:21 -0700
commite1ff012cf8b1019dde2d1a65346f0b1c4a6fbaea (patch)
tree8f525e55c0a3ddb2de3321636646544d9b0e18b6 /gcc/config/i386
parentc2cba7a96e04069011ae508e3027bbf128208040 (diff)
downloadgcc-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.c17
-rw-r--r--gcc/config/i386/i386.h4
-rw-r--r--gcc/config/i386/i386.md30
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