aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Green <green@moxielogic.com>2012-09-08 01:14:22 +0000
committerAnthony Green <green@gcc.gnu.org>2012-09-08 01:14:22 +0000
commit55a514601b5c2ea174a6413cf1c903663d1fddf5 (patch)
tree61caf97457ea6a242f8cffe3fbe95040d4d38e0d
parente4d8437d70b94edfcf40b29a417e6aac9d9e9932 (diff)
downloadgcc-55a514601b5c2ea174a6413cf1c903663d1fddf5.zip
gcc-55a514601b5c2ea174a6413cf1c903663d1fddf5.tar.gz
gcc-55a514601b5c2ea174a6413cf1c903663d1fddf5.tar.bz2
Optimize moxie function prologues
From-SVN: r191088
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/moxie/moxie.c20
2 files changed, 22 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f78102c..399feaa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/moxie/moxie.c b/gcc/config/moxie/moxie.c
index 8d40412..97f8af0 100644
--- a/gcc/config/moxie/moxie.c
+++ b/gcc/config/moxie/moxie.c
@@ -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);