driver-i386.c (host_detect_local_cpu): Detect lack of zmm/k regs support.
authorIlya Tocar <ilya.tocar@intel.com>
Tue, 16 Sep 2014 11:57:56 +0000 (11:57 +0000)
committerIlya Tocar <tocarip@gcc.gnu.org>
Tue, 16 Sep 2014 11:57:56 +0000 (15:57 +0400)
gcc/
2014-09-16  Ilya Tocar  <ilya.tocar@intel.com>

        * config/i386/driver-i386.c (host_detect_local_cpu): Detect lack of
        zmm/k regs support.

testsuite/
2014-09-16  Ilya Tocar  <ilya.tocar@intel.com>

        * gcc.target/i386/avx512f-os-support.h: Remove magic number.

From-SVN: r215297

gcc/ChangeLog
gcc/config/i386/driver-i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512f-os-support.h

index 4ba66a70b4e220fb080d83dc85d18f48432c368d..d446d2cd2deae5c032a2596e0cad9a570ded85c3 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-16  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * config/i386/driver-i386.c (host_detect_local_cpu): Detect lack of
+       zmm/k regs support.
+
 2014-09-16  Alexander Ivchenko  <alexander.ivchenko@intel.com>
            Maxim Kuznetsov  <maxim.kuznetsov@intel.com>
            Anna Tikhonova  <anna.tikhonova@intel.com>
index af3088e5b4b217a84de804efea9c7bcc862184f4..4d6bf832f46bd6850adb2eee587907949c07358c 100644 (file)
@@ -533,6 +533,9 @@ const char *host_detect_local_cpu (int argc, const char **argv)
 #define XSTATE_FP                      0x1
 #define XSTATE_SSE                     0x2
 #define XSTATE_YMM                     0x4
+#define XSTATE_OPMASK                  0x20
+#define XSTATE_ZMM                     0x40
+#define XSTATE_HI_ZMM                  0x80
   if (has_osxsave)
     asm (".byte 0x0f; .byte 0x01; .byte 0xd0"
         : "=a" (eax), "=d" (edx)
@@ -554,6 +557,20 @@ const char *host_detect_local_cpu (int argc, const char **argv)
       has_xsavec = 0;
     }
 
+  if (!has_osxsave
+      || (eax &
+         (XSTATE_SSE | XSTATE_YMM | XSTATE_OPMASK | XSTATE_ZMM | XSTATE_HI_ZMM))
+         != (XSTATE_SSE | XSTATE_YMM | XSTATE_OPMASK | XSTATE_ZMM | XSTATE_HI_ZMM))
+    {
+      has_avx512f = 0;
+      has_avx512er = 0;
+      has_avx512pf = 0;
+      has_avx512cd = 0;
+      has_avx512dq = 0;
+      has_avx512bw = 0;
+      has_avx512vl = 0;
+    }
+
   if (!arch)
     {
       if (vendor == signature_AMD_ebx
index 4d3c96beee2c150630c48183a999accdcb10aef5..c3593a710c4a40093fb29e05354388c44fd8d066 100644 (file)
@@ -1,3 +1,7 @@
+2014-09-16  Ilya Tocar  <ilya.tocar@intel.com>
+
+       * gcc.target/i386/avx512f-os-support.h: Remove magic number.
+
 2014-09-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/56408
index deefa5e1105d720e8eea00b416632072a9f33ddf..2f1ed03df4597fd825974b5d94239b3355950245 100644 (file)
@@ -1,10 +1,23 @@
 /* Check if the OS supports executing AVX512F instructions.  */
 
+#define XCR_XFEATURE_ENABLED_MASK      0x0
+
+#define XSTATE_FP      0x1
+#define XSTATE_SSE     0x2
+#define XSTATE_YMM     0x4
+#define XSTATE_OPMASK  0x20
+#define XSTATE_ZMM     0x40
+#define XSTATE_HI_ZMM  0x80
+
 static int
 avx512f_os_support (void)
 {
   unsigned int eax, edx;
+  unsigned int ecx = XCR_XFEATURE_ENABLED_MASK;
+  unsigned int mask = XSTATE_SSE | XSTATE_YMM | XSTATE_OPMASK
+                     | XSTATE_ZMM | XSTATE_HI_ZMM;
+
+  __asm__ ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (ecx));
 
-  __asm__ ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
-  return (eax & 230) == 230;
+  return ((eax & mask) == mask);
 }