summaryrefslogtreecommitdiff
path: root/gcc/config/mips
diff options
context:
space:
mode:
authorcpopetz <cpopetz@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-14 21:19:51 +0000
committercpopetz <cpopetz@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-14 21:19:51 +0000
commit726e25884f2e4ce259199c5d747e44c63898920e (patch)
treef9a35a30ce0a91f50eb0507d969b47230adec015 /gcc/config/mips
parent8386a92abc77788a501a23c67853ab5f95437357 (diff)
downloadgcc-726e25884f2e4ce259199c5d747e44c63898920e.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31421 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/mips')
-rw-r--r--gcc/config/mips/mips.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 67859dff135..43601a7d782 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -1,5 +1,5 @@
/* 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);