xtensa.c (xtensa_va_arg): Fix to handle arguments for which MUST_PASS_IN_STACK is true (e.g....

* config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
        for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).

From-SVN: r51700
This commit is contained in:
Bob Wilson 2002-04-01 19:52:18 +00:00 committed by Bob Wilson
parent ed4168d56f
commit bcf88f9b91
2 changed files with 25 additions and 13 deletions

View File

@ -1,3 +1,8 @@
2002-04-01 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).
2002-04-01 Neil Booth <neil@daikokuya.demon.co.uk>
* c-common.c (unsigned_conversion_warning, convert_and_check,

View File

@ -2496,26 +2496,32 @@ xtensa_va_arg (valist, type)
/* Check if the argument is in registers:
if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4)
if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4
&& !MUST_PASS_IN_STACK (type))
__array = (AP).__va_reg;
*/
lab_false = gen_label_rtx ();
lab_over = gen_label_rtx ();
array = gen_reg_rtx (Pmode);
emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode, EXPAND_NORMAL),
GEN_INT (MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD),
GT, const1_rtx, SImode, 0, lab_false);
if (!MUST_PASS_IN_STACK (VOIDmode, type))
{
lab_false = gen_label_rtx ();
lab_over = gen_label_rtx ();
r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
if (r != array)
emit_move_insn (array, r);
emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode,
EXPAND_NORMAL),
GEN_INT (MAX_ARGS_IN_REGISTERS
* UNITS_PER_WORD),
GT, const1_rtx, SImode, 0, lab_false);
emit_jump_insn (gen_jump (lab_over));
emit_barrier ();
emit_label (lab_false);
r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
if (r != array)
emit_move_insn (array, r);
emit_jump_insn (gen_jump (lab_over));
emit_barrier ();
emit_label (lab_false);
}
/* ...otherwise, the argument is on the stack (never split between
registers and the stack -- change __va_ndx if necessary):
@ -2545,7 +2551,8 @@ xtensa_va_arg (valist, type)
if (r != array)
emit_move_insn (array, r);
emit_label (lab_over);
if (!MUST_PASS_IN_STACK (VOIDmode, type))
emit_label (lab_over);
/* Given the base array pointer (__array) and index to the subsequent