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