Devirtualizer used to do this for us. Committed.
* config/rl78/rl78.c (rl78_expand_prologue): Use AX to copy
between SP and FP.
(rl78_expand_epilogue): Likewise.
Index: config/rl78/rl78.c
===================================================================
--- config/rl78/rl78.c (revision 202541)
+++ config/rl78/rl78.c (working copy)
@@ -1033,14 +1033,18 @@ rl78_expand_prologue (void)
F (emit_insn (gen_push (gen_rtx_REG (HImode, i*2))));
}
if (rb != 0)
emit_insn (gen_sel_rb (GEN_INT (0)));
if (frame_pointer_needed)
- F (emit_move_insn (gen_rtx_REG (HImode, FRAME_POINTER_REGNUM),
- gen_rtx_REG (HImode, STACK_POINTER_REGNUM)));
+ {
+ F (emit_move_insn (gen_rtx_REG (HImode, AX_REG),
+ gen_rtx_REG (HImode, STACK_POINTER_REGNUM)));
+ F (emit_move_insn (gen_rtx_REG (HImode, FRAME_POINTER_REGNUM),
+ gen_rtx_REG (HImode, AX_REG)));
+ }
fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing;
while (fs > 0)
{
int fs_byte = (fs > 254) ? 254 : fs;
F (emit_insn (gen_subhi3 (sp, sp, GEN_INT (fs_byte))));
@@ -1058,14 +1062,16 @@ rl78_expand_epilogue (void)
if (rl78_is_naked_func ())
return;
if (frame_pointer_needed)
{
- emit_move_insn (gen_rtx_REG (HImode, STACK_POINTER_REGNUM),
+ emit_move_insn (gen_rtx_REG (HImode, AX_REG),
gen_rtx_REG (HImode, FRAME_POINTER_REGNUM));
+ emit_move_insn (gen_rtx_REG (HImode, STACK_POINTER_REGNUM),
+ gen_rtx_REG (HImode, AX_REG));
}
else
{
fs = cfun->machine->framesize_locals + cfun->machine->framesize_outgoing;
while (fs > 0)
{