diff mbox

PR target/66806: Don't pass/return vectors in registers for IAMCU

Message ID 20150708114118.GA22923@intel.com
State New
Headers show

Commit Message

H.J. Lu July 8, 2015, 11:41 a.m. UTC
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

Comments

Uros Bizjak July 8, 2015, 11:46 a.m. UTC | #1
On Wed, Jul 8, 2015 at 1:41 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Vectors should be passed in memory for IAMCU.
>
> OK for trunk?

Bootstrapped and regression tested?

Uros.
Uros Bizjak July 8, 2015, 11:49 a.m. UTC | #2
On Wed, Jul 8, 2015 at 1:41 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> 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.

> +/* { dg-do compile { target ia32 } } */
> +/* { dg-options "-miamcu -mno-sse -mno-mmx -miamcu -Wno-psabi" } */

Double -miamcu.

Also, why Wno-psabi? We can check for the warning here, too.

Uros.
diff mbox

Patch

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);
+}