Tested on Linux/x86-64 and Linux/i686.  OK for master and release
branches?

Thanks.

H.J.
---
Since CPUID instruction may return different values on hybrid core.
volatile is needed on asm statements in <cpuid.h>.

        PR target/99704
        * config/i386/cpuid.h (__cpuid): Add __volatile__.
        (__cpuid_count): Likewise.
---
 gcc/config/i386/cpuid.h | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
index 539325d6438..aebc17c6827 100644
--- a/gcc/config/i386/cpuid.h
+++ b/gcc/config/i386/cpuid.h
@@ -212,28 +212,28 @@
 /* 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));         \
+#define __cpuid(level, a, b, c, d)                                     \
+  do {                                                                 \
+    if (__builtin_constant_p (level) && (level) != 1)                  \
+      __asm__ __volatile__ ("cpuid\n\t"                                        
\
+                           : "=a" (a), "=b" (b), "=c" (c), "=d" (d)    \
+                           : "0" (level));                             \
+    else                                                               \
+      __asm__ __volatile__ ("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))
+#define __cpuid(level, a, b, c, d)                                     \
+  __asm__ __volatile__ ("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"                                 \
-          : "=a" (a), "=b" (b), "=c" (c), "=d" (d)     \
-          : "0" (level), "2" (count))
+#define __cpuid_count(level, count, a, b, c, d)                                
\
+  __asm__ __volatile__ ("cpuid\n\t"                                    \
+                       : "=a" (a), "=b" (b), "=c" (c), "=d" (d)        \
+                       : "0" (level), "2" (count))
 
 
 /* Return highest supported input value for cpuid instruction.  ext can
-- 
2.30.2

Reply via email to