+2000-01-14 Clinton Popetz <cpopetz@cygnus.com>
+
+ * builtins.c (PAD_VARARGS_DOWN): Define.
+ (std_expand_builtin_va_arg): Use the above macro.
+ * config/mips/mips.c (PAD_VARARGS_DOWN): Define.
+ * tm.texi (Register Arguments): Document the above macro.
+
2000-01-14 Nick Clifton <nickc@cygnus.com>
* emit-rtl.c (emit_insn): If checking is enabled, make sure
/* Subroutines for insn-output.c for MIPS
- Copyright (C) 1989, 90, 91, 93-98, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1989, 90, 91, 93-98, 1999, 2000 Free Software Foundation, Inc.
Contributed by A. Lichnewsky, lich@inria.inria.fr.
Changes by Michael Meissner, meissner@osf.org.
64 bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
tree valist;
rtx nextarg;
{
- int arg_words, fp_arg_words;
+ int arg_words;
tree t;
arg_words = current_function_args_info.arg_words;
- fp_arg_words = current_function_args_info.fp_arg_words;
if (mips_abi == ABI_EABI)
{
tree gprv, fprv;
int gpro, fpro;
+ fpro = (8 - current_function_args_info.fp_arg_words);
+
+ if (!TARGET_64BIT)
+ fpro /= 2;
+
f_fpr = TYPE_FIELDS (va_list_type_node);
f_rem = TREE_CHAIN (f_fpr);
f_gpr = TREE_CHAIN (f_rem);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
t = build (MODIFY_EXPR, integer_type_node, rem,
- build_int_2 (8 - fp_arg_words, 0));
+ build_int_2 (fpro, 0));
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
- fpro = (8 - fp_arg_words) * 8;
if (fpro == 0)
fprv = gprv;
else
fprv = fold (build (PLUS_EXPR, ptr_type_node, gprv,
- build_int_2 (-fpro, -1)));
+ build_int_2 (-(fpro*8), -1)));
if (! TARGET_64BIT)
fprv = fold (build (BIT_AND_EXPR, ptr_type_node, fprv,
if (r != addr_rtx)
emit_move_insn (addr_rtx, r);
+ /* Ensure that the POSTINCREMENT is emitted before lab_over */
+ emit_queue();
+
emit_jump (lab_over);
emit_barrier ();
emit_label (lab_false);
big-endian machines, the default is to pad downward for an argument of
constant size shorter than an @code{int}, and upward otherwise.
+@findex PAD_VARARGS_DOWN
+@item PAD_VARARGS_DOWN
+If defined, a C expression which determines whether the default
+implementation of va_arg will attempt to pad down before reading the
+next argument, if that argument is smaller than its aligned space as
+controlled by @code{PARM_BOUNDARY}. If this macro is not defined, all such
+arguments are padded down if @code{BYTES_BIG_ENDIAN} is true.
+
@findex FUNCTION_ARG_BOUNDARY
@item FUNCTION_ARG_BOUNDARY (@var{mode}, @var{type})
If defined, a C expression that gives the alignment boundary, in bits,