AVX-512. Introduce SKylake server CPU.
authorKirill Yukhin <kirill.yukhin@intel.com>
Tue, 22 Sep 2015 11:10:21 +0000 (11:10 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Tue, 22 Sep 2015 11:10:21 +0000 (11:10 +0000)
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
gcc/config.gcc
gcc/config/i386/i386-c.c
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/builtin_target.c
gcc/testsuite/gcc.target/i386/funcspec-5.c
libgcc/ChangeLog
libgcc/config/i386/cpuinfo.c

index 13db1c933823c05a675aa2df96d7d27afb2bfd3d..f6c1c80cb34e226a13036d64bfd3d4200d094277 100644 (file)
@@ -1,3 +1,18 @@
+2015-09-22  Kirill Yukhin <kirill.yukhin@intel.com>
+
+       * 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 <kirill.yukhin@intel.com>
 
        * gcc/config/i386/i386.md (define_insn "kunpckhi"): Fix
index 75807f59277462b8900845a57d9222b83481f905..f060e2f0478ba4fbf7cad4c69c844aeebd5473c5 100644 (file)
@@ -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.
index 35cecd004ae0cbcb1267c4271ca9e6bad8030142..5e583aeb376e580c62b5ef6d2b8dab29f974c7bc 100644 (file)
@@ -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;
index d547cfd108a7729c548f52d4b7040409b545c335..8a26f68aca5320eae7adb4ab29b3f60ae6226082 100644 (file)
@@ -2098,6 +2098,7 @@ const struct processor_costs *ix86_cost = &pentium_cost;
 #define m_BONNELL (1<<PROCESSOR_BONNELL)
 #define m_SILVERMONT (1<<PROCESSOR_SILVERMONT)
 #define m_KNL (1<<PROCESSOR_KNL)
+#define m_SKYLAKE_AVX512 (1<<PROCESSOT_SKYLAKE_AVX512)
 #define m_INTEL (1<<PROCESSOR_INTEL)
 
 #define m_GEODE (1<<PROCESSOR_GEODE)
@@ -2567,6 +2568,7 @@ static const struct ptt processor_target_table[PROCESSOR_max] =
   {"bonnell", &atom_cost, 16, 15, 16, 7, 16},
   {"silvermont", &slm_cost, 16, 15, 16, 7, 16},
   {"knl", &slm_cost, 16, 15, 16, 7, 16},
+  {"skylake-avx512", &core_cost, 16, 10, 16, 10, 16},
   {"intel", &intel_cost, 16, 15, 16, 7, 16},
   {"geode", &geode_cost, 0, 0, 0, 0, 0},
   {"k6", &k6_cost, 32, 7, 32, 7, 32},
@@ -3286,6 +3288,9 @@ ix86_option_override_internal (bool main_args_p,
   (PTA_HASWELL | PTA_ADX | PTA_PRFCHW | PTA_RDSEED)
 #define PTA_SKYLAKE \
   (PTA_BROADWELL | PTA_CLFLUSHOPT | PTA_XSAVEC | PTA_XSAVES)
+#define PTA_SKYLAKE_AVX512 \
+  (PTA_SKYLAKE | PTA_AVX512F | PTA_AVX512CD | PTA_AVX512VL \
+   | PTA_AVX512BW | PTA_AVX512DQ)
 #define PTA_KNL \
   (PTA_BROADWELL | PTA_AVX512PF | PTA_AVX512ER | PTA_AVX512F | PTA_AVX512CD)
 #define PTA_BONNELL \
@@ -3349,6 +3354,7 @@ ix86_option_override_internal (bool main_args_p,
       {"core-avx2", PROCESSOR_HASWELL, CPU_HASWELL, PTA_HASWELL},
       {"broadwell", PROCESSOR_HASWELL, CPU_HASWELL, PTA_BROADWELL},
       {"skylake", PROCESSOR_HASWELL, CPU_HASWELL, PTA_SKYLAKE},
+      {"skylake-avx512", PROCESSOR_HASWELL, CPU_HASWELL, PTA_SKYLAKE_AVX512},
       {"bonnell", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL},
       {"atom", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL},
       {"silvermont", PROCESSOR_SILVERMONT, CPU_SLM, PTA_SILVERMONT},
@@ -35624,6 +35630,12 @@ fold_builtin_cpu (tree fndecl, tree *args)
     F_BMI2,
     F_AES,
     F_PCLMUL,
+    F_AVX512VL,
+    F_AVX512BW,
+    F_AVX512DQ,
+    F_AVX512CD,
+    F_AVX512ER,
+    F_AVX512PF,
     F_MAX
   };
 
@@ -35658,7 +35670,8 @@ fold_builtin_cpu (tree fndecl, tree *args)
     M_INTEL_COREI7_IVYBRIDGE,
     M_INTEL_COREI7_HASWELL,
     M_INTEL_COREI7_BROADWELL,
-    M_INTEL_COREI7_SKYLAKE
+    M_INTEL_COREI7_SKYLAKE,
+    M_INTEL_COREI7_SKYLAKE_AVX512
   };
 
   static struct _arch_names_table
@@ -35681,6 +35694,7 @@ fold_builtin_cpu (tree fndecl, tree *args)
       {"haswell", M_INTEL_COREI7_HASWELL},
       {"broadwell", M_INTEL_COREI7_BROADWELL},
       {"skylake", M_INTEL_COREI7_SKYLAKE},
+      {"skylake-avx512", M_INTEL_COREI7_SKYLAKE_AVX512},
       {"bonnell", M_INTEL_BONNELL},
       {"silvermont", M_INTEL_SILVERMONT},
       {"knl", M_INTEL_KNL},
@@ -35704,26 +35718,32 @@ fold_builtin_cpu (tree fndecl, tree *args)
     }
   const isa_names_table[] =
     {
-      {"cmov",   F_CMOV},
-      {"mmx",    F_MMX},
-      {"popcnt", F_POPCNT},
-      {"sse",    F_SSE},
-      {"sse2",   F_SSE2},
-      {"sse3",   F_SSE3},
-      {"ssse3",  F_SSSE3},
-      {"sse4a",  F_SSE4_A},
-      {"sse4.1", F_SSE4_1},
-      {"sse4.2", F_SSE4_2},
-      {"avx",    F_AVX},
-      {"fma4",   F_FMA4},
-      {"xop",    F_XOP},
-      {"fma",    F_FMA},
-      {"avx2",   F_AVX2},
-      {"avx512f",F_AVX512F},
-      {"bmi",    F_BMI},
-      {"bmi2",   F_BMI2},
-      {"aes",    F_AES},
-      {"pclmul", F_PCLMUL}
+      {"cmov",    F_CMOV},
+      {"mmx",     F_MMX},
+      {"popcnt",  F_POPCNT},
+      {"sse",     F_SSE},
+      {"sse2",    F_SSE2},
+      {"sse3",    F_SSE3},
+      {"ssse3",   F_SSSE3},
+      {"sse4a",   F_SSE4_A},
+      {"sse4.1",  F_SSE4_1},
+      {"sse4.2",  F_SSE4_2},
+      {"avx",     F_AVX},
+      {"fma4",    F_FMA4},
+      {"xop",     F_XOP},
+      {"fma",     F_FMA},
+      {"avx2",    F_AVX2},
+      {"avx512f", F_AVX512F},
+      {"bmi",     F_BMI},
+      {"bmi2",    F_BMI2},
+      {"aes",     F_AES},
+      {"pclmul",  F_PCLMUL},
+      {"avx512vl",F_AVX512VL},
+      {"avx512bw",F_AVX512BW},
+      {"avx512dq",F_AVX512DQ},
+      {"avx512cd",F_AVX512CD},
+      {"avx512er",F_AVX512ER},
+      {"avx512pf",F_AVX512PF},
     };
 
   tree __processor_model_type = build_processor_model_struct ();
index 7bd23ecadef9ba347e3417f493d8928abc5da0ee..46fbe42b5ca1bac7c3294e2807204bacdfccd291 100644 (file)
@@ -340,6 +340,7 @@ extern const struct processor_costs ix86_size_cost;
 #define TARGET_BONNELL (ix86_tune == PROCESSOR_BONNELL)
 #define TARGET_SILVERMONT (ix86_tune == PROCESSOR_SILVERMONT)
 #define TARGET_KNL (ix86_tune == PROCESSOR_KNL)
+#define TARGET_SKYLAKE_AVX512 (ix86_tune == PROCESSOR_SKYLAKE_AVX512)
 #define TARGET_INTEL (ix86_tune == PROCESSOR_INTEL)
 #define TARGET_GENERIC (ix86_tune == PROCESSOR_GENERIC)
 #define TARGET_AMDFAM10 (ix86_tune == PROCESSOR_AMDFAM10)
@@ -2290,6 +2291,7 @@ enum processor_type
   PROCESSOR_BONNELL,
   PROCESSOR_SILVERMONT,
   PROCESSOR_KNL,
+  PROCESSOR_SKYLAKE_AVX512,
   PROCESSOR_INTEL,
   PROCESSOR_GEODE,
   PROCESSOR_K6,
index c11414d2ad858b38d0abdb2abf4270e4382b594d..5525e59849217c262fef4648319d745703a63421 100644 (file)
@@ -22242,6 +22242,12 @@ SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
 BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER and
 AVX512CD instruction set support.
 
+@item skylake-avx512
+Intel Skylake Server CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
+SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
+BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F,
+AVX512VL, AVX512BW, AVX512DQ and AVX512CD instruction set support.
+
 @item k6
 AMD K6 CPU with MMX instruction set support.
 
index 9f0686b96e224f7c06216279a0690ebc6c07017f..9d1b796ffaa5b62cd9bf46994171e096d13dab2b 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-22  Kirill Yukhin <kirill.yukhin@intel.com>
+
+        * 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  <matthew.wahab@arm.com>
 
        * gcc.target/aarch64/atomic-inst-ldadd.c: Add tests for
index 300d208f908f7197fb0ccce4c5931b121f65f00c..aff4559845c74675c7de85e72b3756653288b4d0 100644 (file)
@@ -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"));
     }
 }
 
index 7185b5cb3297e3f9d9ffe209fdb69017349227b6..c43bc76cbd4cf6c84730bd0c079ae80529bfd655 100644 (file)
@@ -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")));
index 6d2d9eb53cf0179745b064b96dcae9860b22286b..878c29f56c4cb53bdb9a690d468546d1ab4f974a 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-22  Kirill Yukhin <kirill.yukhin@intel.com>
+
+       * 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  <james.bowman@ftdichip.com>
 
        * config/ft32/crti-hw.S: Use __PMSIZE to allow configurable
index 14367754828040184cfddbe759c11d8aeefc7ed3..ddb49e3ad9a00358c48753113e199fbbdf8b7351 100644 (file)
@@ -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;