Support avx512f in __builtin_cpu_supports.
authorIlya Tocar <ilya.tocar@intel.com>
Thu, 27 Nov 2014 13:51:10 +0000 (13:51 +0000)
committerIlya Tocar <tocarip@gcc.gnu.org>
Thu, 27 Nov 2014 13:51:10 +0000 (16:51 +0300)
gcc/

        * config/i386/cpuid.h (bit_MPX, bit_BNDREGS, bit_BNDCSR):
        Define.
        * config/i386/i386.c (get_builtin_code_for_version): Add avx512f.
        (fold_builtin_cpu): Ditto.
        * doc/extend.texi: Documment it.

gcc/testsuite/

        * g++.dg/ext/mv2.C: Add test for target ("avx512f").
        * gcc.target/i386/builtin_target.c: Ditto.

libgcc/

        * config/i386/cpuinfo.c (processor_features): Add FEATURE_AVX512F.
        * config/i386/cpuinfo.c (get_available_features): Detect it.

From-SVN: r218125

gcc/ChangeLog
gcc/config/i386/cpuid.h
gcc/config/i386/i386.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/mv2.C
gcc/testsuite/gcc.target/i386/builtin_target.c
libgcc/ChangeLog
libgcc/config/i386/cpuinfo.c

index aa3aa237957838282247189657235235be736d96..4abbd35c518d61bd235bb3f7651ef2c37f552122 100644 (file)
@@ -1,3 +1,11 @@
+2014-11-27  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * config/i386/cpuid.h (bit_MPX, bit_BNDREGS, bit_BNDCSR):
+       Define.
+       * config/i386/i386.c (get_builtin_code_for_version): Add avx512f.
+       (fold_builtin_cpu): Ditto.
+       * doc/extend.texi: Documment it.
+
 2014-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/64067
index 6c6e7f34acf1687f02fff568f7f2c392916de28d..e3b76465b95f348a77658e6f2a93d4af0b9d02ec 100644 (file)
@@ -72,6 +72,7 @@
 #define bit_AVX2       (1 << 5)
 #define bit_BMI2       (1 << 8)
 #define bit_RTM        (1 << 11)
+#define bit_MPX        (1 << 14)
 #define bit_AVX512F    (1 << 16)
 #define bit_AVX512DQ   (1 << 17)
 #define bit_RDSEED     (1 << 18)
 #define bit_PREFETCHWT1          (1 << 0)
 #define bit_AVX512VBMI (1 << 1)
 
+/* XFEATURE_ENABLED_MASK register bits (%eax == 13, %ecx == 0) */
+#define bit_BNDREGS     (1 << 3)
+#define bit_BNDCSR      (1 << 4)
+
 /* Extended State Enumeration Sub-leaf (%eax == 13, %ecx == 1) */
 #define bit_XSAVEOPT   (1 << 0)
 #define bit_XSAVEC     (1 << 1)
index eafc15a84a3aa5cc45c39ad688898b2b829e8235..24931309ea06dd8e0296d712e419eeaf537740ea 100644 (file)
@@ -34235,7 +34235,8 @@ get_builtin_code_for_version (tree decl, tree *predicate_list)
     P_FMA,    
     P_PROC_FMA,
     P_AVX2,
-    P_PROC_AVX2
+    P_PROC_AVX2,
+    P_AVX512F
   };
 
  enum feature_priority priority = P_ZERO;
@@ -34263,7 +34264,8 @@ get_builtin_code_for_version (tree decl, tree *predicate_list)
       {"fma4", P_FMA4},
       {"xop", P_XOP},
       {"fma", P_FMA},
-      {"avx2", P_AVX2}
+      {"avx2", P_AVX2},
+      {"avx512f", P_AVX512F}
     };
 
 
@@ -35238,6 +35240,7 @@ fold_builtin_cpu (tree fndecl, tree *args)
     F_FMA4,
     F_XOP,
     F_FMA,
+    F_AVX512F,
     F_MAX
   };
 
@@ -35326,7 +35329,8 @@ fold_builtin_cpu (tree fndecl, tree *args)
       {"fma4",   F_FMA4},
       {"xop",    F_XOP},
       {"fma",    F_FMA},
-      {"avx2",   F_AVX2}
+      {"avx2",   F_AVX2},
+      {"avx512f",F_AVX512F}
     };
 
   tree __processor_model_type = build_processor_model_struct ();
index 7178c9a7e8e271a7e76033cd4e49de4b1bd2d9d8..773e14ce6b2797952f4b5a6501e97e7d1fe6b51f 100644 (file)
@@ -11642,6 +11642,8 @@ SSE4.2 instructions.
 AVX instructions.
 @item avx2
 AVX2 instructions.
+@item avx512f
+AVX512F instructions.
 @end table
 
 Here is an example:
index 86af18c6c851960edfe92a5a81e4db377e47569b..259283539004eb28efc06fe1050f71c9e5897d92 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-27  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * g++.dg/ext/mv2.C: Add test for target ("avx512f").
+       * gcc.target/i386/builtin_target.c: Ditto.
+
 2014-11-27  Kai Tietz  <ktietz@redhat.com>
 
        PR c++/63904
index 869e99b4faea8ee28a7c4af3a062b3584a7b3b19..d4f1f92c611106e67c8b6b6fb3b17cd8aacdb26a 100644 (file)
@@ -20,31 +20,34 @@ int foo () __attribute__ ((target ("sse4.2")));
 int foo () __attribute__ ((target ("popcnt")));
 int foo () __attribute__ ((target ("avx")));
 int foo () __attribute__ ((target ("avx2")));
+int foo () __attribute__ ((target ("avx512f")));
 
 int main ()
 {
   int val = foo ();
 
-  if (__builtin_cpu_supports ("avx2"))
-    assert (val == 1);
+  if (__builtin_cpu_supports ("avx512f"))
+    assert (val == 11);
+  else if (__builtin_cpu_supports ("avx2"))
+    assert (val == 10);
   else if (__builtin_cpu_supports ("avx"))
-    assert (val == 2);
+    assert (val == 9);
   else if (__builtin_cpu_supports ("popcnt"))
-    assert (val == 3);
+    assert (val == 8);
   else if (__builtin_cpu_supports ("sse4.2"))
-    assert (val == 4);
+    assert (val == 7);
   else if (__builtin_cpu_supports ("sse4.1"))
-    assert (val == 5);
-  else if (__builtin_cpu_supports ("ssse3"))
     assert (val == 6);
+  else if (__builtin_cpu_supports ("ssse3"))
+    assert (val == 5);
   else if (__builtin_cpu_supports ("sse3"))
-    assert (val == 7);
+    assert (val == 4);
   else if (__builtin_cpu_supports ("sse2"))
-    assert (val == 8);
+    assert (val == 3);
   else if (__builtin_cpu_supports ("sse"))
-    assert (val == 9);
+    assert (val == 2);
   else if (__builtin_cpu_supports ("mmx"))
-    assert (val == 10);
+    assert (val == 1);
   else
     assert (val == 0);
 
@@ -60,59 +63,65 @@ foo ()
 int __attribute__ ((target("mmx")))
 foo ()
 {
-  return 10;
+  return 1;
 }
 
 int __attribute__ ((target("sse")))
 foo ()
 {
-  return 9;
+  return 2;
 }
 
 int __attribute__ ((target("sse2")))
 foo ()
 {
-  return 8;
+  return 3;
 }
 
 int __attribute__ ((target("sse3")))
 foo ()
 {
-  return 7;
+  return 4;
 }
 
 int __attribute__ ((target("ssse3")))
 foo ()
 {
-  return 6;
+  return 5;
 }
 
 int __attribute__ ((target("sse4.1")))
 foo ()
 {
-  return 5;
+  return 6;
 }
 
 int __attribute__ ((target("sse4.2")))
 foo ()
 {
-  return 4;
+  return 7;
 }
 
 int __attribute__ ((target("popcnt")))
 foo ()
 {
-  return 3;
+  return 8;
 }
 
 int __attribute__ ((target("avx")))
 foo ()
 {
-  return 2;
+  return 9;
 }
 
 int __attribute__ ((target("avx2")))
 foo ()
 {
-  return 1;
+  return 10;
+}
+
+int __attribute__ ((target("avx512f")))
+foo ()
+{
+  return 11;
 }
index c40983e6b3cddd65842f22d7fe8ba7a5c49ffbb5..b6a3eee1c8b6e6a77de13e5cfc6a05581c8243c5 100644 (file)
@@ -145,6 +145,8 @@ check_features (unsigned int ecx, unsigned int edx,
       __cpuid_count (7, 0, eax, ebx, ecx, edx);
       if (ebx & bit_AVX2)
        assert (__builtin_cpu_supports ("avx2"));
+      if (ebx & bit_AVX512F)
+       assert (__builtin_cpu_supports ("avx512f"));
     }
 }
 
@@ -241,6 +243,8 @@ quick_check ()
 
   assert (__builtin_cpu_supports ("avx2") >= 0);
 
+  assert (__builtin_cpu_supports ("avx512f") >= 0);
+
   /* Check CPU type.  */
   assert (__builtin_cpu_is ("amd") >= 0);
 
index ea3fdc87845fcb0c7fc4f0f28a20abe074477497..16114a7471e51f6ec68123ee99fd882cd439e5fc 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-27  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * config/i386/cpuinfo.c (processor_features): Add FEATURE_AVX512F.
+       * config/i386/cpuinfo.c (get_available_features): Detect it.
+
 2014-11-27  Tony Wang  <tony.wang@arm.com>
 
        * config/arm/lib1funcs.S (FUNC_START): Add conditional section
index 6ff7502bb9aa8562df900d77a8d1f0f23e25a8b6..8ca385cb9776e4ad3b5d7da7cc1b0f6027cb213c 100644 (file)
@@ -96,7 +96,8 @@ enum processor_features
   FEATURE_SSE4_A,
   FEATURE_FMA4,
   FEATURE_XOP,
-  FEATURE_FMA
+  FEATURE_FMA,
+  FEATURE_AVX512F
 };
 
 struct __processor_model
@@ -278,6 +279,8 @@ get_available_features (unsigned int ecx, unsigned int edx,
       __cpuid_count (7, 0, eax, ebx, ecx, edx);
       if (ebx & bit_AVX2)
        features |= (1 << FEATURE_AVX2);
+      if (ebx & bit_AVX512F)
+       features |= (1 << FEATURE_AVX512F);
     }
 
   unsigned int ext_level;