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
>

Reply via email to