Vectors should be passed in memory for IAMCU.

OK for trunk?

H.J.
---
gcc/

        PR target/66806
        * config/i386/i386.c (function_arg_advance_32): Don't pass
        vectors in registers for IAMCU.
        (function_arg_32): Likewise.
        (ix86_return_in_memory): Don't return vectors in registers for
        IAMCU.

gcc/testsuite/

        PR target/66806
        * gcc.target/i386/pr66806.c: New test.
---
 gcc/config/i386/i386.c                  |  6 +++---
 gcc/testsuite/gcc.target/i386/pr66806.c | 23 +++++++++++++++++++++++
 2 files changed, 26 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr66806.c

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 112eb1c..ca192a2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7552,7 +7552,7 @@ function_arg_advance_32 (CUMULATIVE_ARGS *cum, 
machine_mode mode,
     {
       /* Intel MCU psABI passes scalars and aggregates no larger than 8
         bytes in registers.  */
-      if (bytes <= 8)
+      if (!VECTOR_MODE_P (mode) && bytes <= 8)
        goto pass_in_reg;
       return res;
     }
@@ -7809,7 +7809,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, machine_mode mode,
     {
       /* Intel MCU psABI passes scalars and aggregates no larger than 8
         bytes in registers.  */
-      if (bytes <= 8)
+      if (!VECTOR_MODE_P (mode) && bytes <= 8)
        goto pass_in_reg;
       return NULL_RTX;
     }
@@ -8679,7 +8679,7 @@ ix86_return_in_memory (const_tree type, const_tree fntype 
ATTRIBUTE_UNUSED)
       /* Intel MCU psABI returns scalars and aggregates no larger than 8
         bytes in registers.  */
       if (TARGET_IAMCU)
-       return size > 8;
+       return VECTOR_MODE_P (mode) || size > 8;
 
       if (mode == BLKmode)
        return true;
diff --git a/gcc/testsuite/gcc.target/i386/pr66806.c 
b/gcc/testsuite/gcc.target/i386/pr66806.c
new file mode 100644
index 0000000..211a04f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr66806.c
@@ -0,0 +1,23 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-miamcu -mno-sse -mno-mmx -miamcu -Wno-psabi" } */
+
+typedef unsigned int V2SImode __attribute__((vector_size(8)));
+extern V2SImode data_V2SImode;
+
+V2SImode
+r_V2SImode (V2SImode x)
+{
+  return x;
+}
+
+void
+p_V2SImode (V2SImode x)
+{
+  data_V2SImode = x;
+}
+
+void 
+s_V2SImode (void)
+{
+  p_V2SImode (data_V2SImode);
+}
-- 
2.4.3

Reply via email to