Commit 3c53850d by Richard Sandiford Committed by Richard Sandiford

mips.c (mips_load_call_address): Make the call insn use $gp if it could be…

mips.c (mips_load_call_address): Make the call insn use $gp if it could be calling a lazy binding stub.

	* config/mips/mips.c (mips_load_call_address): Make the call insn
	use $gp if it could be calling a lazy binding stub.

From-SVN: r76224
parent 101ad855
2004-01-20 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.c (mips_load_call_address): Make the call insn
use $gp if it could be calling a lazy binding stub.
2004-01-20 Kazu Hirata <kazu@cs.umass.edu> 2004-01-20 Kazu Hirata <kazu@cs.umass.edu>
* config/s390/s390.c (TARGET_PROMOTE_FUNCTION_ARGS): Define. * config/s390/s390.c (TARGET_PROMOTE_FUNCTION_ARGS): Define.
......
...@@ -3244,37 +3244,46 @@ mips_load_call_address (rtx dest, rtx addr, int sibcall_p) ...@@ -3244,37 +3244,46 @@ mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
void void
mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p) mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p)
{ {
rtx orig_addr, pattern, insn;
orig_addr = addr;
if (!call_insn_operand (addr, VOIDmode)) if (!call_insn_operand (addr, VOIDmode))
{ {
rtx dest = gen_reg_rtx (Pmode); addr = gen_reg_rtx (Pmode);
mips_load_call_address (dest, addr, sibcall_p); mips_load_call_address (addr, orig_addr, sibcall_p);
addr = dest;
} }
if (TARGET_MIPS16 if (TARGET_MIPS16
&& mips16_hard_float && mips16_hard_float
&& build_mips16_call_stub (result, addr, args_size, && build_mips16_call_stub (result, addr, args_size,
aux == 0 ? 0 : (int) GET_MODE (aux))) aux == 0 ? 0 : (int) GET_MODE (aux)))
/* Nothing more to do */; return;
else if (result == 0)
emit_call_insn (sibcall_p if (result == 0)
? gen_sibcall_internal (addr, args_size) pattern = (sibcall_p
: gen_call_internal (addr, args_size)); ? gen_sibcall_internal (addr, args_size)
: gen_call_internal (addr, args_size));
else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2) else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2)
{ {
rtx reg1, reg2; rtx reg1, reg2;
reg1 = XEXP (XVECEXP (result, 0, 0), 0); reg1 = XEXP (XVECEXP (result, 0, 0), 0);
reg2 = XEXP (XVECEXP (result, 0, 1), 0); reg2 = XEXP (XVECEXP (result, 0, 1), 0);
emit_call_insn pattern =
(sibcall_p (sibcall_p
? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2) ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2)
: gen_call_value_multiple_internal (reg1, addr, args_size, reg2)); : gen_call_value_multiple_internal (reg1, addr, args_size, reg2));
} }
else else
emit_call_insn (sibcall_p pattern = (sibcall_p
? gen_sibcall_value_internal (result, addr, args_size) ? gen_sibcall_value_internal (result, addr, args_size)
: gen_call_value_internal (result, addr, args_size)); : gen_call_value_internal (result, addr, args_size));
insn = emit_call_insn (pattern);
/* Lazy-binding stubs require $gp to be valid on entry. */
if (global_got_operand (orig_addr, VOIDmode))
use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment