Commit 94bb5d0c by Richard Henderson Committed by Richard Henderson

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
parent d630442f
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> 2000-03-27 Nick Clifton <nickc@cygnus.com>
* invoke.texi (Spec Files): Document new spec % command created by * invoke.texi (Spec Files): Document new spec % command created by
......
...@@ -7039,19 +7039,41 @@ ...@@ -7039,19 +7039,41 @@
XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0)); 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" (define_insn "*call_pop_1"
[(call (match_operand:QI 0 "call_insn_operand" "m") [(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) (set (reg:SI 7) (plus:SI (reg:SI 7)
(match_operand:SI 3 "immediate_operand" "i")))] (match_operand:SI 3 "immediate_operand" "i")))]
"" ""
"* "*
{ {
if (constant_call_address_operand (operands[0], GET_MODE (operands[0]))) if (constant_call_address_operand (operands[0], QImode))
return \"call\\t%P0\"; {
if (SIBLING_CALL_P (insn))
return \"jmp\\t%P0\";
else
return \"call\\t%P0\";
}
operands[0] = XEXP (operands[0], 0); 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")]) [(set_attr "type" "call")])
...@@ -7070,21 +7092,32 @@ ...@@ -7070,21 +7092,32 @@
XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0)); 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" (define_insn "*call_1"
[(call (match_operand:QI 0 "call_insn_operand" "m") [(call (match_operand:QI 0 "call_insn_operand" "m")
(match_operand:SI 1 "general_operand" "g"))] (match_operand:SI 1 "" ""))]
;; Operand 1 not used on the i386.
"" ""
"* "*
{ {
if (constant_call_address_operand (operands[0], GET_MODE (operands[0]))) if (constant_call_address_operand (operands[0], QImode))
{ {
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%P0\"; return \"jmp\\t%P0\";
else else
return \"call\\t%P0\"; return \"call\\t%P0\";
} }
operands[0] = XEXP (operands[0], 0); operands[0] = XEXP (operands[0], 0);
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%0\"; return \"jmp\\t%*%0\";
...@@ -9363,39 +9396,74 @@ ...@@ -9363,39 +9396,74 @@
;; Call-value patterns last so that the wildcard operand does not ;; Call-value patterns last so that the wildcard operand does not
;; disrupt insn-recog's switch tables. ;; 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" (define_insn "*call_value_pop_1"
[(set (match_operand 0 "" "") [(set (match_operand 0 "" "")
(call (match_operand:QI 1 "call_insn_operand" "m") (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) (set (reg:SI 7) (plus:SI (reg:SI 7)
(match_operand:SI 4 "immediate_operand" "i")))] (match_operand:SI 4 "immediate_operand" "i")))]
"" ""
"* "*
{ {
if (constant_call_address_operand (operands[1], GET_MODE (operands[1]))) if (constant_call_address_operand (operands[1], QImode))
return \"call\\t%P1\"; {
if (SIBLING_CALL_P (insn))
return \"jmp\\t%P1\";
else
return \"call\\t%P1\";
}
operands[1] = XEXP (operands[1], 0); 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")]) [(set_attr "type" "callv")])
(define_insn "*call_value_1" (define_insn "*call_value_1"
[(set (match_operand 0 "" "") [(set (match_operand 0 "" "")
(call (match_operand:QI 1 "call_insn_operand" "m") (call (match_operand:QI 1 "call_insn_operand" "m")
(match_operand:SI 2 "general_operand" "g")))] (match_operand:SI 2 "" "")))]
;; Operand 2 not used on the i386.
"" ""
"* "*
{ {
if (constant_call_address_operand (operands[1], GET_MODE (operands[1]))) if (constant_call_address_operand (operands[1], QImode))
{ {
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%P1\"; return \"jmp\\t%P1\";
else else
return \"call\\t%P1\"; return \"call\\t%P1\";
} }
operands[1] = XEXP (operands[1], 0); operands[1] = XEXP (operands[1], 0);
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%1\"; return \"jmp\\t%*%1\";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment