diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1996-06-06 16:34:44 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1996-06-06 16:34:44 -0700 |
commit | bd16a708b9e21300511c7187a81fc5c8fb949d7c (patch) | |
tree | ce5c63c363bd0581593fbb33f5121a5ed452756d | |
parent | a20b7b051ed09da29b7e4732abbc6439cc3e121d (diff) | |
download | gcc-bd16a708b9e21300511c7187a81fc5c8fb949d7c.zip gcc-bd16a708b9e21300511c7187a81fc5c8fb949d7c.tar.gz gcc-bd16a708b9e21300511c7187a81fc5c8fb949d7c.tar.bz2 |
(call_value): Handle PARALLEL in operands[0].
(call_value_multiple_internal2): New pattern.
From-SVN: r12196
-rw-r--r-- | gcc/config/mips/mips.md | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 8b557e5..973aaed 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -6322,12 +6322,23 @@ move\\t%0,%z4\\n\\ emit_insn (RTVEC_ELT (adjust, i)); } + /* Handle Irix6 function calls that have multiple non-contiguous + results. */ + if (GET_CODE (operands[0]) == PARALLEL) + { + emit_call_insn (gen_call_value_multiple_internal2 + (XEXP (XVECEXP (operands[0], 0, 0), 0), + operands[1], operands[2], + XEXP (XVECEXP (operands[0], 0, 1), 0), + gen_rtx (REG, SImode, GP_REG_FIRST + 31))); + DONE; + } + emit_call_insn (gen_call_value_internal1 (operands[0], operands[1], operands[2], gen_rtx (REG, SImode, GP_REG_FIRST + 31))); DONE; } - }") (define_insn "call_value_internal1" @@ -6447,6 +6458,45 @@ move\\t%0,%z4\\n\\ (set_attr "mode" "none") (set_attr "length" "2")]) +;; ??? May eventually need all 6 versions of the call patterns with multiple +;; return values. + +(define_insn "call_value_multiple_internal2" + [(set (match_operand 0 "register_operand" "=df") + (call (match_operand 1 "call_insn_operand" "m") + (match_operand 2 "" "i"))) + (set (match_operand 3 "register_operand" "=df") + (call (match_dup 1) + (match_dup 2))) + (clobber (match_operand:SI 4 "register_operand" "=d"))] + "TARGET_ABICALLS && !TARGET_LONG_CALLS" + "* +{ + register rtx target = XEXP (operands[1], 0); + + if (GET_CODE (target) == SYMBOL_REF) + return \"jal\\t%1\"; + + else if (GET_CODE (target) == CONST_INT) + { + operands[1] = target; + return \"li\\t%^,%1\\n\\tjal\\t%4,%^\"; + } + + else + { + operands[1] = target; + if (REGNO (target) != PIC_FUNCTION_ADDR_REGNUM) + return \"move\\t%^,%1\\n\\tjal\\t%4,%^\"; + else + return \"jal\\t%4,%1\"; + } +}" + [(set_attr "type" "call") + (set_attr "mode" "none") + (set_attr "length" "2")]) + + ;; Call subroutine returning any type. (define_expand "untyped_call" |