From 3712281f9d5275e4b0e388ad78f62df874298726 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Fri, 23 Jan 2004 22:12:34 +0000 Subject: [PATCH] xtensa.c (xtensa_va_arg): Handle complex values as separate real and imaginary parts. * config/xtensa/xtensa.c (xtensa_va_arg): Handle complex values as separate real and imaginary parts. * config/xtensa/xtensa.h (SPLIT_COMPLEX_ARGS): Define. From-SVN: r76459 --- gcc/ChangeLog | 6 ++++++ gcc/config/xtensa/xtensa.c | 19 +++++++++++++++++++ gcc/config/xtensa/xtensa.h | 4 +++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a74cba04a1..54ba106b372 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-01-23 Bob Wilson + + * config/xtensa/xtensa.c (xtensa_va_arg): Handle complex values as + separate real and imaginary parts. + * config/xtensa/xtensa.h (SPLIT_COMPLEX_ARGS): Define. + 2004-01-23 Hartmut Penner PR target/13674 diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index d7e2902c277..0debc3ee615 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -2447,6 +2447,25 @@ xtensa_va_arg (tree valist, tree type) rtx array, orig_ndx, r, addr, size, va_size; rtx lab_false, lab_over, lab_false2; + /* Handle complex values as separate real and imaginary parts. */ + if (TREE_CODE (type) == COMPLEX_TYPE) + { + rtx real_part, imag_part, concat_val, local_copy; + + real_part = xtensa_va_arg (valist, TREE_TYPE (type)); + imag_part = xtensa_va_arg (valist, TREE_TYPE (type)); + + /* Make a copy of the value in case the parts are not contiguous. */ + real_part = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (type)), real_part); + imag_part = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (type)), imag_part); + concat_val = gen_rtx_CONCAT (TYPE_MODE (type), real_part, imag_part); + + local_copy = assign_temp (type, 0, 1, 0); + emit_move_insn (local_copy, concat_val); + + return XEXP (local_copy, 0); + } + f_stk = TYPE_FIELDS (va_list_type_node); f_reg = TREE_CHAIN (f_stk); f_ndx = TREE_CHAIN (f_reg); diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index a7f470ec0b5..88d1ba85189 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -806,7 +806,6 @@ typedef struct xtensa_args { ? PARM_BOUNDARY \ : GET_MODE_ALIGNMENT (MODE))) - /* Nonzero if we do not know how to pass TYPE solely in registers. We cannot do so in the following cases: @@ -823,6 +822,9 @@ typedef struct xtensa_args { && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \ || TREE_ADDRESSABLE (TYPE))) +/* Pass complex arguments independently. */ +#define SPLIT_COMPLEX_ARGS 1 + /* Profiling Xtensa code is typically done with the built-in profiling feature of Tensilica's instruction set simulator, which does not require any compiler support. Profiling code on a real (i.e.,