diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b899a2725a1550b9a7f6a4eb99a55640b889934..9bbae4be37d42f56b588ec98d785bbbc5d47d8ec 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 b188d915f31376d57793e4369b1b37e1e0fe6901..2b48b0a12db30ff7fbc15111b6764a84d27a446e 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\";