OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Sep 2011 19:25:39 +0000 (19:25 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Sep 2011 19:25:39 +0000 (19:25 +0000)
* config/mips/mips.c (mips16e_save_restore_reg): Add a reg_parm_p
argument.
(mips16e_build_save_restore): Update accordingly.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178793 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 311cb8d..29c86fb 100644 (file)
@@ -1,3 +1,9 @@
+2011-09-12  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/mips/mips.c (mips16e_save_restore_reg): Add a reg_parm_p
+       argument.
+       (mips16e_build_save_restore): Update accordingly.
+
 2011-09-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/50212
index a0e93c5..a5fed3d 100644 (file)
@@ -8365,20 +8365,22 @@ mips16e_collect_argument_saves (void)
 }
 
 /* Return a move between register REGNO and memory location SP + OFFSET.
-   Make the move a load if RESTORE_P, otherwise make it a frame-related
-   store.  */
+   REG_PARM_P is true if SP + OFFSET belongs to REG_PARM_STACK_SPACE.
+   Make the move a load if RESTORE_P, otherwise make it a store.  */
 
 static rtx
-mips16e_save_restore_reg (bool restore_p, HOST_WIDE_INT offset,
-                         unsigned int regno)
+mips16e_save_restore_reg (bool restore_p, bool reg_parm_p,
+                         HOST_WIDE_INT offset, unsigned int regno)
 {
   rtx reg, mem;
 
   mem = gen_frame_mem (SImode, plus_constant (stack_pointer_rtx, offset));
   reg = gen_rtx_REG (SImode, regno);
-  return (restore_p
-         ? gen_rtx_SET (VOIDmode, reg, mem)
-         : mips_frame_set (mem, reg));
+  if (restore_p)
+    return gen_rtx_SET (VOIDmode, reg, mem);
+  if (reg_parm_p)
+    return gen_rtx_SET (VOIDmode, mem, reg);
+  return mips_frame_set (mem, reg);
 }
 
 /* Return RTL for a MIPS16e SAVE or RESTORE instruction; RESTORE_P says which.
@@ -8440,7 +8442,8 @@ mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
   for (i = 0; i < nargs; i++)
     {
       offset = top_offset + i * UNITS_PER_WORD;
-      set = mips16e_save_restore_reg (restore_p, offset, GP_ARG_FIRST + i);
+      set = mips16e_save_restore_reg (restore_p, true, offset,
+                                     GP_ARG_FIRST + i);
       XVECEXP (pattern, 0, n++) = set;
     }
 
@@ -8452,7 +8455,7 @@ mips16e_build_save_restore (bool restore_p, unsigned int *mask_ptr,
       if (BITSET_P (*mask_ptr, regno))
        {
          offset -= UNITS_PER_WORD;
-         set = mips16e_save_restore_reg (restore_p, offset, regno);
+         set = mips16e_save_restore_reg (restore_p, false, offset, regno);
          XVECEXP (pattern, 0, n++) = set;
          *mask_ptr &= ~(1 << regno);
        }