Commit 5e4f6244 by Clinton Popetz Committed by Clinton Popetz

builtins.c (PAD_VARARGS_DOWN): Define.

	* 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.

From-SVN: r31421
parent 06be9173
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
......
......@@ -51,6 +51,10 @@ Boston, MA 02111-1307, USA. */
#define OUTGOING_REGNO(IN) (IN)
#endif
#ifndef PAD_VARARGS_DOWN
#define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
#endif
tree (*lang_type_promotes_to) PARAMS ((tree));
static int get_pointer_alignment PARAMS ((tree, unsigned));
......@@ -1967,7 +1971,7 @@ std_expand_builtin_va_arg (valist, type)
/* Get AP. */
addr_tree = valist;
if (BYTES_BIG_ENDIAN)
if (PAD_VARARGS_DOWN)
{
/* Small args are padded downward. */
......
/* 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
......@@ -4045,11 +4045,10 @@ mips_va_start (stdarg_p, valist, nextarg)
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)
{
......@@ -4059,6 +4058,11 @@ mips_va_start (stdarg_p, valist, nextarg)
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);
......@@ -4084,16 +4088,15 @@ mips_va_start (stdarg_p, valist, nextarg)
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,
......@@ -4199,6 +4202,9 @@ mips_va_arg (valist, type)
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);
......
......@@ -2943,6 +2943,14 @@ For little-endian machines, the default is to pad upward. For
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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment