From 06caf59d7ff9f9f97718a96cb23da50e5ba5edd8 Mon Sep 17 00:00:00 2001 From: Kirill Yukhin Date: Tue, 22 Sep 2015 11:10:21 +0000 Subject: [PATCH] AVX-512. Introduce SKylake server CPU. gcc/ * config.gcc: Support "skylake-avx512". * config/i386/i386-c.c (ix86_target_macros_internal): Handle PROCESSOR_SKYLAKE_AVX512. * config/i386/i386.c (m_SKYLAKE_AVX512): Define. (processor_target_table): Add "skylake-avx512". (PTA_SKYLAKE_AVX512): Define. (ix86_option_override_internal): Add "skylake_avx512". (fold_builtin_cpu): Handle "skylake_avx512", add F_AVX512VL F_AVX512BW, F_AVX512DQ, F_AVX512ER, F_AVX512PF, F_AVX512CD. * config/i386/i386.h (TARGET_SKYLAKE_AVX512): Define. (processor_type): Add PROCESSOR_SKYLAKE_AVX512. * doc/invoke.texi (skylake-avx512): New. libgcc/ * libgcc/config/i386/cpuinfo.c (enum processor_features): Add FEATURE_AVX512VL, FEATURE_AVX512BW, FEATURE_AVX512DQ, FEATURE_AVX512CD, FEATURE_AVX512ER, FEATURE_AVX512PF. (get_available_features): Habdle new features. gcc/testsuite/ * gcc.target/i386/funcspec-5.c: Test avx512vl, avx512bw, avx512dq, avx512cd, avx512er, avx512pf and skylake-avx512. * gcc.target/i386/builtin_target.c: Test avx512vl, avx512bw, avx512dq, avx512cd, avx512er and avx512pf. From-SVN: r228009 --- gcc/ChangeLog | 15 +++++ gcc/config.gcc | 4 +- gcc/config/i386/i386-c.c | 7 +++ gcc/config/i386/i386.c | 62 ++++++++++++------- gcc/config/i386/i386.h | 2 + gcc/doc/invoke.texi | 6 ++ gcc/testsuite/ChangeLog | 7 +++ .../gcc.target/i386/builtin_target.c | 12 ++++ gcc/testsuite/gcc.target/i386/funcspec-5.c | 13 ++++ libgcc/ChangeLog | 7 +++ libgcc/config/i386/cpuinfo.c | 22 ++++++- 11 files changed, 132 insertions(+), 25 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 13db1c93382..f6c1c80cb34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2015-09-22 Kirill Yukhin + + * config.gcc: Support "skylake-avx512". + * config/i386/i386-c.c (ix86_target_macros_internal): Handle + PROCESSOR_SKYLAKE_AVX512. + * config/i386/i386.c (m_SKYLAKE_AVX512): Define. + (processor_target_table): Add "skylake-avx512". + (PTA_SKYLAKE_AVX512): Define. + (ix86_option_override_internal): Add "skylake_avx512". + (fold_builtin_cpu): Handle "skylake_avx512", add F_AVX512VL + F_AVX512BW, F_AVX512DQ, F_AVX512ER, F_AVX512PF, F_AVX512CD. + * config/i386/i386.h (TARGET_SKYLAKE_AVX512): Define. + (processor_type): Add PROCESSOR_SKYLAKE_AVX512. + * doc/invoke.texi (skylake-avx512): New. + 2015-09-22 Kirill Yukhin * gcc/config/i386/i386.md (define_insn "kunpckhi"): Fix diff --git a/gcc/config.gcc b/gcc/config.gcc index 75807f59277..f060e2f0478 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -594,8 +594,8 @@ pentium4 pentium4m pentiumpro prescott iamcu" x86_64_archs="amdfam10 athlon64 athlon64-sse3 barcelona bdver1 bdver2 \ bdver3 bdver4 btver1 btver2 k8 k8-sse3 opteron opteron-sse3 nocona \ core2 corei7 corei7-avx core-avx-i core-avx2 atom slm nehalem westmere \ -sandybridge ivybridge haswell broadwell bonnell silvermont knl x86-64 \ -native" +sandybridge ivybridge haswell broadwell bonnell silvermont knl \ +skylake-avx512 x86-64 native" # Additional x86 processors supported by --with-cpu=. Each processor # MUST be separated by exactly one space. diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c index 35cecd004ae..5e583aeb376 100644 --- a/gcc/config/i386/i386-c.c +++ b/gcc/config/i386/i386-c.c @@ -177,6 +177,10 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag, def_or_undef (parse_in, "__knl"); def_or_undef (parse_in, "__knl__"); break; + case PROCESSOR_SKYLAKE_AVX512: + def_or_undef (parse_in, "__skylake_avx512"); + def_or_undef (parse_in, "__skylake_avx512__"); + break; /* use PROCESSOR_max to not set/unset the arch macro. */ case PROCESSOR_max: break; @@ -286,6 +290,9 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag, case PROCESSOR_KNL: def_or_undef (parse_in, "__tune_knl__"); break; + case PROCESSOR_SKYLAKE_AVX512: + def_or_undef (parse_in, "__tune_skylake_avx512__"); + break; case PROCESSOR_IAMCU: def_or_undef (parse_in, "__tune_iamcu__"); break; diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d547cfd108a..8a26f68aca5 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2098,6 +2098,7 @@ const struct processor_costs *ix86_cost = &pentium_cost; #define m_BONNELL (1< + + * gcc.target/i386/funcspec-5.c: Test avx512vl, avx512bw, + avx512dq, avx512cd, avx512er, avx512pf and skylake-avx512. + * gcc.target/i386/builtin_target.c: Test avx512vl, avx512bw, + avx512dq, avx512cd, avx512er and avx512pf. + 2015-09-22 Matthew Wahab * gcc.target/aarch64/atomic-inst-ldadd.c: Add tests for diff --git a/gcc/testsuite/gcc.target/i386/builtin_target.c b/gcc/testsuite/gcc.target/i386/builtin_target.c index 300d208f908..aff4559845c 100644 --- a/gcc/testsuite/gcc.target/i386/builtin_target.c +++ b/gcc/testsuite/gcc.target/i386/builtin_target.c @@ -188,6 +188,18 @@ check_features (unsigned int ecx, unsigned int edx, assert (__builtin_cpu_supports ("avx2")); if (ebx & bit_AVX512F) assert (__builtin_cpu_supports ("avx512f")); + if (ebx & bit_AVX512VL) + assert (__builtin_cpu_supports ("avx512vl")); + if (ebx & bit_AVX512CD) + assert (__builtin_cpu_supports ("avx512cd")); + if (ebx & bit_AVX512PF) + assert (__builtin_cpu_supports ("avx512pf")); + if (ebx & bit_AVX512ER) + assert (__builtin_cpu_supports ("avx512er")); + if (ebx & bit_AVX512BW) + assert (__builtin_cpu_supports ("avx512bw")); + if (ebx & bit_AVX512DQ) + assert (__builtin_cpu_supports ("avx512dq")); } } diff --git a/gcc/testsuite/gcc.target/i386/funcspec-5.c b/gcc/testsuite/gcc.target/i386/funcspec-5.c index 7185b5cb329..c43bc76cbd4 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-5.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-5.c @@ -25,6 +25,12 @@ extern void test_tbm (void) __attribute__((__target__("tbm"))); extern void test_avx (void) __attribute__((__target__("avx"))); extern void test_avx2 (void) __attribute__((__target__("avx2"))); extern void test_avx512f (void) __attribute__((__target__("avx512f"))); +extern void test_avx512vl(void) __attribute__((__target__("avx512vl"))); +extern void test_avx512bw(void) __attribute__((__target__("avx512bw"))); +extern void test_avx512dq(void) __attribute__((__target__("avx512dq"))); +extern void test_avx512er(void) __attribute__((__target__("avx512er"))); +extern void test_avx512pf(void) __attribute__((__target__("avx512pf"))); +extern void test_avx512cd(void) __attribute__((__target__("avx512cd"))); extern void test_bmi (void) __attribute__((__target__("bmi"))); extern void test_bmi2 (void) __attribute__((__target__("bmi2"))); @@ -50,6 +56,12 @@ extern void test_no_tbm (void) __attribute__((__target__("no-tbm"))); extern void test_no_avx (void) __attribute__((__target__("no-avx"))); extern void test_no_avx2 (void) __attribute__((__target__("no-avx2"))); extern void test_no_avx512f (void) __attribute__((__target__("no-avx512f"))); +extern void test_no_avx512vl(void) __attribute__((__target__("no-avx512vl"))); +extern void test_no_avx512bw(void) __attribute__((__target__("no-avx512bw"))); +extern void test_no_avx512dq(void) __attribute__((__target__("no-avx512dq"))); +extern void test_no_avx512er(void) __attribute__((__target__("no-avx512er"))); +extern void test_bo_avx512pf(void) __attribute__((__target__("no-avx512pf"))); +extern void test_no_avx512cd(void) __attribute__((__target__("no-avx512cd"))); extern void test_no_bmi (void) __attribute__((__target__("no-bmi"))); extern void test_no_bmi2 (void) __attribute__((__target__("no-bmi2"))); @@ -77,6 +89,7 @@ extern void test_arch_corei7 (void) __attribute__((__target__("arch=corei7"))); extern void test_arch_corei7_avx (void) __attribute__((__target__("arch=corei7-avx"))); extern void test_arch_core_avx2 (void) __attribute__((__target__("arch=core-avx2"))); extern void test_arch_knl (void) __attribute__((__target__("arch=knl"))); +extern void test_arch_skylake_avx512 (void) __attribute__((__target__("arch=skylake-avx512"))); extern void test_arch_geode (void) __attribute__((__target__("arch=geode"))); extern void test_arch_k6 (void) __attribute__((__target__("arch=k6"))); extern void test_arch_k6_2 (void) __attribute__((__target__("arch=k6-2"))); diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 6d2d9eb53cf..878c29f56c4 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,10 @@ +2015-09-22 Kirill Yukhin + + * libgcc/config/i386/cpuinfo.c (enum processor_features): Add + FEATURE_AVX512VL, FEATURE_AVX512BW, FEATURE_AVX512DQ, + FEATURE_AVX512CD, FEATURE_AVX512ER, FEATURE_AVX512PF. + (get_available_features): Habdle new features. + 2015-09-21 James Bowman * config/ft32/crti-hw.S: Use __PMSIZE to allow configurable diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c index 14367754828..ddb49e3ad9a 100644 --- a/libgcc/config/i386/cpuinfo.c +++ b/libgcc/config/i386/cpuinfo.c @@ -81,7 +81,7 @@ enum processor_subtypes CPU_SUBTYPE_MAX }; -/* ISA Features supported. */ +/* ISA Features supported. New features have to be inserted at the end. */ enum processor_features { @@ -104,7 +104,13 @@ enum processor_features FEATURE_BMI, FEATURE_BMI2, FEATURE_AES, - FEATURE_PCLMUL + FEATURE_PCLMUL, + FEATURE_AVX512VL, + FEATURE_AVX512BW, + FEATURE_AVX512DQ, + FEATURE_AVX512CD, + FEATURE_AVX512ER, + FEATURE_AVX512PF }; struct __processor_model @@ -318,6 +324,18 @@ get_available_features (unsigned int ecx, unsigned int edx, features |= (1 << FEATURE_BMI2); if (ebx & bit_AVX512F) features |= (1 << FEATURE_AVX512F); + if (ebx & bit_AVX512VL) + features |= (1 << FEATURE_AVX512VL); + if (ebx & bit_AVX512BW) + features |= (1 << FEATURE_AVX512BW); + if (ebx & bit_AVX512DQ) + features |= (1 << FEATURE_AVX512DQ); + if (ebx & bit_AVX512CD) + features |= (1 << FEATURE_AVX512CD); + if (ebx & bit_AVX512PF) + features |= (1 << FEATURE_AVX512PF); + if (ebx & bit_AVX512ER) + features |= (1 << FEATURE_AVX512ER); } unsigned int ext_level; -- 2.30.2