From f0c51a1e34252c672a6ce100209a277d15529ce4 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 6 Apr 1994 07:21:12 -0400 Subject: [PATCH] (expand_function_start): Delay copying static chain. From-SVN: r6979 --- gcc/function.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/function.c b/gcc/function.c index 8726afb..22ea58b 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4860,7 +4860,13 @@ expand_function_start (subr, parms_have_cleanups) if (current_function_needs_context) { last_ptr = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0); - emit_move_insn (last_ptr, static_chain_incoming_rtx); + +#ifdef SMALL_REGISTER_CLASSES + /* Delay copying static chain if it is not a register to avoid + conflicts with regs used for parameters. */ + if (GET_CODE (static_chain_incoming_rtx) == REG) +#endif + emit_move_insn (last_ptr, static_chain_incoming_rtx); } /* If the parameters of this function need cleaning up, get a label @@ -4976,6 +4982,15 @@ expand_function_start (subr, parms_have_cleanups) assign_parms (subr, 0); +#ifdef SMALL_REGISTER_CLASSES + /* Copy the static chain now if it wasn't a register. The delay is to + avoid conflicts with the parameter passing registers. */ + + if (current_function_needs_context) + if (GET_CODE (static_chain_incoming_rtx) != REG) + emit_move_insn (last_ptr, static_chain_incoming_rtx); +#endif + /* The following was moved from init_function_start. The move is supposed to make sdb output more accurate. */ /* Indicate the beginning of the function body, -- 2.7.4