> I don't think *_os_support calls should be removed. IIRC,
> __builtin_cpu_supports function checks if the feature is supported by
> CPU, whereas *_os_supports calls check via xgetbv if OS supports
> handling of new registers.

avx_os_support is like

avx_os_support (void)
{
  unsigned int eax, edx;
  unsigned int ecx = XCR_XFEATURE_ENABLED_MASK;

  __asm__ ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (ecx));

  return (eax & (XSTATE_SSE | XSTATE_YMM)) == (XSTATE_SSE | XSTATE_YMM);
}

While in get_avaliable_features we have

#define XCR_AVX_ENABLED_MASK \
  (XSTATE_SSE | XSTATE_YMM)
  if ((ecx & bit_OSXSAVE))
    {
      /* Check if XMM, YMM, OPMASK, upper 256 bits of ZMM0-ZMM15 and
ZMM16-ZMM31 states are supported by OSXSAVE.  */
      unsigned int xcrlow;
      unsigned int xcrhigh;
      __asm__ (".byte 0x0f, 0x01, 0xd0" /* xgetbv  */
       : "=a" (xcrlow), "=d" (xcrhigh)
       : "c" (XCR_XFEATURE_ENABLED_MASK));
      if ((xcrlow & XCR_AVX_ENABLED_MASK) == XCR_AVX_ENABLED_MASK)
{
  avx_usable = 1;

So __builtin_cpu_supports already inherits same check

Uros Bizjak via Gcc-patches <gcc-patches@gcc.gnu.org> 于2022年5月6日周五 16:27写道:
>
> On Fri, May 6, 2022 at 9:57 AM Haochen Jiang <haochen.ji...@intel.com> wrote:
> >
> > Hi all,
> >
> > There are some check files in i386 testsuite are written before the 
> > function __builtin_cpu_supports is introduced. All of them are using 
> > __get_cpuid_count. This patch aims to reconstruct the i386 testsuite with 
> > __builtin_cpu_supports so that we can have a much clearer code.
> >
> > Regtested on x86_64-pc-linux-gnu. Ok for trunk?
>
> I don't think *_os_support calls should be removed. IIRC,
> __builtin_cpu_supports function checks if the feature is supported by
> CPU, whereas *_os_supports calls check via xgetbv if OS supports
> handling of new registers.
>
> Uros.
>
> >
> > Also when writting this patch, I also find some files in testsuite that 
> > might be useless currently. For example, in the file 
> > gcc/testsuite/gcc.target/i386/sse-os-support.h, it always return 1. And 
> > there are also some files will no longer be included at all with this 
> > patch. Should we remove those files when we have time?
> >
> > BRs,
> > Haochen
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.target/i386/adx-check.h: Change bit check to
> >         __builtin_cpu_supports.
> >         * gcc.target/i386/aes-avx-check.h: Ditto.
> >         * gcc.target/i386/aes-check.h: Ditto.
> >         * gcc.target/i386/avx-check.h: Ditto.
> >         * gcc.target/i386/avx2-check.h: Ditto.
> >         * gcc.target/i386/avx512-check.h: Ditto.
> >         * gcc.target/i386/bmi-check.h: Ditto.
> >         * gcc.target/i386/bmi2-check.h: Ditto.
> >         * gcc.target/i386/f16c-check.h: Ditto.
> >         * gcc.target/i386/fma-check.h: Ditto.
> >         * gcc.target/i386/fma4-check.h: Ditto.
> >         * gcc.target/i386/lzcnt-check.h: Ditto.
> >         * gcc.target/i386/mmx-3dnow-check.h: Ditto.
> >         * gcc.target/i386/mmx-check.h: Ditto.
> >         * gcc.target/i386/pclmul-avx-check.h: Ditto.
> >         * gcc.target/i386/pclmul-check.h: Ditto.
> >         * gcc.target/i386/rtm-check.h: Ditto.
> >         * gcc.target/i386/sha-check.h: Ditto.
> >         * gcc.target/i386/sse-check.h: Ditto.
> >         * gcc.target/i386/sse2-check.h: Ditto.
> >         * gcc.target/i386/sse3-check.h: Ditto.
> >         * gcc.target/i386/sse4_1-check.h: Ditto.
> >         * gcc.target/i386/sse4_2-check.h: Ditto.
> >         * gcc.target/i386/sse4a-check.h: Ditto.
> >         * gcc.target/i386/ssse3-check.h: Ditto.
> >         * gcc.target/i386/xop-check.h: Ditto.
> > ---
> >  gcc/testsuite/gcc.target/i386/adx-check.h     | 10 +---
> >  gcc/testsuite/gcc.target/i386/aes-avx-check.h | 14 +----
> >  gcc/testsuite/gcc.target/i386/aes-check.h     | 11 +---
> >  gcc/testsuite/gcc.target/i386/avx-check.h     | 12 +---
> >  gcc/testsuite/gcc.target/i386/avx2-check.h    | 20 +------
> >  gcc/testsuite/gcc.target/i386/avx512-check.h  | 59 +++++++------------
> >  gcc/testsuite/gcc.target/i386/bmi-check.h     | 11 +---
> >  gcc/testsuite/gcc.target/i386/bmi2-check.h    | 10 +---
> >  gcc/testsuite/gcc.target/i386/f16c-check.h    | 10 +---
> >  gcc/testsuite/gcc.target/i386/fma-check.h     | 11 +---
> >  gcc/testsuite/gcc.target/i386/fma4-check.h    | 11 +---
> >  gcc/testsuite/gcc.target/i386/lzcnt-check.h   | 11 +---
> >  .../gcc.target/i386/mmx-3dnow-check.h         | 11 +---
> >  gcc/testsuite/gcc.target/i386/mmx-check.h     | 11 +---
> >  .../gcc.target/i386/pclmul-avx-check.h        | 14 +----
> >  gcc/testsuite/gcc.target/i386/pclmul-check.h  | 11 +---
> >  gcc/testsuite/gcc.target/i386/rtm-check.h     | 10 +---
> >  gcc/testsuite/gcc.target/i386/sha-check.h     | 10 +---
> >  gcc/testsuite/gcc.target/i386/sse-check.h     | 11 +---
> >  gcc/testsuite/gcc.target/i386/sse2-check.h    | 11 +---
> >  gcc/testsuite/gcc.target/i386/sse3-check.h    | 11 +---
> >  gcc/testsuite/gcc.target/i386/sse4_1-check.h  | 11 +---
> >  gcc/testsuite/gcc.target/i386/sse4_2-check.h  | 11 +---
> >  gcc/testsuite/gcc.target/i386/sse4a-check.h   | 11 +---
> >  gcc/testsuite/gcc.target/i386/ssse3-check.h   | 11 +---
> >  gcc/testsuite/gcc.target/i386/xop-check.h     | 11 +---
> >  26 files changed, 73 insertions(+), 272 deletions(-)
> >
> > diff --git a/gcc/testsuite/gcc.target/i386/adx-check.h 
> > b/gcc/testsuite/gcc.target/i386/adx-check.h
> > index cfed1a38483..bed5dcca385 100644
> > --- a/gcc/testsuite/gcc.target/i386/adx-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/adx-check.h
> > @@ -1,5 +1,4 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >
> >  static void adx_test (void);
> >
> > @@ -11,13 +10,8 @@ static void __attribute__ ((noinline)) do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run ADX test only if host has ADX support.  */
> > -  if (ebx & bit_ADX)
> > +  /* Check cpu support for ADX.  */
> > +  if (__builtin_cpu_supports ("adx"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/aes-avx-check.h 
> > b/gcc/testsuite/gcc.target/i386/aes-avx-check.h
> > index f2a4ead4014..74bf597ead4 100644
> > --- a/gcc/testsuite/gcc.target/i386/aes-avx-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/aes-avx-check.h
> > @@ -2,8 +2,6 @@
> >  #include <stdio.h>
> >  #endif
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> > -#include "avx-os-support.h"
> >
> >  static void aes_avx_test (void);
> >
> > @@ -17,15 +15,9 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run AES + AVX test only if host has AES + AVX support.  */
> > -  if (((ecx & (bit_AVX | bit_OSXSAVE | bit_AES))
> > -       == (bit_AVX | bit_OSXSAVE | bit_AES))
> > -      && avx_os_support ())
> > +  /* Check cpu support for AES and AVX.  */
> > +  if (__builtin_cpu_supports ("avx")
> > +      && __builtin_cpu_supports ("aes"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/aes-check.h 
> > b/gcc/testsuite/gcc.target/i386/aes-check.h
> > index 7e794423e47..7c3a3b324a7 100644
> > --- a/gcc/testsuite/gcc.target/i386/aes-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/aes-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void aes_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run AES test only if host has AES support.  */
> > -  if (ecx & bit_AES)
> > +  /* Check cpu support for AES.  */
> > +  if (__builtin_cpu_supports ("aes"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/avx-check.h 
> > b/gcc/testsuite/gcc.target/i386/avx-check.h
> > index 7ddca9d7b80..4a3dbc257bc 100644
> > --- a/gcc/testsuite/gcc.target/i386/avx-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/avx-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >  #include "m256-check.h"
> > -#include "avx-os-support.h"
> >
> >  static void avx_test (void);
> >
> > @@ -15,14 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run AVX test only if host has AVX support.  */
> > -  if (((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
> > -      && avx_os_support ())
> > +  /* Check cpu support for AVX.  */
> > +  if (__builtin_cpu_supports ("avx"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/avx2-check.h 
> > b/gcc/testsuite/gcc.target/i386/avx2-check.h
> > index 25bed5e0da6..2bc3c4425bb 100644
> > --- a/gcc/testsuite/gcc.target/i386/avx2-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/avx2-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >  #include "m256-check.h"
> > -#include "avx-os-support.h"
> >
> >  static void avx2_test (void);
> >
> > @@ -10,25 +8,11 @@ static void __attribute__ ((noinline)) do_test (void)
> >    avx2_test ();
> >  }
> >
> > -static int
> > -check_osxsave (void)
> > -{
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  __cpuid (1, eax, ebx, ecx, edx);
> > -  return (ecx & bit_OSXSAVE) != 0;
> > -}
> > -
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run AVX2 test only if host has AVX2 support.  */
> > -  if (check_osxsave () && (ebx & bit_AVX2) && avx_os_support ())
> > +  /* Check cpu support for AVX2.  */
> > +  if (__builtin_cpu_supports ("avx2"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/avx512-check.h 
> > b/gcc/testsuite/gcc.target/i386/avx512-check.h
> > index 0ad9064f637..339c79070c9 100644
> > --- a/gcc/testsuite/gcc.target/i386/avx512-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/avx512-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >  #include "m512-check.h"
> > -#include "avx512f-os-support.h"
> >
> >  #ifndef DO_TEST
> >  #define DO_TEST do_test
> > @@ -25,81 +23,66 @@ do_test (void)
> >  }
> >  #endif
> >
> > -static int
> > -check_osxsave (void)
> > -{
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  __cpuid (1, eax, ebx, ecx, edx);
> > -  return (ecx & bit_OSXSAVE) != 0;
> > -}
> > -
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run AVX512 test only if host has ISA support.  */
> > -  if (check_osxsave ()
> > -      && (ebx & bit_AVX512F)
> > +  /* Check cpu support for AVX512.  */
> > +  if (__builtin_cpu_supports ("avx512f")
> >  #ifdef AVX512VL
> > -      && (ebx & bit_AVX512VL)
> > +      && __builtin_cpu_supports ("avx512vl")
> >  #endif
> >  #ifdef AVX512ER
> > -      && (ebx & bit_AVX512ER)
> > +      && __builtin_cpu_supports ("avx512er")
> >  #endif
> >  #ifdef AVX512CD
> > -      && (ebx & bit_AVX512CD)
> > +      && __builtin_cpu_supports ("avx512cd")
> >  #endif
> >  #ifdef AVX512DQ
> > -      && (ebx & bit_AVX512DQ)
> > +      && __builtin_cpu_supports ("avx512dq")
> >  #endif
> >  #ifdef AVX512BW
> > -      && (ebx & bit_AVX512BW)
> > +      && __builtin_cpu_supports ("avx512bw")
> >  #endif
> >  #ifdef AVX512IFMA
> > -      && (ebx & bit_AVX512IFMA)
> > +      && __builtin_cpu_supports ("avx512ifma")
> >  #endif
> >  #ifdef AVX512VBMI
> > -      && (ecx & bit_AVX512VBMI)
> > +      && __builtin_cpu_supports ("avx512vbmi")
> >  #endif
> >  #ifdef AVX5124FMAPS
> > -      && (edx & bit_AVX5124FMAPS)
> > +      && __builtin_cpu_supports ("avx5124fmaps")
> >  #endif
> >  #ifdef AVX5124VNNIW
> > -      && (edx & bit_AVX5124VNNIW)
> > +      && __builtin_cpu_supports ("avx5124vnniw")
> >  #endif
> >  #ifdef AVX512VPOPCNTDQ
> > -      && (ecx & bit_AVX512VPOPCNTDQ)
> > +      && __builtin_cpu_supports ("avx512vpopcntdq")
> >  #endif
> >  #ifdef AVX512BITALG
> > -      && (ecx & bit_AVX512BITALG)
> > +      && __builtin_cpu_supports ("avx512bitalg")
> >  #endif
> >  #ifdef GFNI
> > -      && (ecx & bit_GFNI)
> > +      && __builtin_cpu_supports ("gfni")
> >  #endif
> >  #ifdef AVX512VBMI2
> > -      && (ecx & bit_AVX512VBMI2)
> > +      && __builtin_cpu_supports ("avx512vbmi2")
> >  #endif
> >  #ifdef AVX512VNNI
> > -      && (ecx & bit_AVX512VNNI)
> > +      && __builtin_cpu_supports ("avx512vnni")
> >  #endif
> >  #ifdef AVX512FP16
> > -      && (edx & bit_AVX512FP16)
> > +      && __builtin_cpu_supports ("avx512fp16")
> >  #endif
> >  #ifdef VAES
> > -      && (ecx & bit_VAES)
> > +      && __builtin_cpu_supports ("vaes")
> >  #endif
> >  #ifdef VPCLMULQDQ
> > -      && (ecx & bit_VPCLMULQDQ)
> > +      && __builtin_cpu_supports ("vpclmulqdq")
> >  #endif
> >  #ifdef AVX512VP2INTERSECT
> > -      && (edx & bit_AVX512VP2INTERSECT)
> > +      && __builtin_cpu_supports ("avx512vp2intersect")
> >  #endif
> > -      && avx512f_os_support ())
> > +      )
> >      {
> >        DO_TEST ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/bmi-check.h 
> > b/gcc/testsuite/gcc.target/i386/bmi-check.h
> > index 1973f3b6468..6af0291a947 100644
> > --- a/gcc/testsuite/gcc.target/i386/bmi-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/bmi-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void bmi_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run BMI test only if host has BMI support.  */
> > -  if (ebx & bit_BMI)
> > +  /* Check cpu support for BMI.  */
> > +  if (__builtin_cpu_supports ("bmi"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/bmi2-check.h 
> > b/gcc/testsuite/gcc.target/i386/bmi2-check.h
> > index ba91ef9b780..75c4d8d9616 100644
> > --- a/gcc/testsuite/gcc.target/i386/bmi2-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/bmi2-check.h
> > @@ -1,6 +1,5 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >
> >  static void bmi2_test (void);
> >
> > @@ -14,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run BMI2 test only if host has BMI2 support.  */
> > -  if (ebx & bit_BMI2)
> > +  /* Check cpu support for BMI2.  */
> > +  if (__builtin_cpu_supports ("bmi2"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/f16c-check.h 
> > b/gcc/testsuite/gcc.target/i386/f16c-check.h
> > index af7f32c5f4f..2cbf34ab516 100644
> > --- a/gcc/testsuite/gcc.target/i386/f16c-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/f16c-check.h
> > @@ -1,6 +1,5 @@
> >  #include <stdlib.h>
> >  #include <stdio.h>
> > -#include "cpuid.h"
> >  #include "m256-check.h"
> >
> >  static void f16c_test (void);
> > @@ -8,13 +7,8 @@ static void f16c_test (void);
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run F16C test only if host has F16C support.  */
> > -  if (ecx & bit_F16C)
> > +  /* Check cpu support for F16C.  */
> > +  if (__builtin_cpu_supports ("f16c"))
> >      {
> >        f16c_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/fma-check.h 
> > b/gcc/testsuite/gcc.target/i386/fma-check.h
> > index 8390f5088bd..6c1d3372218 100644
> > --- a/gcc/testsuite/gcc.target/i386/fma-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/fma-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void fma_test (void);
> >
> >  static void __attribute__ ((noinline)) do_test (void)
> > @@ -12,13 +10,8 @@ static void __attribute__ ((noinline)) do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run FMA test only if host has FMA support.  */
> > -  if (ecx & bit_FMA)
> > +  /* Check cpu support for FMA.  */
> > +  if (__builtin_cpu_supports ("fma"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/fma4-check.h 
> > b/gcc/testsuite/gcc.target/i386/fma4-check.h
> > index 33cd9628c04..2d2c2718029 100644
> > --- a/gcc/testsuite/gcc.target/i386/fma4-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/fma4-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void fma4_test (void);
> >
> >  static void
> > @@ -14,13 +12,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run FMA4 test only if host has FMA4 support.  */
> > -  if (ecx & bit_FMA4)
> > +  /* Check cpu support foe FMA4.  */
> > +  if (__builtin_cpu_supports ("fma4"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/lzcnt-check.h 
> > b/gcc/testsuite/gcc.target/i386/lzcnt-check.h
> > index 8aad834d6af..824f1a3b513 100644
> > --- a/gcc/testsuite/gcc.target/i386/lzcnt-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/lzcnt-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void lzcnt_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run LZCNT test only if host has LZCNT support.  */
> > -  if (ecx & bit_LZCNT)
> > +  /* Check cpu support for LZCNT.  */
> > +  if (__builtin_cpu_supports ("lzcnt"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h 
> > b/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h
> > index 4f2f7f3ac40..0ec2dca2e19 100644
> > --- a/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void mmx_3dnow_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run 3DNow! test only if host has 3DNow! support.  */
> > -  if (edx & bit_3DNOW)
> > +  /* Check cpu support for 3DNow!.  */
> > +  if (__builtin_cpu_supports ("3dnow"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/mmx-check.h 
> > b/gcc/testsuite/gcc.target/i386/mmx-check.h
> > index faf9b876f38..2afe5183ba2 100644
> > --- a/gcc/testsuite/gcc.target/i386/mmx-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/mmx-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void mmx_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run MMX test only if host has MMX support.  */
> > -  if (edx & bit_MMX)
> > +  /* Check cpu support for MMX.  */
> > +  if (__builtin_cpu_supports ("mmx"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h 
> > b/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h
> > index 5eed2e2203c..b506b3306e6 100644
> > --- a/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/pclmul-avx-check.h
> > @@ -2,8 +2,6 @@
> >  #include <stdio.h>
> >  #endif
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> > -#include "avx-os-support.h"
> >
> >  static void pclmul_avx_test (void);
> >
> > @@ -17,15 +15,9 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run PCLMUL + AVX test only if host has PCLMUL + AVX support.  */
> > -  if (((ecx & (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
> > -       == (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
> > -      && avx_os_support ())
> > +  /* Check cpu support for PCLMUL and AVX.  */
> > +  if (__builtin_cpu_supports ("pclmul")
> > +      && __builtin_cpu_supports ("avx"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/pclmul-check.h 
> > b/gcc/testsuite/gcc.target/i386/pclmul-check.h
> > index 7526cbe2ddf..3ed1a044627 100644
> > --- a/gcc/testsuite/gcc.target/i386/pclmul-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/pclmul-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void pclmul_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run PCLMULQDQ test only if host has PCLMULQDQ support.  */
> > -  if (ecx & bit_PCLMUL)
> > +  /* Check cpu support for PCLMUL.  */
> > +  if (__builtin_cpu_supports ("pclmul"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/rtm-check.h 
> > b/gcc/testsuite/gcc.target/i386/rtm-check.h
> > index bdb5a6dc0bf..4121e602a7f 100644
> > --- a/gcc/testsuite/gcc.target/i386/rtm-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/rtm-check.h
> > @@ -1,5 +1,4 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >
> >  static void rtm_test (void);
> >
> > @@ -11,13 +10,8 @@ static void __attribute__ ((noinline)) do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run RTM test only if host has RTM support.  */
> > -  if (ebx & bit_RTM)
> > +  /* Check cpu support for RTM.  */
> > +  if (__builtin_cpu_supports ("rtm"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/sha-check.h 
> > b/gcc/testsuite/gcc.target/i386/sha-check.h
> > index 5bc5a59ab80..61ce43053f9 100644
> > --- a/gcc/testsuite/gcc.target/i386/sha-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sha-check.h
> > @@ -1,5 +1,4 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >
> >  static void sha_test (void);
> >
> > @@ -13,13 +12,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SHA test only if host has SHA support.  */
> > -  if (ebx & bit_SHA)
> > +  /* Check cpu support for SHA.  */
> > +  if (__builtin_cpu_supports ("sha"))
> >      {
> >        do_test ();
> >  #ifdef DEBUG
> > diff --git a/gcc/testsuite/gcc.target/i386/sse-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse-check.h
> > index 11b71bc3e97..58bc88c5598 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> >  #include "m128-check.h"
> > -#include "cpuid.h"
> > -#include "sse-os-support.h"
> >
> >  static void sse_test (void);
> >
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE test only if host has SSE support.  */
> > -  if ((edx & bit_SSE) && sse_os_support ())
> > +  /* Check cpu support for SSE.  */
> > +  if (__builtin_cpu_supports ("sse"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/sse2-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse2-check.h
> > index fd4a6ce1dbf..4976a27022d 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse2-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse2-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> >  #include "m128-check.h"
> > -#include "sse-os-support.h"
> >
> >  static void sse2_test (void);
> >
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE2 test only if host has SSE2 support.  */
> > -  if ((edx & bit_SSE2) && sse_os_support ())
> > +  /* Check cpu support for SSE2.  */
> > +  if (__builtin_cpu_supports ("sse2"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/sse3-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse3-check.h
> > index 5a0a0b1a02e..3c58361e925 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse3-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse3-check.h
> > @@ -1,7 +1,5 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> > -#include "cpuid.h"
> > -#include "sse-os-support.h"
> >
> >  static void sse3_test (void);
> >
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE3 test only if host has SSE3 support.  */
> > -  if ((ecx & bit_SSE3) && sse_os_support ())
> > +  /* Check cpu support for SSE3.  */
> > +  if (__builtin_cpu_supports ("sse3"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse4_1-check.h
> > index 788f65d61cb..61d0d0284a8 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse4_1-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse4_1-check.h
> > @@ -1,6 +1,4 @@
> >  #include <stdlib.h>
> > -
> > -#include "cpuid.h"
> >  #include "m128-check.h"
> >
> >  static void sse4_1_test (void);
> > @@ -17,13 +15,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE4.1 test only if host has SSE4.1 support.  */
> > -  if (ecx & bit_SSE4_1)
> > +  /* Check cpu support for SSE4.1.  */
> > +  if (__builtin_cpu_supports ("sse4.1"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/sse4_2-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse4_2-check.h
> > index c33cd1b4986..6c921ac52c7 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse4_2-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse4_2-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> > -
> >  #include "m128-check.h"
> > -#include "cpuid.h"
> >
> >  static void sse4_2_test (void);
> >
> > @@ -16,13 +14,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE4.2 test only if host has SSE4.2 support.  */
> > -  if (ecx & bit_SSE4_2)
> > +  /* Check cpu support for SSE4.2.  */
> > +  if (__builtin_cpu_supports ("sse4.2"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/sse4a-check.h 
> > b/gcc/testsuite/gcc.target/i386/sse4a-check.h
> > index d43b4b222b1..ae70ff0a268 100644
> > --- a/gcc/testsuite/gcc.target/i386/sse4a-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/sse4a-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void sse4a_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSE4a test only if host has SSE4a support.  */
> > -  if (ecx & bit_SSE4a)
> > +  /* Check cpu support for SSE4a.  */
> > +  if (__builtin_cpu_supports ("sse4a"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/ssse3-check.h 
> > b/gcc/testsuite/gcc.target/i386/ssse3-check.h
> > index 3ca79333c7f..3e834811f2d 100644
> > --- a/gcc/testsuite/gcc.target/i386/ssse3-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/ssse3-check.h
> > @@ -1,8 +1,6 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include "cpuid.h"
> > -
> >  static void ssse3_test (void);
> >
> >  static void
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run SSSE3 test only if host has SSSE3 support.  */
> > -  if (ecx & bit_SSSE3)
> > +  /* Check cpu support for SSSE3.  */
> > +  if (__builtin_cpu_supports ("ssse3"))
> >      do_test ();
> >
> >    return 0;
> > diff --git a/gcc/testsuite/gcc.target/i386/xop-check.h 
> > b/gcc/testsuite/gcc.target/i386/xop-check.h
> > index 395abe8766d..e1ef1273111 100644
> > --- a/gcc/testsuite/gcc.target/i386/xop-check.h
> > +++ b/gcc/testsuite/gcc.target/i386/xop-check.h
> > @@ -1,6 +1,4 @@
> >  #include <stdlib.h>
> > -
> > -#include "cpuid.h"
> >  #include "m256-check.h"
> >
> >  static void xop_test (void);
> > @@ -15,13 +13,8 @@ do_test (void)
> >  int
> >  main ()
> >  {
> > -  unsigned int eax, ebx, ecx, edx;
> > -
> > -  if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx))
> > -    return 0;
> > -
> > -  /* Run XOP test only if host has XOP support.  */
> > -  if (ecx & bit_XOP)
> > +  /* Check cpu support for XOP.  */
> > +  if (__builtin_cpu_supports ("xop"))
> >      do_test ();
> >
> >    return 0;
> > --
> > 2.18.1
> >

Reply via email to