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
This commit is contained in:
parent
99e5c00bc4
commit
3712281f9d
@ -1,3 +1,9 @@
|
||||
2004-01-23 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* 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 <hpenner@de.ibm.com>
|
||||
|
||||
PR target/13674
|
||||
|
@ -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);
|
||||
|
@ -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.,
|
||||
|
Loading…
x
Reference in New Issue
Block a user