]> gcc.gnu.org Git - gcc.git/commitdiff
rs6000.h (PAD_VARARGS_DOWN): Define.
authorDavid Edelsohn <edelsohn@gnu.org>
Wed, 13 Mar 2002 16:57:48 +0000 (16:57 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Wed, 13 Mar 2002 16:57:48 +0000 (11:57 -0500)
        * config/rs6000/rs6000.h (PAD_VARARGS_DOWN): Define.
        * config/rs6000/rs6000.c (rs6000_va_arg): Use
        std_expand_builtin_va_arg if not ABI_V4.

From-SVN: r50739

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

index 2ee542cae722ac231f18ff41f736d0b5c397aa12..a9bbb13a4018e174b06ab3f0333fa1890ecbaea9 100644 (file)
@@ -1,3 +1,9 @@
+2002-03-13  David Edelsohn  <edelsohn@gnu.org>
+
+       * config/rs6000/rs6000.h (PAD_VARARGS_DOWN): Define.
+       * config/rs6000/rs6000.c (rs6000_va_arg): Use
+       std_expand_builtin_va_arg if not ABI_V4.
+
 2002-03-13  Jason Merrill  <jason@redhat.com>
 
        * varasm.c (globalize_decl): New fn.
index d2046a16845012613360de18b0ec40c671612505..8ad9fa52e419eeb661a0fe69640c9ef9adf42979 100644 (file)
@@ -2903,8 +2903,6 @@ setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
   if (DEFAULT_ABI == ABI_V4)
     {
       /* Indicate to allocate space on the stack for varargs save area.  */
-      /* ??? Does this really have to be located at a magic spot on the
-        stack, or can we allocate this with assign_stack_local instead.  */
       cfun->machine->sysv_varargs_p = 1;
       if (! no_rtl)
        save_area = plus_constant (virtual_stack_vars_rtx,
@@ -3096,48 +3094,8 @@ rs6000_va_arg (valist, type)
   int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
   rtx lab_false, lab_over, addr_rtx, r;
 
-  /* For AIX, the rule is that structures are passed left-aligned in
-     their stack slot.  However, GCC does not presently do this:
-     structures which are the same size as integer types are passed
-     right-aligned, as if they were in fact integers.  This only
-     matters for structures of size 1 or 2, or 4 when TARGET_64BIT.  */
   if (DEFAULT_ABI != ABI_V4)
-    {
-      HOST_WIDE_INT align, rounded_size;
-      enum machine_mode mode;
-      tree addr_tree;
-
-      /* Compute the rounded size of the type.  */
-      align = PARM_BOUNDARY / BITS_PER_UNIT;
-      rounded_size = (((int_size_in_bytes (type) + align - 1) / align)
-                     * align);
-
-      addr_tree = valist;
-
-      mode = TYPE_MODE (type);
-      if (mode != BLKmode)
-       {
-         HOST_WIDE_INT adj;
-         adj = TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_UNIT;
-         if (rounded_size > align)
-           adj = rounded_size;
-         
-         addr_tree = build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
-                            build_int_2 (rounded_size - adj, 0));
-       }
-
-      addr_rtx = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
-      addr_rtx = copy_to_reg (addr_rtx);
-      
-      /* Compute new value for AP.  */
-      t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
-                build (PLUS_EXPR, TREE_TYPE (valist), valist,
-                       build_int_2 (rounded_size, 0)));
-      TREE_SIDE_EFFECTS (t) = 1;
-      expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-      
-      return addr_rtx;
-    }
+    return std_expand_builtin_va_arg (valist, type);
 
   f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
   f_fpr = TREE_CHAIN (f_gpr);
index a103102d006d0e16454a641d2273c7c0ab6340fd..ed8f0fb9d8f8ded857afec4d5403c18b971c5e9b 100644 (file)
@@ -1697,6 +1697,14 @@ typedef struct rs6000_args
 #define EXPAND_BUILTIN_VA_ARG(valist, type) \
   rs6000_va_arg (valist, type)
 
+/* For AIX, the rule is that structures are passed left-aligned in
+   their stack slot.  However, GCC does not presently do this:
+   structures which are the same size as integer types are passed
+   right-aligned, as if they were in fact integers.  This only
+   matters for structures of size 1 or 2, or 4 when TARGET_64BIT.
+   ABI_V4 does not use std_expand_builtin_va_arg.  */
+#define PAD_VARARGS_DOWN (TYPE_MODE (type) != BLKmode)
+
 /* Define this macro to be a nonzero value if the location where a function
    argument is passed depends on whether or not it is a named argument.  */
 #define STRICT_ARGUMENT_NAMING 1
This page took 0.087451 seconds and 5 git commands to generate.