aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r--gcc/config/i386/i386.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 270ee55..5e8f58c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4751,6 +4751,7 @@ ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT isa2,
{ "-mavx256-split-unaligned-load", MASK_AVX256_SPLIT_UNALIGNED_LOAD },
{ "-mavx256-split-unaligned-store", MASK_AVX256_SPLIT_UNALIGNED_STORE },
{ "-mprefer-avx128", MASK_PREFER_AVX128 },
+ { "-mprefer-avx256", MASK_PREFER_AVX256 },
{ "-mcall-ms2sysv-xlogues", MASK_CALL_MS2SYSV_XLOGUES }
};
@@ -51848,20 +51849,39 @@ ix86_preferred_simd_mode (scalar_mode mode)
switch (mode)
{
case E_QImode:
- return TARGET_AVX512BW ? V64QImode :
- (TARGET_AVX && !TARGET_PREFER_AVX128) ? V32QImode : V16QImode;
+ if (TARGET_AVX512BW && !TARGET_PREFER_AVX256)
+ return V64QImode;
+ else if (TARGET_AVX && !TARGET_PREFER_AVX128)
+ return V32QImode;
+ else
+ return V16QImode;
+
case E_HImode:
- return TARGET_AVX512BW ? V32HImode :
- (TARGET_AVX && !TARGET_PREFER_AVX128) ? V16HImode : V8HImode;
+ if (TARGET_AVX512BW && !TARGET_PREFER_AVX256)
+ return V32HImode;
+ else if (TARGET_AVX && !TARGET_PREFER_AVX128)
+ return V16HImode;
+ else
+ return V8HImode;
+
case E_SImode:
- return TARGET_AVX512F ? V16SImode :
- (TARGET_AVX && !TARGET_PREFER_AVX128) ? V8SImode : V4SImode;
+ if (TARGET_AVX512F && !TARGET_PREFER_AVX256)
+ return V16SImode;
+ else if (TARGET_AVX && !TARGET_PREFER_AVX128)
+ return V8SImode;
+ else
+ return V4SImode;
+
case E_DImode:
- return TARGET_AVX512F ? V8DImode :
- (TARGET_AVX && !TARGET_PREFER_AVX128) ? V4DImode : V2DImode;
+ if (TARGET_AVX512F && !TARGET_PREFER_AVX256)
+ return V8DImode;
+ else if (TARGET_AVX && !TARGET_PREFER_AVX128)
+ return V4DImode;
+ else
+ return V2DImode;
case E_SFmode:
- if (TARGET_AVX512F)
+ if (TARGET_AVX512F && !TARGET_PREFER_AVX256)
return V16SFmode;
else if (TARGET_AVX && !TARGET_PREFER_AVX128)
return V8SFmode;
@@ -51869,7 +51889,7 @@ ix86_preferred_simd_mode (scalar_mode mode)
return V4SFmode;
case E_DFmode:
- if (TARGET_AVX512F)
+ if (TARGET_AVX512F && !TARGET_PREFER_AVX256)
return V8DFmode;
else if (TARGET_AVX && !TARGET_PREFER_AVX128)
return V4DFmode;
@@ -51889,8 +51909,14 @@ ix86_preferred_simd_mode (scalar_mode mode)
static unsigned int
ix86_autovectorize_vector_sizes (void)
{
- return TARGET_AVX512F ? 64 | 32 | 16 :
- (TARGET_AVX && !TARGET_PREFER_AVX128) ? 32 | 16 : 0;
+ unsigned int bytesizes = 0;
+
+ if (TARGET_AVX512F && !TARGET_PREFER_AVX256)
+ bytesizes |= (64 | 32 | 16);
+ else if (TARGET_AVX && !TARGET_PREFER_AVX128)
+ bytesizes |= (32 | 16);
+
+ return bytesizes;
}
/* Implemenation of targetm.vectorize.get_mask_mode. */