From 57ec4709990925b193319480f1dd4d44ec37e903 Mon Sep 17 00:00:00 2001 From: Chandrakala Chavva Date: Wed, 27 Dec 2000 20:51:55 -0500 Subject: [PATCH] calls.c (store_one_arg): If parm is passed both in stack and in register and offset is greater than... * calls.c (store_one_arg): If parm is passed both in stack and in register and offset is greater than reg_parm_stack_space, split the offset and call emit_push_insn(). From-SVN: r38503 --- gcc/ChangeLog | 6 ++++++ gcc/calls.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6b885817df..b315295d741 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-12-27 Chandrakala Chavva + + * calls.c (store_one_arg): If parm is passed both in stack and in + register and offset is greater than reg_parm_stack_space, split + the offset and call emit_push_insn(). + 2000-12-27 Nick Clifton * ifcvt.c (noce_emit_store_flag): Handle jump insns that are diff --git a/gcc/calls.c b/gcc/calls.c index 9513c308507..51d5566d374 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -4535,6 +4535,30 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) } } + /* If parm is passed both in stack and in register and offset is + greater than reg_parm_stack_space, split the offset. */ + if (arg->reg && arg->pass_on_stack) + { + if (arg->offset.constant < reg_parm_stack_space && arg->offset.var) + error ("variable offset is passed paritially in stack and in reg"); + else if (arg->offset.constant < reg_parm_stack_space && arg->size.var) + error ("variable size is passed partially in stack and in reg"); + else if (arg->offset.constant < reg_parm_stack_space + && ((arg->offset.constant + arg->size.constant) + > reg_parm_stack_space)) + { + rtx size_rtx1 = GEN_INT (reg_parm_stack_space - arg->offset.constant); + emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx1, + TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT, + partial, reg, excess, argblock, + ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space, + ARGS_SIZE_RTX (arg->alignment_pad)); + + size_rtx = GEN_INT (INTVAL(size_rtx) - reg_parm_stack_space); + } + } + + emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx, TYPE_ALIGN (TREE_TYPE (pval)), partial, reg, excess, argblock, ARGS_SIZE_RTX (arg->offset), -- 2.30.2