mips.c (mips_arg_info): If MUST_PASS_IN_STACK, skip any remaining register arguments.
authorRichard Sandiford <rsandifo@redhat.com>
Mon, 6 Oct 2003 17:48:25 +0000 (17:48 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 6 Oct 2003 17:48:25 +0000 (17:48 +0000)
* config/mips/mips.c (mips_arg_info): If MUST_PASS_IN_STACK,
skip any remaining register arguments.

From-SVN: r72156

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

index b39d79c1b04b0a9a2d73de77f7814c88ce68c4c3..5e01a062a6de948926b5562bf17a92855c43b0d7 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-06  Richard Sandiford  <rsandifo@redhat.com>
+
+       * config/mips/mips.c (mips_arg_info): If MUST_PASS_IN_STACK,
+       skip any remaining register arguments.
+
 2003-10-06  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * reload.c (find_reloads_subreg_address): Use correct offset for
index 0d2f931384575f04db95670f6dbd6a7fcb13fc34..bcd9586c9554c89d48e64a490d491b9a17efb605 100644 (file)
@@ -3644,15 +3644,22 @@ mips_arg_info (const CUMULATIVE_ARGS *cum, enum machine_mode mode,
        even_reg_p = true;
     }
 
-  /* Set REG_OFFSET to the register count we're interested in.
-     The EABI allocates the floating-point registers separately,
-     but the other ABIs allocate them like integer registers.  */
-  info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
-                     ? cum->num_fprs
-                     : cum->num_gprs);
+  if (mips_abi != ABI_EABI && MUST_PASS_IN_STACK (mode, type))
+    /* This argument must be passed on the stack.  Eat up all the
+       remaining registers.  */
+    info->reg_offset = MAX_ARGS_IN_REGISTERS;
+  else
+    {
+      /* Set REG_OFFSET to the register count we're interested in.
+        The EABI allocates the floating-point registers separately,
+        but the other ABIs allocate them like integer registers.  */
+      info->reg_offset = (mips_abi == ABI_EABI && info->fpr_p
+                         ? cum->num_fprs
+                         : cum->num_gprs);
 
-  if (even_reg_p)
-    info->reg_offset += info->reg_offset & 1;
+      if (even_reg_p)
+       info->reg_offset += info->reg_offset & 1;
+    }
 
   /* The alignment applied to registers is also applied to stack arguments.  */
   info->stack_offset = cum->stack_words;