]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Optimize moxie function prologues
authorAnthony Green <green@moxielogic.com>
Sat, 8 Sep 2012 01:14:22 +0000 (01:14 +0000)
committerAnthony Green <green@gcc.gnu.org>
Sat, 8 Sep 2012 01:14:22 +0000 (01:14 +0000)
From-SVN: r191088

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

index f78102ca4e3e8b2d8b7e0eb365e0693146e3aaa1..399feaa1bbd9b1b94bb55d34b74cb29f300e3d0f 100644 (file)
@@ -1,3 +1,10 @@
+2012-09-07  Anthony Green  <green@moxielogic.com>
+
+       * config/moxie/moxie.c (moxie_expand_prologue): Optimize prologue
+       for functions with large static stack requirements.
+       (moxie_expand_epilogue): Use $r12 instead of $r5 for pulling saved
+       values off of the stack.
+
 2012-09-07  Nick Clifton  <nickc@redhat.com>
 
        * config/v850/v850.h (DBX_DEBUGGING_INFO): Define.
index 8d40412d095bf3da5f4da5a6f0aac7c5767bf454..97f8af0eb04c5a083df376bdb5469d8bb2d3488f 100644 (file)
@@ -1,5 +1,5 @@
 /* Target Code for moxie
-   Copyright (C) 2008, 2009, 2010, 2011  Free Software Foundation
+   Copyright (C) 2008, 2009, 2010, 2011, 2012  Free Software Foundation
    Contributed by Anthony Green.
 
    This file is part of GCC.
@@ -293,8 +293,8 @@ moxie_expand_prologue (void)
 
   if (cfun->machine->size_for_adjusting_sp > 0)
     {
-      int i = cfun->machine->size_for_adjusting_sp;
-      while (i > 255)
+      int i = cfun->machine->size_for_adjusting_sp; 
+      while ((i >= 255) && (i <= 510))
        {
          insn = emit_insn (gen_subsi3 (stack_pointer_rtx, 
                                        stack_pointer_rtx, 
@@ -302,13 +302,23 @@ moxie_expand_prologue (void)
          RTX_FRAME_RELATED_P (insn) = 1;
          i -= 255;
        }
-      if (i > 0)
+      if (i <= 255)
        {
          insn = emit_insn (gen_subsi3 (stack_pointer_rtx, 
                                        stack_pointer_rtx, 
                                        GEN_INT (i)));
          RTX_FRAME_RELATED_P (insn) = 1;
        }
+      else
+       {
+         rtx reg = gen_rtx_REG (SImode, MOXIE_R12);
+         insn = emit_move_insn (reg, GEN_INT (i));
+         RTX_FRAME_RELATED_P (insn) = 1;
+         insn = emit_insn (gen_subsi3 (stack_pointer_rtx, 
+                                       stack_pointer_rtx, 
+                                       reg));
+         RTX_FRAME_RELATED_P (insn) = 1;
+       }
     }
 }
 
@@ -320,7 +330,7 @@ moxie_expand_epilogue (void)
 
   if (cfun->machine->callee_saved_reg_size != 0)
     {
-      reg = gen_rtx_REG (Pmode, MOXIE_R5);
+      reg = gen_rtx_REG (Pmode, MOXIE_R12);
       if (cfun->machine->callee_saved_reg_size <= 255)
        {
          emit_move_insn (reg, hard_frame_pointer_rtx);