diff options
author | Richard Henderson <rth@cygnus.com> | 2000-03-27 11:19:14 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-03-27 11:19:14 -0800 |
commit | 94bb5d0c1eefcd39cf9f4146eb716c65d2eb0b86 (patch) | |
tree | 68141be2f5004d2ae9c265860641a9c3fa03f3d9 | |
parent | d630442f9d80a2e08f067773954db55a8cd39744 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <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\"; |