OSDN Git Service

* v850.h (EXPAND_BUILTIN_VA_ARG): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Sep 1999 22:05:26 +0000 (22:05 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Sep 1999 22:05:26 +0000 (22:05 +0000)
        * v850.c (v850_va_arg): New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29146 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/v850/v850.c
gcc/config/v850/v850.h

index 4871d1a..fb9af08 100644 (file)
@@ -1,3 +1,8 @@
+Mon Sep  6 15:04:55 1999  Richard Henderson  <rth@cygnus.com>
+
+       * v850.h (EXPAND_BUILTIN_VA_ARG): New.
+       * v850.c (v850_va_arg): New.
+
 Tue Sep  7 09:36:01 1999  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
 
        * haifa-sched.c: Tidy comments.
index 44148b0..2b9b598 100644 (file)
@@ -3150,3 +3150,45 @@ v850_set_default_decl_attr (decl)
        }
     }
 }
+\f
+/* Implement `va_arg'.  */
+
+rtx
+v850_va_arg (valist, type)
+     tree valist, type;
+{
+  HOST_WIDE_INT size, rsize, align;
+  tree addr, incr;
+  rtx addr_rtx;
+  int indirect;
+
+  /* Round up sizeof(type) to a word.  */
+  size = int_size_in_bytes (type);
+  rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
+  indirect = 0;
+
+  if (size > 8)
+    {
+      size = rsize = UNITS_PER_WORD;
+      indirect = 1;
+    }
+
+  addr = save_expr (valist);
+  incr = fold (build (PLUS_EXPR, ptr_type_node, valist,
+                     build_int_2 (rsize, 0)));
+
+  incr = build (MODIFY_EXPR, ptr_type_node, valist, incr);
+  TREE_SIDE_EFFECTS (incr) = 1;
+  expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+  addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL);
+
+  if (indirect)
+    {
+      addr_rtx = force_reg (Pmode, addr_rtx);
+      addr_rtx = gen_rtx_MEM (Pmode, addr_rtx);
+      MEM_ALIAS_SET (addr_rtx) = get_varargs_alias_set ();
+    }
+
+  return addr_rtx;
+}
index 92483cc..b045f83 100644 (file)
@@ -735,6 +735,10 @@ extern int current_function_anonymous_args;
 #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \
   current_function_anonymous_args = (!TARGET_GHS ? 1 : 0);
 
+/* Implement `va_arg'.  */
+#define EXPAND_BUILTIN_VA_ARG(valist, type) \
+  v850_va_arg (valist, type)
+
 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED)         \
   ((TYPE) && int_size_in_bytes (TYPE) > 8)
  
@@ -1663,3 +1667,4 @@ extern int    v850_handle_pragma            PROTO ((int (*)(void), void (*)(int)
 extern void   v850_encode_data_area         ();
 extern void   v850_set_default_decl_attr    ();
 extern v850_data_area v850_get_data_area    ();
+extern struct rtx_def *v850_va_arg         ();