From cc2394a432a9fa17043ce76e9c0888a09a621403 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 24 Aug 1994 17:15:04 -0400 Subject: [PATCH] (call): Rework to use macro version of jsr. From-SVN: r7967 --- gcc/config/alpha/alpha.md | 78 ++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index 93dec2c12d9..39792d86030 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -2406,28 +2406,31 @@ ;; Here are the CALL and unconditional branch insns. (define_expand "call" - [(parallel [(call (mem:DI (match_dup 2)) + [(parallel [(call (mem:DI (match_operand 0 "" "")) (match_operand 1 "" "")) - (use (match_operand:DI 0 "" "")) + (clobber (reg:DI 27)) (clobber (reg:DI 26))])] "" " { if (GET_CODE (operands[0]) != MEM) abort (); - operands[0] = XEXP (operands[0], 0); - operands[2] = gen_rtx (REG, DImode, 27); - emit_move_insn (operands[2], operands[0]); + operands[0] = XEXP (operands[0], 0); - if (GET_CODE (operands[0]) != SYMBOL_REF) - operands[0] = const0_rtx; + if (GET_CODE (operands[0]) != SYMBOL_REF + && ! (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 27)) + { + rtx tem = gen_rtx (REG, DImode, 27); + emit_move_insn (tem, operands[0]); + operands[0] = tem; + } }") (define_expand "call_value" [(parallel [(set (match_operand 0 "" "") - (call (mem:DI (match_dup 3)) + (call (mem:DI (match_operand 1 "" "")) (match_operand 2 "" ""))) - (use (match_operand:DI 1 "" "")) + (clobber (reg:DI 27)) (clobber (reg:DI 26))])] "" " @@ -2436,50 +2439,39 @@ operands[1] = XEXP (operands[1], 0); - operands[3] = gen_rtx (REG, DImode, 27); - emit_move_insn (operands[3], operands[1]); - - if (GET_CODE (operands[1]) != SYMBOL_REF) - operands[1] = const0_rtx; + if (GET_CODE (operands[1]) != SYMBOL_REF + && ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27)) + { + rtx tem = gen_rtx (REG, DImode, 27); + emit_move_insn (tem, operands[1]); + operands[1] = tem; + } }") (define_insn "" - [(call (mem:DI (reg:DI 27)) - (match_operand 0 "" "")) - (use (match_operand:DI 1 "" "")) + [(call (mem:DI (match_operand:DI 0 "call_operand" "r,R,i")) + (match_operand 1 "" "")) + (clobber (reg:DI 27)) (clobber (reg:DI 26))] "" - "jsr $26,($27),%1\;ldgp $29,0($26)" - [(set_attr "type" "jsr")]) - -(define_insn "" - [(set (match_operand 0 "register_operand" "=rf") - (call (mem:DI (reg:DI 27)) - (match_operand 1 "" ""))) - (use (match_operand:DI 2 "" "")) - (clobber (reg:DI 26))] - "" - "jsr $26,($27),%2\;ldgp $29,0($26)" - [(set_attr "type" "jsr")]) - -(define_insn "" - [(call (mem:DI (match_operand 1 "current_file_function_operand" "i")) - (match_operand 0 "" "")) - (use (match_dup 1)) - (clobber (reg:DI 26))] - "" - "bsr $26,%1..ng" - [(set_attr "type" "ibr")]) + "@ + jsr $26,($27),0\;ldgp $29,0($26) + bsr $26,%0..ng + jsr $26,%0\;ldgp $29,0($26)" + [(set_attr "type" "jsr,jsr,ibr")]) (define_insn "" - [(set (match_operand 0 "register_operand" "=rf") - (call (mem:DI (match_operand 1 "current_file_function_operand" "i")) + [(set (match_operand 0 "register_operand" "=rf,rf,rf") + (call (mem:DI (match_operand:DI 1 "call_operand" "r,R,i")) (match_operand 2 "" ""))) - (use (match_dup 1)) + (clobber (reg:DI 27)) (clobber (reg:DI 26))] "" - "bsr $26,%1..ng" - [(set_attr "type" "ibr")]) + "@ + jsr $26,($27),0\;ldgp $29,0($26) + bsr $26,%1..ng + jsr $26,%1\;ldgp $29,0($26)" + [(set_attr "type" "jsr,jsr,ibr")]) ;; Call subroutine returning any type. -- 2.30.2