[AVX]: Handle 256bit type passing
H.J. Lu
hongjiu.lu@intel.com
Fri Aug 1 18:13:00 GMT 2008
I am checking in this patch to handle 256bit type passing according
to the psABI extension:
http://gcc.gnu.org/ml/gcc/2008-06/msg00408.html
H.J.
---
Index: ChangeLog.avx
===================================================================
--- ChangeLog.avx (revision 138527)
+++ ChangeLog.avx (working copy)
@@ -1,5 +1,25 @@
2008-08-01 H.J. Lu <hongjiu.lu@intel.com>
+ * config/i386/i386.c (x86_64_reg_class): Add X86_64_AVX_CLASS.
+ (classify_argument): Return 0 for COImode and OImode. Return
+ 1 and X86_64_AVX_CLASS for 256bit vector types.
+ (examine_argument): Handle X86_64_AVX_CLASS.
+ (construct_container): Likewise.
+ (function_arg_advance_32): Pass OImode in AVX register.
+ (function_arg_advance_64): Take a new argument to indicate if a
+ parameter is named. Return immediately for unnamed 256bit
+ vector mode parameters.
+ (function_arg_advance): Updated.
+ (function_arg_32): Add comments for TImode and OImode.
+ (function_arg_64): Take a new argument to indicate if a
+ parameter is named. Don't pass OImode in AVX register.
+ Return NULL for unnamed 256bit vector mode parameters.
+ (function_arg): Updated.
+ (ix86_gimplify_va_arg): Handle unnamed 256bit vector mode
+ parameters.
+
+2008-08-01 H.J. Lu <hongjiu.lu@intel.com>
+
* config/i386/sse.md (avx_maskloadp<avxmodesuffixf2c><avxmodesuffix>):
Add (match_dup 0).
(avx_maskstorep<avxmodesuffixf2c><avxmodesuffix>): Likewise.
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c (revision 138526)
+++ config/i386/i386.c (working copy)
@@ -1764,6 +1764,7 @@ enum x86_64_reg_class
X86_64_NO_CLASS,
X86_64_INTEGER_CLASS,
X86_64_INTEGERSI_CLASS,
+ X86_64_AVX_CLASS,
X86_64_SSE_CLASS,
X86_64_SSESF_CLASS,
X86_64_SSEDF_CLASS,
@@ -5007,6 +5008,8 @@ classify_argument (enum machine_mode mod
classes[0] = classes[1] = X86_64_INTEGER_CLASS;
return 2;
case CTImode:
+ case COImode:
+ case OImode:
return 0;
case SFmode:
if (!(bit_offset % 64))
@@ -5044,6 +5047,8 @@ classify_argument (enum machine_mode mod
case V16HImode:
case V4DFmode:
case V4DImode:
+ classes[0] = X86_64_AVX_CLASS;
+ return 1;
case V4SFmode:
case V4SImode:
case V16QImode:
@@ -5100,6 +5105,7 @@ examine_argument (enum machine_mode mode
case X86_64_INTEGERSI_CLASS:
(*int_nregs)++;
break;
+ case X86_64_AVX_CLASS:
case X86_64_SSE_CLASS:
case X86_64_SSESF_CLASS:
case X86_64_SSEDF_CLASS:
@@ -5198,6 +5204,7 @@ construct_container (enum machine_mode m
case X86_64_INTEGER_CLASS:
case X86_64_INTEGERSI_CLASS:
return gen_rtx_REG (mode, intreg[0]);
+ case X86_64_AVX_CLASS:
case X86_64_SSE_CLASS:
case X86_64_SSESF_CLASS:
case X86_64_SSEDF_CLASS:
@@ -5331,13 +5338,14 @@ function_arg_advance_32 (CUMULATIVE_ARGS
break;
/* FALLTHRU */
- case TImode:
+ case OImode:
case V8SFmode:
case V8SImode:
case V32QImode:
case V16HImode:
case V4DFmode:
case V4DImode:
+ case TImode:
case V16QImode:
case V8HImode:
case V4SImode:
@@ -5379,10 +5387,26 @@ function_arg_advance_32 (CUMULATIVE_ARGS
static void
function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
- tree type, HOST_WIDE_INT words)
+ tree type, HOST_WIDE_INT words, int named)
{
int int_nregs, sse_nregs;
+ switch (mode)
+ {
+ case V8SFmode:
+ case V8SImode:
+ case V32QImode:
+ case V16HImode:
+ case V4DFmode:
+ case V4DImode:
+ /* Unnamed 256bit vector mode parameters are passed on stack. */
+ if (!named)
+ return;
+
+ default:
+ break;
+ }
+
if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
cum->words += words;
else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
@@ -5413,7 +5437,7 @@ function_arg_advance_ms_64 (CUMULATIVE_A
void
function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
- tree type, int named ATTRIBUTE_UNUSED)
+ tree type, int named)
{
HOST_WIDE_INT bytes, words;
@@ -5429,7 +5453,7 @@ function_arg_advance (CUMULATIVE_ARGS *c
if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
function_arg_advance_ms_64 (cum, bytes, words);
else if (TARGET_64BIT)
- function_arg_advance_64 (cum, mode, type, words);
+ function_arg_advance_64 (cum, mode, type, words, named);
else
function_arg_advance_32 (cum, mode, type, bytes, words);
}
@@ -5501,6 +5525,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
break;
/* FALLTHRU */
case TImode:
+ /* In 32bit, we pass TImode in xmm registers. */
case V16QImode:
case V8HImode:
case V4SImode:
@@ -5522,6 +5547,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
break;
case OImode:
+ /* In 32bit, we pass OImode in ymm registers. */
case V8SFmode:
case V8SImode:
case V32QImode:
@@ -5567,7 +5593,7 @@ function_arg_32 (CUMULATIVE_ARGS *cum, e
static rtx
function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
- enum machine_mode orig_mode, tree type)
+ enum machine_mode orig_mode, tree type, int named)
{
static bool warnedavx;
@@ -5588,13 +5614,14 @@ function_arg_64 (CUMULATIVE_ARGS *cum, e
default:
break;
- case OImode:
case V8SFmode:
case V8SImode:
case V32QImode:
case V16HImode:
case V4DFmode:
case V4DImode:
+ /* In 64bit, we pass TImode in interger registers and OImode on
+ stack. */
if (!type || !AGGREGATE_TYPE_P (type))
{
if (!TARGET_AVX && !warnedavx && cum->warn_avx)
@@ -5604,6 +5631,10 @@ function_arg_64 (CUMULATIVE_ARGS *cum, e
"changes the ABI");
}
}
+
+ /* Unnamed 256bit vector mode parameters are passed on stack. */
+ if (!named)
+ return NULL;
break;
}
@@ -5681,7 +5712,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum
if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
return function_arg_ms_64 (cum, mode, omode, named, bytes);
else if (TARGET_64BIT)
- return function_arg_64 (cum, mode, omode, type);
+ return function_arg_64 (cum, mode, omode, type, named);
else
return function_arg_32 (cum, mode, omode, type, bytes, words);
}
@@ -6530,9 +6561,28 @@ ix86_gimplify_va_arg (tree valist, tree
rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
nat_mode = type_natural_mode (type);
- container = construct_container (nat_mode, TYPE_MODE (type), type, 0,
- X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
- intreg, 0);
+ switch (nat_mode)
+ {
+ case V8SFmode:
+ case V8SImode:
+ case V32QImode:
+ case V16HImode:
+ case V4DFmode:
+ case V4DImode:
+ /* Unnamed 256bit vector mode parameters are passed on stack. */
+ if (ix86_cfun_abi () == SYSV_ABI)
+ {
+ container = NULL;
+ break;
+ }
+
+ default:
+ container = construct_container (nat_mode, TYPE_MODE (type),
+ type, 0, X86_64_REGPARM_MAX,
+ X86_64_SSE_REGPARM_MAX, intreg,
+ 0);
+ break;
+ }
/* Pull the value out of the saved registers. */
More information about the Gcc-patches
mailing list