diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-02-18 08:19:46 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-02-18 08:19:46 +0100 |
commit | d0b50387bcfac86cf270194aacc4a7677e621708 (patch) | |
tree | 1a39797d8737e7cdb9c01cc095ebe9c6446464fb /gcc | |
parent | c4cd7435e4ace8e90561b659b810dd5a5841f77a (diff) | |
download | gcc-d0b50387bcfac86cf270194aacc4a7677e621708.zip gcc-d0b50387bcfac86cf270194aacc4a7677e621708.tar.gz gcc-d0b50387bcfac86cf270194aacc4a7677e621708.tar.bz2 |
re PR driver/60233 (AVX instructions emitted with -march=native on host without AVX support)
PR driver/60233
* config/i386/driver-i386.c (host_detect_local_cpu): If
YMM state is not saved by the OS, also clear has_f16c. Move
CPUID 0x80000001 handling before YMM state saving checking.
Co-Authored-By: Uros Bizjak <ubizjak@gmail.com>
From-SVN: r207833
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/driver-i386.c | 45 |
2 files changed, 31 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dbd04db..b1287f8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-02-18 Jakub Jelinek <jakub@redhat.com> + Uros Bizjak <ubizjak@gmail.com> + + PR driver/60233 + * config/i386/driver-i386.c (host_detect_local_cpu): If + YMM state is not saved by the OS, also clear has_f16c. Move + CPUID 0x80000001 handling before YMM state saving checking. + 2014-02-18 Andrey Belevantsev <abel@ispras.ru> PR rtl-optimization/58960 diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c index b6eb7e7..940ae20 100644 --- a/gcc/config/i386/driver-i386.c +++ b/gcc/config/i386/driver-i386.c @@ -495,6 +495,28 @@ const char *host_detect_local_cpu (int argc, const char **argv) has_xsaveopt = eax & bit_XSAVEOPT; } + /* Check cpuid level of extended features. */ + __cpuid (0x80000000, ext_level, ebx, ecx, edx); + + if (ext_level > 0x80000000) + { + __cpuid (0x80000001, eax, ebx, ecx, edx); + + has_lahf_lm = ecx & bit_LAHF_LM; + has_sse4a = ecx & bit_SSE4a; + has_abm = ecx & bit_ABM; + has_lwp = ecx & bit_LWP; + has_fma4 = ecx & bit_FMA4; + has_xop = ecx & bit_XOP; + has_tbm = ecx & bit_TBM; + has_lzcnt = ecx & bit_LZCNT; + has_prfchw = ecx & bit_PRFCHW; + + has_longmode = edx & bit_LM; + has_3dnowp = edx & bit_3DNOWP; + has_3dnow = edx & bit_3DNOW; + } + /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv. */ #define XCR_XFEATURE_ENABLED_MASK 0x0 #define XSTATE_FP 0x1 @@ -513,33 +535,12 @@ const char *host_detect_local_cpu (int argc, const char **argv) has_avx2 = 0; has_fma = 0; has_fma4 = 0; + has_f16c = 0; has_xop = 0; has_xsave = 0; has_xsaveopt = 0; } - /* Check cpuid level of extended features. */ - __cpuid (0x80000000, ext_level, ebx, ecx, edx); - - if (ext_level > 0x80000000) - { - __cpuid (0x80000001, eax, ebx, ecx, edx); - - has_lahf_lm = ecx & bit_LAHF_LM; - has_sse4a = ecx & bit_SSE4a; - has_abm = ecx & bit_ABM; - has_lwp = ecx & bit_LWP; - has_fma4 = ecx & bit_FMA4; - has_xop = ecx & bit_XOP; - has_tbm = ecx & bit_TBM; - has_lzcnt = ecx & bit_LZCNT; - has_prfchw = ecx & bit_PRFCHW; - - has_longmode = edx & bit_LM; - has_3dnowp = edx & bit_3DNOWP; - has_3dnow = edx & bit_3DNOW; - } - if (!arch) { if (vendor == signature_AMD_ebx |