diff options
author | David Ung <davidu@mips.com> | 2005-08-26 13:15:14 +0000 |
---|---|---|
committer | David Ung <davidu@gcc.gnu.org> | 2005-08-26 13:15:14 +0000 |
commit | e296c00c3209450305f5cf270d9cba03cba38a1c (patch) | |
tree | 0bf450f5cec56c1f9e4430e0790f0a3395d7b449 /gcc | |
parent | 55d61dbaccbb0d9bf0c758f7819fd062b29c68c3 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 21 |
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, |