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)
        {

Reply via email to