Fix for latent bug in splitting arguments exposed by rs6000_arg_partial_bytes rewrite.
authorAlan Modra <amodra@bigpond.net.au>
Thu, 21 Apr 2005 15:36:01 +0000 (15:36 +0000)
committerFariborz Jahanian <fjahanian@gcc.gnu.org>
Thu, 21 Apr 2005 15:36:01 +0000 (15:36 +0000)
Fix for latent bug in splitting arguments exposed by
rs6000_arg_partial_bytes rewrite.
Oked by Richard Henderson.

Co-Authored-By: Fariborz Jahanian <fjahanian@apple.com>
From-SVN: r98507

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/expr.c

index ccf6e64d198e202fcfd67ab6d2e709e3199b1b0b..7ab26e5894a3fba1ec9ba1421b0bd0603b7f2329 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-21 Alan Modra  <amodra@bigpond.net.au>
+           Fariborz Jahanian <fjahanian@apple.com>
+
+        * config/rs6000/rs6000.c (rs6000_arg_partial_bytes): Fix size of
+        portion of argument passed in fpr.
+        *expr.c (emit_push_insn): Fix computation of 'offset' used to
+        decide on partial argument save on stack.
+
 2005-04-21  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/sparc/predicates.md, config/sparc/sparc.md: Fix
index d2d44c7997b6b1eebd5afb332b88c0ae37139b4d..e3ef7452e4c592e6bcb8ac8eb61b7f5c9885a7a5 100644 (file)
@@ -4951,16 +4951,14 @@ rs6000_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
                   && align_words >= GP_ARG_NUM_REG))))
     {
       if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1)
-       ret = FP_ARG_MAX_REG + 1 - cum->fregno;
+       ret = (FP_ARG_MAX_REG + 1 - cum->fregno) * 8;
       else if (cum->nargs_prototype >= 0)
        return 0;
     }
 
   if (align_words < GP_ARG_NUM_REG
       && GP_ARG_NUM_REG < align_words + rs6000_arg_size (mode, type))
-    ret = GP_ARG_NUM_REG - align_words;
-
-  ret *= (TARGET_32BIT ? 4 : 8);
+    ret = (GP_ARG_NUM_REG - align_words) * (TARGET_32BIT ? 4 : 8);
 
   if (ret != 0 && TARGET_DEBUG_ARG)
     fprintf (stderr, "rs6000_arg_partial_bytes: %d\n", ret);
index b334453efd597677284aedc53389a2ace9483b88..02236af2c3d74f2b9ed83670c565ad7eee8618f6 100644 (file)
@@ -3544,7 +3544,7 @@ emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size,
       int not_stack;
       /* # bytes of start of argument
         that we must make space for but need not store.  */
-      int offset = partial % (PARM_BOUNDARY / BITS_PER_WORD);
+      int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
       int args_offset = INTVAL (args_so_far);
       int skip;
 
@@ -3562,8 +3562,9 @@ emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size,
        offset = 0;
 
       /* Now NOT_STACK gets the number of words that we don't need to
-        allocate on the stack.  */
+        allocate on the stack. Convert OFFSET to words too. */
       not_stack = (partial - offset) / UNITS_PER_WORD;
+      offset /= UNITS_PER_WORD;
 
       /* If the partial register-part of the arg counts in its stack size,
         skip the part of stack space corresponding to the registers.