rs6000.c (rs6000_va_arg <ABI_V4>): Don't use UNITS_PER_WORD to calculate gpr size.
authorAlan Modra <amodra@bigpond.net.au>
Sat, 15 May 2004 12:39:34 +0000 (12:39 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Sat, 15 May 2004 12:39:34 +0000 (22:09 +0930)
* config/rs6000/rs6000.c (rs6000_va_arg <ABI_V4>): Don't use
UNITS_PER_WORD to calculate gpr size.  Re-instate code to set reg
count to 8 to handle n_reg > 2.

From-SVN: r81880

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

index 808ed608ae97aefeb2426b38db402700f62384aa..65f431ad9a78173cb43d4edb44bad7ec0c29e819 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-15  Alan Modra  <amodra@bigpond.net.au>
+
+       * config/rs6000/rs6000.c (rs6000_va_arg <ABI_V4>): Don't use
+       UNITS_PER_WORD to calculate gpr size.  Re-instate code to set reg
+       count to 8 to handle n_reg > 2.
+
 2004-05-15  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * doc/extend.texi: Update WG14 URL.
index 9f6301b3910aa82d82b8c1a166a9e73e7da5b5ff..4dfabe1b00b9c540873cb0797d5ebdaebcea4cfc 100644 (file)
@@ -5144,7 +5144,7 @@ rs6000_va_arg (tree valist, tree type)
   sav = build (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav);
 
   size = int_size_in_bytes (type);
-  rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+  rsize = (size + 3) / 4;
   align = 1;
 
   if (AGGREGATE_TYPE_P (type)
@@ -5158,7 +5158,7 @@ rs6000_va_arg (tree valist, tree type)
       n_reg = 1;
       sav_ofs = 0;
       sav_scale = 4;
-      size = UNITS_PER_WORD;
+      size = 4;
       rsize = 1;
     }
   else if (TARGET_HARD_FLOAT && TARGET_FPRS
@@ -5240,6 +5240,14 @@ rs6000_va_arg (tree valist, tree type)
       emit_barrier ();
 
       emit_label (lab_false);
+      if (n_reg > 2)
+       {
+         /* Ensure that we don't find any more args in regs.
+            Alignment has taken care of the n_reg == 2 case.  */
+         t = build (MODIFY_EXPR, TREE_TYPE (reg), reg, build_int_2 (8, 0));
+         TREE_SIDE_EFFECTS (t) = 1;
+         expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+       }
     }
 
   /* ... otherwise out of the overflow area.  */