diff options
author | Ilya Tocar <ilya.tocar@intel.com> | 2014-09-16 11:57:56 +0000 |
---|---|---|
committer | Ilya Tocar <tocarip@gcc.gnu.org> | 2014-09-16 15:57:56 +0400 |
commit | 2c12f2f4d454249800acbbb23784398cf5ce34d2 (patch) | |
tree | 520fe48be02e7b745253d4abd0b7f2a117230a93 | |
parent | 0774c1603b48fdf17bb605d4d7dc17d39794d19d (diff) | |
download | gcc-2c12f2f4d454249800acbbb23784398cf5ce34d2.zip gcc-2c12f2f4d454249800acbbb23784398cf5ce34d2.tar.gz gcc-2c12f2f4d454249800acbbb23784398cf5ce34d2.tar.bz2 |
driver-i386.c (host_detect_local_cpu): Detect lack of zmm/k regs support.
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/driver-i386.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/avx512f-os-support.h | 17 |
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4ba66a7..d446d2c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> 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/ChangeLog b/gcc/testsuite/ChangeLog index 4d3c96b..c3593a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 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); } |