cpuid.h (__cpuid): For 32bit targets...
authorUros Bizjak <ubizjak@gmail.com>
Tue, 21 May 2019 15:17:57 +0000 (17:17 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 21 May 2019 15:17:57 +0000 (17:17 +0200)
* config/i386/cpuid.h (__cpuid): For 32bit targets, zero
%ebx and %ecx bafore calling cpuid with leaf 1 or
non-constant leaf argument.

From-SVN: r271469

gcc/ChangeLog
gcc/config/i386/cpuid.h

index eff11afb0d27cfdae07139b49bfafa1533cc35f3..38f9046ffc77a5e5dc0e0aef26bf1050d4e3cd48 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-21  Uroš Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/cpuid.h (__cpuid): For 32bit targets, zero
+       %ebx and %ecx bafore calling cpuid with leaf 1 or
+       non-constant leaf argument.
+
 2019-05-21  Alan Modra  <amodra@gmail.com>
 
        PR target/90545
index 8ddd425c8b7ea01401fbeb350fd6f05ee6b6cb91..1d6ef335e76da9d72dae3a107b7d0917adbe8cf0 100644 (file)
 #define signature_VORTEX_ecx   0x436f5320
 #define signature_VORTEX_edx   0x36387865
 
+#ifndef __x86_64__
+/* At least one cpu (Winchip 2) does not set %ebx and %ecx
+   for cpuid leaf 1. Forcibly zero the two registers before
+   calling cpuid as a precaution.  */
+#define __cpuid(level, a, b, c, d)                     \
+  do {                                                 \
+    if (__builtin_constant_p (level) && (level) != 1)  \
+      __asm__ ("cpuid\n\t"                             \
+             : "=a" (a), "=b" (b), "=c" (c), "=d" (d)  \
+             : "0" (level));                           \
+    else                                               \
+      __asm__ ("cpuid\n\t"                             \
+             : "=a" (a), "=b" (b), "=c" (c), "=d" (d)  \
+             : "0" (level), "1" (0), "2" (0));         \
+  } while (0)
+#else
 #define __cpuid(level, a, b, c, d)                     \
   __asm__ ("cpuid\n\t"                                 \
           : "=a" (a), "=b" (b), "=c" (c), "=d" (d)     \
           : "0" (level))
+#endif
 
 #define __cpuid_count(level, count, a, b, c, d)                \
   __asm__ ("cpuid\n\t"                                 \