From 94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 27 Mar 2000 11:19:14 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++ gcc/config/i386/i386.md | 104 +++++++++++++++++++++++++++++++++++++++--------- 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 + + * 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 * 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\"; -- 2.7.4