On Mon, Mar 22, 2021 at 5:19 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > 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.
OK. Thanks, Uros. > --- > 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 >