On Mon, Mar 22, 2021 at 5:19 AM H.J. Lu <[email protected]> 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
>