diff options
author | Bob Wilson <bob.wilson@acm.org> | 2002-04-01 19:52:18 +0000 |
---|---|---|
committer | Bob Wilson <bwilson@gcc.gnu.org> | 2002-04-01 19:52:18 +0000 |
commit | bcf88f9b91e911d01ba43026f15eaa4858e23e4c (patch) | |
tree | c00059b72636edee78bb612232b5a761d9aaa7f0 | |
parent | ed4168d56fca29ef1678edcde2346f18bea80c1d (diff) | |
download | gcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.zip gcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.tar.gz gcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.c | 33 |
2 files changed, 25 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba1c60b..fa98fbb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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, diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index 0455737..c6bc959 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -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 |