mips.c (mips_expand_prologue): Handle case when generating for MIPS16 and the outgoin...
authorDavid Ung <davidu@mips.com>
Fri, 26 Aug 2005 13:15:14 +0000 (13:15 +0000)
committerDavid Ung <davidu@gcc.gnu.org>
Fri, 26 Aug 2005 13:15:14 +0000 (13:15 +0000)
* 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

gcc/ChangeLog
gcc/config/mips/mips.c

index 5ed3aca1cc762e19bec66c1b9cd39beb26a2edf3..4cf749a45470354799d39fb6e9d0fada16534196 100644 (file)
@@ -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
index af2db04f61a0eb88f8c0e949f3fc32f5ac43b46b..154ec302afad433d6cec77d795e907f1f433326e 100644 (file)
@@ -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,