[PATCH,i386] Properly check xgetbv for zmm support.

2014-09-15 Thread Ilya Tocar
Hi,

Currently we don't check zmm/mask-registers related bits in xgetbv
output, when detecting native cpu. Patch below fixes it.
Bootstraps/passes make check.
Ok for trunk?

ChangeLog:

gcc/
2014-09-15  Ilya Tocar  ilya.to...@intel.com

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

testsuite/
2014-09-15  Ilya Tocar  ilya.to...@intel.com

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

---
 gcc/config/i386/driver-i386.c  | 17 +
 gcc/testsuite/gcc.target/i386/avx512f-os-support.h | 17 +++--
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index af3088e..4d6bf83 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -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
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-os-support.h 
b/gcc/testsuite/gcc.target/i386/avx512f-os-support.h
index deefa5e..2f1ed03 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-os-support.h
+++ b/gcc/testsuite/gcc.target/i386/avx512f-os-support.h
@@ -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);
 }
-- 
1.8.3.1



Re: [PATCH,i386] Properly check xgetbv for zmm support.

2014-09-15 Thread Uros Bizjak
On Mon, Sep 15, 2014 at 5:28 PM, Ilya Tocar tocarip.in...@gmail.com wrote:

 Currently we don't check zmm/mask-registers related bits in xgetbv
 output, when detecting native cpu. Patch below fixes it.
 Bootstraps/passes make check.
 Ok for trunk?

 ChangeLog:

 gcc/
 2014-09-15  Ilya Tocar  ilya.to...@intel.com

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

 testsuite/
 2014-09-15  Ilya Tocar  ilya.to...@intel.com

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

OK.

Thanks,
Uros.