re PR driver/60233 (AVX instructions emitted with -march=native on host without AVX...
authorJakub Jelinek <jakub@redhat.com>
Tue, 18 Feb 2014 07:19:46 +0000 (08:19 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 18 Feb 2014 07:19:46 +0000 (08:19 +0100)
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

gcc/ChangeLog
gcc/config/i386/driver-i386.c

index dbd04dbef42dceb536a33246aed1ac5278116403..b1287f83fa8e4afed1372c47411a4bd96aea1960 100644 (file)
@@ -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
index b6eb7e71f6606e6f5906a9dd9ff3f8d484596450..940ae20b665c0928199421ca0762432a25e4861a 100644 (file)
@@ -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