OSDN Git Service

* mn10300.c (mn10300_builtin_saveregs): Use get_varargs_alias_set
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jul 1999 18:23:04 +0000 (18:23 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Jul 1999 18:23:04 +0000 (18:23 +0000)
        and tag the spill mems.
        (mn10300_va_start): New.
        (mn10300_va_arg): New.
        * mn10300.h (EXPAND_BUILTIN_VA_START): New.
        (EXPAND_BUILTIN_VA_ARG): New.

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

gcc/ChangeLog
gcc/config/mn10300/mn10300.c
gcc/config/mn10300/mn10300.h

index 37c69fc..a25c1a0 100644 (file)
@@ -1,3 +1,12 @@
+Wed Jul 28 11:22:21 1999  Richard Henderson  <rth@cygnus.com>
+
+       * mn10300.c (mn10300_builtin_saveregs): Use get_varargs_alias_set
+       and tag the spill mems.
+       (mn10300_va_start): New.
+       (mn10300_va_arg): New.
+       * mn10300.h (EXPAND_BUILTIN_VA_START): New.
+       (EXPAND_BUILTIN_VA_ARG): New.
+
 Wed Jul 28 11:20:19 1999  Richard Henderson  <rth@cygnus.com>
 
        * mn10200.c (mn10200_va_arg): New.
index cd7559f..cf84e48 100644 (file)
@@ -629,29 +629,82 @@ initial_offset (from, to)
 rtx
 mn10300_builtin_saveregs ()
 {
-  rtx offset;
+  rtx offset, mem;
   tree fntype = TREE_TYPE (current_function_decl);
   int argadj = ((!(TYPE_ARG_TYPES (fntype) != 0
                    && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
                        != void_type_node)))
                 ? UNITS_PER_WORD : 0);
+  int set = get_varargs_alias_set ();
 
   if (argadj)
     offset = plus_constant (current_function_arg_offset_rtx, argadj);
   else
     offset = current_function_arg_offset_rtx;
 
-  emit_move_insn (gen_rtx (MEM, SImode, current_function_internal_arg_pointer),
-                 gen_rtx (REG, SImode, 0));
-  emit_move_insn (gen_rtx (MEM, SImode,
-                          plus_constant
-                            (current_function_internal_arg_pointer, 4)),
-                 gen_rtx (REG, SImode, 1));
+  mem = gen_rtx_MEM (SImode, current_function_internal_arg_pointer);
+  MEM_ALIAS_SET (mem) = set;
+  emit_move_insn (mem, gen_rtx_REG (SImode, 0));
+
+  mem = gen_rtx_MEM (SImode,
+                    plus_constant (current_function_internal_arg_pointer, 4));
+  MEM_ALIAS_SET (mem) = set;
+  emit_move_insn (mem, gen_rtx_REG (SImode, 1));
+
   return copy_to_reg (expand_binop (Pmode, add_optab,
                                    current_function_internal_arg_pointer,
                                    offset, 0, 0, OPTAB_LIB_WIDEN));
 }
 
+void
+mn10300_va_start (stdarg_p, valist, nextarg)
+     int stdarg_p;
+     tree valist;
+     rtx nextarg;
+{
+  if (stdarg_p)
+    nextarg = expand_builtin_saveregs ();
+
+  std_expand_builtin_va_start (stdarg_p, valist, nextarg);
+}
+
+rtx
+mn10300_va_arg (valist, type)
+     tree valist, type;
+{
+  HOST_WIDE_INT align, rsize;
+  tree t, ptr, pptr;
+
+  /* Compute the rounded size of the type.  */
+  align = PARM_BOUNDARY / BITS_PER_UNIT;
+  rsize = (((int_size_in_bytes (type) + align - 1) / align) * align);
+
+  t = build (POSTINCREMENT_EXPR, TREE_TYPE (valist), valist, 
+            build_int_2 ((rsize > 8 ? 4 : rsize), 0));
+  TREE_SIDE_EFFECTS (t) = 1;
+
+  ptr = build_pointer_type (type);
+
+  /* "Large" types are passed by reference.  */
+  if (rsize > 8)
+    {
+      pptr = build_pointer_type (ptr);
+      t = build1 (NOP_EXPR, pptr, t);
+      TREE_SIDE_EFFECTS (t) = 1;
+
+      t = build1 (INDIRECT_REF, ptr, t);
+      TREE_SIDE_EFFECTS (t) = 1;
+    }
+  else
+    {
+      t = build1 (NOP_EXPR, ptr, t);
+      TREE_SIDE_EFFECTS (t) = 1;
+    }
+
+  /* Calculate!  */
+  return expand_expr (t, NULL_RTX, Pmode, EXPAND_NORMAL);
+}
+
 /* Return an RTX to represent where a value with mode MODE will be returned
    from a function.  If the result is 0, the argument is pushed.  */
 
index b7b64e5..548ce82 100644 (file)
@@ -472,7 +472,6 @@ extern struct rtx_def *function_arg ();
 
 #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
   function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED)
-
 \f
 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED)         \
   ((TYPE) && int_size_in_bytes (TYPE) > 8)
@@ -572,6 +571,16 @@ extern struct rtx_def *function_arg ();
 extern struct rtx_def *mn10300_builtin_saveregs ();
 #define EXPAND_BUILTIN_SAVEREGS() mn10300_builtin_saveregs ()
 
+/* Implement `va_start' for varargs and stdarg.  */
+extern void mn10300_va_start();
+#define EXPAND_BUILTIN_VA_START(stdarg, valist, nextarg) \
+  mn10300_va_start (stdarg, valist, nextarg)
+
+/* Implement `va_arg'.  */
+extern struct rtx_def *mn10300_va_arg();
+#define EXPAND_BUILTIN_VA_ARG(valist, type) \
+  mn10300_va_arg (valist, type)
+
 /* Addressing modes, and classification of registers for them.  */
 
 \f