Tweak moxie prologue and epilogue code.
authorAnthony Green <green@moxielogic.com>
Thu, 2 Jul 2009 01:18:42 +0000 (01:18 +0000)
committerAnthony Green <green@gcc.gnu.org>
Thu, 2 Jul 2009 01:18:42 +0000 (01:18 +0000)
From-SVN: r149163

gcc/ChangeLog
gcc/config/moxie/moxie.c
gcc/config/moxie/moxie.md

index eecd91b213f008ca50f18ebf092a4bb336fc3053..ea47ebd37906e8cf2b43a29dfef245655419affb 100644 (file)
@@ -1,3 +1,12 @@
+2009-07-01  Anthony Green  <green@moxielogic.com>
+
+       * config/moxie/moxie.c (moxie_expand_prologue): Use dec
+       instruction when possible.
+       (moxie_expand_prologue): Ditto.  Also, save an instruction and
+       some complexity by popping off of $r12 instead of $sp.  
+       * config/moxie/moxie.md (movsi_pop): Don't assume $sp.  Take two
+       operands.
+       
 2009-07-01  Richard Henderson  <rth@redhat.com>
 
        PR bootstrap/40347
index 0ed8ad1309b8099f6d520b137d3aa1866483a6fa..897717b40dfd7580c691ad2d079b169094554f25 100644 (file)
@@ -273,14 +273,25 @@ moxie_expand_prologue (void)
 
   if (cfun->machine->size_for_adjusting_sp > 0)
     {
-      insn = 
-       emit_insn (gen_movsi (gen_rtx_REG (Pmode, MOXIE_R12), 
-                             GEN_INT (-cfun->machine->size_for_adjusting_sp)));
-      RTX_FRAME_RELATED_P (insn) = 1;
-      insn = emit_insn (gen_addsi3 (stack_pointer_rtx, 
-                                   stack_pointer_rtx, 
-                                   gen_rtx_REG (Pmode, MOXIE_R12)));
-      RTX_FRAME_RELATED_P (insn) = 1;
+      if (cfun->machine->size_for_adjusting_sp <= 255)
+       {
+         insn = emit_insn (gen_subsi3 (stack_pointer_rtx, 
+                                       stack_pointer_rtx, 
+                                       GEN_INT (cfun->machine->size_for_adjusting_sp)));
+         RTX_FRAME_RELATED_P (insn) = 1;
+       }
+      else
+       {
+         insn = 
+           emit_insn (gen_movsi 
+                      (gen_rtx_REG (Pmode, MOXIE_R12), 
+                       GEN_INT (-cfun->machine->size_for_adjusting_sp)));
+         RTX_FRAME_RELATED_P (insn) = 1;
+         insn = emit_insn (gen_addsi3 (stack_pointer_rtx, 
+                                       stack_pointer_rtx, 
+                                       gen_rtx_REG (Pmode, MOXIE_R12)));
+         RTX_FRAME_RELATED_P (insn) = 1;
+       }       
     }
 }
 
@@ -293,26 +304,25 @@ moxie_expand_epilogue (void)
   if (cfun->machine->callee_saved_reg_size != 0)
     {
       reg = gen_rtx_REG (Pmode, MOXIE_R12);
-      emit_move_insn (reg,
-                     GEN_INT (-cfun->machine->callee_saved_reg_size));
-      emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx));
-      insn = emit_move_insn (stack_pointer_rtx, reg);
-      RTX_FRAME_RELATED_P (insn) = 1;
-      add_reg_note (insn, REG_CFA_DEF_CFA,
-                   plus_constant (stack_pointer_rtx,
-                                  cfun->machine->callee_saved_reg_size));
+      if (cfun->machine->callee_saved_reg_size <= 255)
+       {
+         emit_move_insn (reg, hard_frame_pointer_rtx);
+         emit_insn (gen_subsi3 
+                    (reg, reg, 
+                     GEN_INT (cfun->machine->callee_saved_reg_size)));
+       }
+      else
+       {
+         emit_move_insn (reg,
+                         GEN_INT (-cfun->machine->callee_saved_reg_size));
+         emit_insn (gen_addsi3 (reg, reg, hard_frame_pointer_rtx));
+       }
       for (regno = FIRST_PSEUDO_REGISTER; regno-- > 0; )
        if (!fixed_regs[regno] && !call_used_regs[regno]
            && df_regs_ever_live_p (regno))
          {
-           reg = gen_rtx_REG (Pmode, regno);
-           insn = emit_insn (gen_movsi_pop (reg));
-           RTX_FRAME_RELATED_P (insn) = 1;
-           add_reg_note (insn, REG_CFA_ADJUST_CFA,
-                         gen_rtx_SET (VOIDmode, stack_pointer_rtx,
-                                      plus_constant (stack_pointer_rtx,
-                                                     UNITS_PER_WORD)));
-           add_reg_note (insn, REG_CFA_RESTORE, reg);
+           rtx preg = gen_rtx_REG (Pmode, regno);
+           insn = emit_insn (gen_movsi_pop (reg, preg));
          }
     }
 
index 7f3729fdad535403738816f8a3cb2255c4813739..02072f48388bb0384f1ae7f63fbef34fc34627fe 100644 (file)
 
 ;; Pop a register from the stack
 (define_insn "movsi_pop"
-  [(set:SI (match_operand:SI 0 "register_operand" "=r")
-       (mem:SI (post_inc:SI (reg:SI 1))))]
+  [(set:SI (match_operand:SI 1 "register_operand" "=r")
+       (mem:SI (post_inc:SI (match_operand:SI 0 "register_operand" "r"))))]
   ""
-  "pop    $sp, %0")
+  "pop    %0, %1")
 
 (define_expand "movsi"
    [(set (match_operand:SI 0 "general_operand" "")