Commit 4c64d3dd by H.J. Lu

re PR target/39256 (__m256 isn't returned in ymm0 in 32bit)

gcc/

2008-02-21  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/39256
	* config/i386/i386.c (type_natural_mode): Remove an extra
	space in the warning message.
	(function_value_32): Handle 32-byte vector modes.
	(return_in_memory_32): Likewise.

gcc/testsuite/

2008-02-21  Uros Bizjak  <ubizjak@gmail.com>

	PR target/39256
	* gcc.target/i386/abi-2.c: New.

From-SVN: r144355
parent b4651327
2008-02-21 H.J. Lu <hongjiu.lu@intel.com>
PR target/39256
* config/i386/i386.c (type_natural_mode): Remove an extra
space in the warning message.
(function_value_32): Handle 32-byte vector modes.
(return_in_memory_32): Likewise.
2009-02-21 Richard Sandiford <rdsandiford@googlemail.com>
* loop-iv.c (truncate_value): New function.
......
......@@ -4759,7 +4759,7 @@ type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
{
warnedavx = true;
warning (0, "AVX vector argument without AVX "
" enabled changes the ABI");
"enabled changes the ABI");
}
return TYPE_MODE (type);
}
......@@ -6019,6 +6019,11 @@ function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
|| (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
regno = TARGET_SSE ? FIRST_SSE_REG : 0;
/* 32-byte vector modes in %ymm0. */
else if (mode == OImode
|| (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32))
regno = TARGET_AVX ? FIRST_SSE_REG : 0;
/* Floating point return values in %st(0) (unless -mno-fp-ret-in-387). */
else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
regno = FIRST_FLOAT_REG;
......@@ -6158,7 +6163,7 @@ return_in_memory_32 (const_tree type, enum machine_mode mode)
if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
return 0;
if (VECTOR_MODE_P (mode) || mode == TImode)
if (VECTOR_MODE_P (mode) || mode == TImode || mode == OImode)
{
/* User-created vectors small enough to fit in EAX. */
if (size < 8)
......@@ -6172,6 +6177,10 @@ return_in_memory_32 (const_tree type, enum machine_mode mode)
/* SSE values are returned in XMM0, except when it doesn't exist. */
if (size == 16)
return (TARGET_SSE ? 0 : 1);
/* AVX values are returned in YMM0, except when it doesn't exist. */
if (size == 32)
return TARGET_AVX ? 0 : 1;
}
if (mode == XFmode)
......
2008-02-21 Uros Bizjak <ubizjak@gmail.com>
PR target/39256
* gcc.target/i386/abi-2.c: New.
2009-02-21 Kaz Kojima <kkojima@gcc.gnu.org>
* gcc.c-torture/execute/pr39228.x: New.
......
/* Make certain that we pass __m256i in the correct register for AVX. */
/* { dg-do compile } */
/* { dg-options "-O1 -mavx" } */
typedef long long __m256i __attribute__ ((__vector_size__ (32)));
__m256i foo (void) { return (__m256i){ 1, 2, 3, 4 }; }
/* { dg-final { scan-assembler-times "ymm0" 1 } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment