]> gcc.gnu.org Git - gcc.git/commitdiff
alpha.c (alpha_va_arg): Manipulate the type size as a tree.
authorRichard Henderson <rth@redhat.com>
Fri, 15 Mar 2002 23:13:04 +0000 (15:13 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 15 Mar 2002 23:13:04 +0000 (15:13 -0800)
        * config/alpha/alpha.c (alpha_va_arg): Manipulate the type
        size as a tree.

From-SVN: r50857

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 1f10b0c936513be9f0d09b40fb1e552f7b36ff55..c866f74da1ba5e309a1cef4e91ff0de3da9c1812 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-15  Richard Henderson  <rth@redhat.com>
+
+       * config/alpha/alpha.c (alpha_va_arg): Manipulate the type
+       size as a tree.
+
 2002-03-15  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
 
        * config/m68hc11/m68hc11.md ("tstqi_1"): Try to use ldab instead of tst.
index ee82f96823500a50633332bf737d3467756b8235..ed25a7df49cc086ce199544c094d70007f638e88 100644 (file)
@@ -5767,9 +5767,8 @@ rtx
 alpha_va_arg (valist, type)
      tree valist, type;
 {
-  HOST_WIDE_INT tsize;
   rtx addr;
-  tree t;
+  tree t, type_size, rounded_size;
   tree offset_field, base_field, addr_tree, addend;
   tree wide_type, wide_ofs;
   int indirect = 0;
@@ -5777,7 +5776,18 @@ alpha_va_arg (valist, type)
   if (TARGET_ABI_OPEN_VMS || TARGET_ABI_UNICOSMK)
     return std_expand_builtin_va_arg (valist, type);
 
-  tsize = ((TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_UNIT + 7) / 8) * 8;
+  if (type == error_mark_node
+      || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
+      || TREE_OVERFLOW (type_size))
+    rounded_size = size_zero_node;
+  else
+    rounded_size = fold (build (MULT_EXPR, sizetype,
+                               fold (build (TRUNC_DIV_EXPR, sizetype,
+                                            fold (build (PLUS_EXPR, sizetype,
+                                                         type_size,
+                                                         size_int (7))),
+                                            size_int (8))),
+                               size_int (8)));
 
   base_field = TYPE_FIELDS (TREE_TYPE (valist));
   offset_field = TREE_CHAIN (base_field);
@@ -5795,7 +5805,7 @@ alpha_va_arg (valist, type)
   if (TYPE_MODE (type) == TFmode || TYPE_MODE (type) == TCmode)
     {
       indirect = 1;
-      tsize = UNITS_PER_WORD;
+      rounded_size = size_int (UNITS_PER_WORD);
     }
   else if (FLOAT_TYPE_P (type))
     {
@@ -5819,7 +5829,7 @@ alpha_va_arg (valist, type)
 
   t = build (MODIFY_EXPR, TREE_TYPE (offset_field), offset_field,
             build (PLUS_EXPR, TREE_TYPE (offset_field), 
-                   offset_field, build_int_2 (tsize, 0)));
+                   offset_field, rounded_size));
   TREE_SIDE_EFFECTS (t) = 1;
   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
 
This page took 0.698133 seconds and 5 git commands to generate.