diff options
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r-- | gcc/config/i386/i386.c | 50 |
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. */ |