diff --git a/gcc/config/i960/i960.md b/gcc/config/i960/i960.md index 1489b46aa65..8ed7c1a9ea1 100644 --- a/gcc/config/i960/i960.md +++ b/gcc/config/i960/i960.md @@ -2074,20 +2074,24 @@ ;;- jump to subroutine (define_expand "call" - [(call (match_operand:SI 0 "general_operand" "") - (match_operand:SI 1 "immediate_operand" ""))] - "" - " -{ - i960_expand_call (operand0, operand1, 0); - DONE; -}") - -(define_insn "" [(call (match_operand:SI 0 "general_operand" "g") (match_operand:SI 1 "immediate_operand" "i"))] "" - "* return i960_output_call_insn (operands[0], operands[1], insn);" + " +{ + emit_insn (gen_call_internal (operands[0], operands[1], + virtual_outgoing_args_rtx)); + DONE; +}") + +(define_insn "call_internal" + [(call (match_operand:SI 0 "general_operand" "g") + (match_operand:SI 1 "immediate_operand" "i")) + (use (match_operand:SI 2 "address_operand" "p")) + (clobber (match_scratch:SI 3 "=&r"))] + "" + "* return i960_output_call_insn (operands[0], operands[1], operands[2], + operands[3], insn);" [(set_attr "type" "call")]) (define_expand "call_value" @@ -2097,16 +2101,20 @@ "" " { - i960_expand_call (operand1, operand2, operand0); + emit_insn (gen_call_value_internal (operands[0], operands[1], operands[2], + virtual_outgoing_args_rtx)); DONE; }") -(define_insn "" +(define_insn "call_value_internal" [(set (match_operand 0 "register_operand" "=d") (call (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "immediate_operand" "i")))] + (match_operand:SI 2 "immediate_operand" "i"))) + (use (match_operand:SI 3 "address_operand" "p")) + (clobber (match_scratch:SI 4 "=&r"))] "" - "* return i960_output_call_insn (operands[1], operands[2], insn);" + "* return i960_output_call_insn (operands[1], operands[2], operands[3], + operands[4], insn);" [(set_attr "type" "call")]) (define_insn "return"