aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-03-27 11:19:14 -0800
committerRichard Henderson <rth@gcc.gnu.org>2000-03-27 11:19:14 -0800
commit94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86 (patch)
tree68141be2f5004d2ae9c265860641a9c3fa03f3d9 /gcc
parentd630442f9d80a2e08f067773954db55a8cd39744 (diff)
downloadgcc-94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86.zip
gcc-94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86.tar.gz
gcc-94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86.tar.bz2
i386.md (call_pop_0, [...]): New.
* i386.md (call_pop_0, call_value_pop_0): New. (call_pop_1): Remove constraint from unused arg. Support sibcalls. (call_value_pop_1): Likewise. (call_0, call_value_0): New. (call_1, call_value_1): Remove constraint from unused arg. From-SVN: r32768
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.md104
2 files changed, 94 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b899a2..9bbae4b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2000-03-27 Richard Henderson <rth@cygnus.com>
+
+ * i386.md (call_pop_0, call_value_pop_0): New.
+ (call_pop_1): Remove constraint from unused arg. Support sibcalls.
+ (call_value_pop_1): Likewise.
+ (call_0, call_value_0): New.
+ (call_1, call_value_1): Remove constraint from unused arg.
+
2000-03-27 Nick Clifton <nickc@cygnus.com>
* invoke.texi (Spec Files): Document new spec % command created by
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index b188d91..2b48b0a 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -7039,19 +7039,41 @@
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" "")
+ (match_operand:SI 1 "" ""))
+ (set (reg:SI 7) (plus:SI (reg:SI 7)
+ (match_operand:SI 3 "immediate_operand" "")))]
+ ""
+ "*
+{
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P0\";
+ else
+ return \"call\\t%P0\";
+}"
+ [(set_attr "type" "call")])
+
(define_insn "*call_pop_1"
[(call (match_operand:QI 0 "call_insn_operand" "m")
- (match_operand:SI 1 "general_operand" "g"))
+ (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], GET_MODE (operands[0])))
- return \"call\\t%P0\";
-
+ if (constant_call_address_operand (operands[0], QImode))
+ {
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P0\";
+ else
+ return \"call\\t%P0\";
+ }
operands[0] = XEXP (operands[0], 0);
- return \"call\\t%*%0\";
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%*%0\";
+ else
+ return \"call\\t%*%0\";
}"
[(set_attr "type" "call")])
@@ -7070,21 +7092,32 @@
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" "")
+ (match_operand:SI 1 "" ""))]
+ ""
+ "*
+{
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P0\";
+ else
+ return \"call\\t%P0\";
+}"
+ [(set_attr "type" "call")])
+
(define_insn "*call_1"
[(call (match_operand:QI 0 "call_insn_operand" "m")
- (match_operand:SI 1 "general_operand" "g"))]
- ;; Operand 1 not used on the i386.
+ (match_operand:SI 1 "" ""))]
""
"*
{
- if (constant_call_address_operand (operands[0], GET_MODE (operands[0])))
+ if (constant_call_address_operand (operands[0], QImode))
{
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\";
@@ -9363,39 +9396,74 @@
;; Call-value patterns last so that the wildcard operand does not
;; disrupt insn-recog's switch tables.
+(define_insn "*call_value_pop_0"
+ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "constant_call_address_operand" "")
+ (match_operand:SI 2 "" "")))
+ (set (reg:SI 7) (plus:SI (reg:SI 7)
+ (match_operand:SI 4 "immediate_operand" "")))]
+ ""
+ "*
+{
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P1\";
+ else
+ return \"call\\t%P1\";
+}"
+ [(set_attr "type" "callv")])
+
(define_insn "*call_value_pop_1"
[(set (match_operand 0 "" "")
(call (match_operand:QI 1 "call_insn_operand" "m")
- (match_operand:SI 2 "general_operand" "g")))
+ (match_operand:SI 2 "" "")))
(set (reg:SI 7) (plus:SI (reg:SI 7)
(match_operand:SI 4 "immediate_operand" "i")))]
""
"*
{
- if (constant_call_address_operand (operands[1], GET_MODE (operands[1])))
- return \"call\\t%P1\";
-
+ if (constant_call_address_operand (operands[1], QImode))
+ {
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P1\";
+ else
+ return \"call\\t%P1\";
+ }
operands[1] = XEXP (operands[1], 0);
- return \"call\\t%*%1\";
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%*%1\";
+ else
+ return \"call\\t%*%1\";
+}"
+ [(set_attr "type" "callv")])
+
+(define_insn "*call_value_0"
+ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "constant_call_address_operand" "")
+ (match_operand:SI 2 "" "")))]
+ ""
+ "*
+{
+ if (SIBLING_CALL_P (insn))
+ return \"jmp\\t%P1\";
+ else
+ return \"call\\t%P1\";
}"
[(set_attr "type" "callv")])
(define_insn "*call_value_1"
[(set (match_operand 0 "" "")
(call (match_operand:QI 1 "call_insn_operand" "m")
- (match_operand:SI 2 "general_operand" "g")))]
- ;; Operand 2 not used on the i386.
+ (match_operand:SI 2 "" "")))]
""
"*
{
- if (constant_call_address_operand (operands[1], GET_MODE (operands[1])))
+ if (constant_call_address_operand (operands[1], QImode))
{
if (SIBLING_CALL_P (insn))
return \"jmp\\t%P1\";
else
return \"call\\t%P1\";
}
-
operands[1] = XEXP (operands[1], 0);
if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%1\";