xtensa.c (xtensa_va_arg): Handle complex values as separate real and imaginary parts.
authorBob Wilson <bob.wilson@acm.org>
Fri, 23 Jan 2004 22:12:34 +0000 (22:12 +0000)
committerBob Wilson <bwilson@gcc.gnu.org>
Fri, 23 Jan 2004 22:12:34 +0000 (22:12 +0000)
* 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
gcc/config/xtensa/xtensa.c
gcc/config/xtensa/xtensa.h

index 1a74cba..54ba106 100644 (file)
@@ -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
index d7e2902..0debc3e 100644 (file)
@@ -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);
index a7f470e..88d1ba8 100644 (file)
@@ -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.,