aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Ung <davidu@mips.com>2005-08-26 13:15:14 +0000
committerDavid Ung <davidu@gcc.gnu.org>2005-08-26 13:15:14 +0000
commite296c00c3209450305f5cf270d9cba03cba38a1c (patch)
tree0bf450f5cec56c1f9e4430e0790f0a3395d7b449 /gcc
parent55d61dbaccbb0d9bf0c758f7819fd062b29c68c3 (diff)
downloadgcc-e296c00c3209450305f5cf270d9cba03cba38a1c.zip
gcc-e296c00c3209450305f5cf270d9cba03cba38a1c.tar.gz
gcc-e296c00c3209450305f5cf270d9cba03cba38a1c.tar.bz2
mips.c (mips_expand_prologue): Handle case when generating for MIPS16 and the outgoing argument area is more...
* config/mips/mips.c (mips_expand_prologue): Handle case when generating for MIPS16 and the outgoing argument area is more than SMALL_OPERAND. Use the frame pointer as temporary to generate the add instruction. From-SVN: r103519
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/mips/mips.c21
2 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5ed3aca..4cf749a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-08-26 David Ung <davidu@mips.com>
+
+ * config/mips/mips.c (mips_expand_prologue): Handle case when
+ generating for MIPS16 and the outgoing argument area is more than
+ SMALL_OPERAND. Use the frame pointer as temporary to generate the
+ add instruction.
+
2005-08-26 Paul Woegerer <paul.woegerer@nsc.com>
* config/crx/crx.md: Make doloop_end pattern usage controllable
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index af2db04..154ec30 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -6736,10 +6736,23 @@ mips_expand_prologue (void)
if (TARGET_MIPS16 && cfun->machine->frame.args_size != 0)
{
rtx offset = GEN_INT (cfun->machine->frame.args_size);
- RTX_FRAME_RELATED_P
- (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
- stack_pointer_rtx,
- offset))) = 1;
+ if (SMALL_OPERAND (cfun->machine->frame.args_size))
+ RTX_FRAME_RELATED_P
+ (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
+ stack_pointer_rtx,
+ offset))) = 1;
+ else
+ {
+ emit_move_insn (MIPS_PROLOGUE_TEMP (Pmode), offset);
+ emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
+ emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
+ hard_frame_pointer_rtx,
+ MIPS_PROLOGUE_TEMP (Pmode)));
+ mips_set_frame_expr
+ (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
+ plus_constant (stack_pointer_rtx,
+ cfun->machine->frame.args_size)));
+ }
}
else
RTX_FRAME_RELATED_P (emit_move_insn (hard_frame_pointer_rtx,