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