Blame sysdeps/x86/tst-cpu-features-supports.c

Packit Service 394270
/* Test CPU feature data against __builtin_cpu_supports.
Packit Service 394270
   This file is part of the GNU C Library.
Packit Service 394270
   Copyright (C) 2020 Free Software Foundation, Inc.
Packit Service 394270
Packit Service 394270
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 394270
   modify it under the terms of the GNU Lesser General Public
Packit Service 394270
   License as published by the Free Software Foundation; either
Packit Service 394270
   version 2.1 of the License, or (at your option) any later version.
Packit Service 394270
Packit Service 394270
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 394270
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 394270
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 394270
   Lesser General Public License for more details.
Packit Service 394270
Packit Service 394270
   You should have received a copy of the GNU Lesser General Public
Packit Service 394270
   License along with the GNU C Library; if not, see
Packit Service 394270
   <https://www.gnu.org/licenses/>.  */
Packit Service 394270
Packit Service 394270
#include <sys/platform/x86.h>
Packit Service 394270
#include <stdio.h>
Packit Service 394270
Packit Service 394270
int
Packit Service 394270
check_supports (int supports, int usable, const char *supports_name,
Packit Service 394270
		const char *name)
Packit Service 394270
{
Packit Service 394270
  printf ("Checking %s:\n", name);
Packit Service 394270
  printf ("  %s: %d\n", name, usable);
Packit Service 394270
  printf ("  __builtin_cpu_supports (%s): %d\n",
Packit Service 394270
	  supports_name, supports);
Packit Service 394270
Packit Service 394270
  if ((supports != 0) != (usable != 0))
Packit Service 394270
    {
Packit Service 394270
      printf (" *** failure ***\n");
Packit Service 394270
      return 1;
Packit Service 394270
    }
Packit Service 394270
Packit Service 394270
  return 0;
Packit Service 394270
}
Packit Service 394270
Packit Service 394270
#define CHECK_SUPPORTS(str, name) \
Packit Service 394270
  check_supports (__builtin_cpu_supports (#str), \
Packit Service 394270
		  CPU_FEATURE_USABLE (name), \
Packit Service 394270
		  #str, "HAS_CPU_FEATURE (" #name ")");
Packit Service 394270
Packit Service 394270
static int
Packit Service 394270
do_test (int argc, char **argv)
Packit Service 394270
{
Packit Service 394270
  int fails = 0;
Packit Service 394270
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (adx, ADX);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (6, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (aes, AES);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 1)
Packit Service 394270
  fails += CHECK_SUPPORTS (amx_bf16, AMX_BF16);
Packit Service 394270
  fails += CHECK_SUPPORTS (amx_int8, AMX_INT8);
Packit Service 394270
  fails += CHECK_SUPPORTS (amx_tile, AMX_TILE);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (avx, AVX);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx2, AVX2);
Packit Service 394270
#if __GNUC_PREREQ (7, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx5124fmaps, AVX512_4FMAPS);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx5124vnniw, AVX512_4VNNIW);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (10, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512bf16, AVX512_BF16);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (8, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512bitalg, AVX512_BITALG);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (6, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512ifma, AVX512_IFMA);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vbmi, AVX512_VBMI);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (8, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vbmi2, AVX512_VBMI2);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vnni, AVX512_VNNI);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (10, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vp2intersect, AVX512_VP2INTERSECT);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (7, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vpopcntdq, AVX512_VPOPCNTDQ);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (6, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512bw, AVX512BW);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512cd, AVX512CD);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512er, AVX512ER);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512dq, AVX512DQ);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (5, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512f, AVX512F);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (6, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512pf, AVX512PF);
Packit Service 394270
  fails += CHECK_SUPPORTS (avx512vl, AVX512VL);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (5, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (bmi, BMI1);
Packit Service 394270
  fails += CHECK_SUPPORTS (bmi2, BMI2);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (cldemote, CLDEMOTE);
Packit Service 394270
  fails += CHECK_SUPPORTS (clflushopt, CLFLUSHOPT);
Packit Service 394270
  fails += CHECK_SUPPORTS (clwb, CLWB);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (cmov, CMOV);
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (cmpxchg16b, CMPXCHG16B);
Packit Service 394270
  fails += CHECK_SUPPORTS (cmpxchg8b, CX8);
Packit Service 394270
  fails += CHECK_SUPPORTS (enqcmd, ENQCMD);
Packit Service 394270
  fails += CHECK_SUPPORTS (f16c, F16C);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (4, 9)
Packit Service 394270
  fails += CHECK_SUPPORTS (fma, FMA);
Packit Service 394270
  fails += CHECK_SUPPORTS (fma4, FMA4);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (fsgsbase, FSGSBASE);
Packit Service 394270
  fails += CHECK_SUPPORTS (fxsave, FXSR);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (8, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (gfni, GFNI);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (hle, HLE);
Packit Service 394270
  fails += CHECK_SUPPORTS (ibt, IBT);
Packit Service 394270
  fails += CHECK_SUPPORTS (lahf_lm, LAHF64_SAHF64);
Packit Service 394270
  fails += CHECK_SUPPORTS (lm, LM);
Packit Service 394270
  fails += CHECK_SUPPORTS (lwp, LWP);
Packit Service 394270
  fails += CHECK_SUPPORTS (lzcnt, LZCNT);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (mmx, MMX);
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (movbe, MOVBE);
Packit Service 394270
  fails += CHECK_SUPPORTS (movdiri, MOVDIRI);
Packit Service 394270
  fails += CHECK_SUPPORTS (movdir64b, MOVDIR64B);
Packit Service 394270
  fails += CHECK_SUPPORTS (osxsave, OSXSAVE);
Packit Service 394270
  fails += CHECK_SUPPORTS (pconfig, PCONFIG);
Packit Service 394270
  fails += CHECK_SUPPORTS (pku, PKU);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (popcnt, POPCNT);
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (prefetchwt1, PREFETCHWT1);
Packit Service 394270
  fails += CHECK_SUPPORTS (rdpid, RDPID);
Packit Service 394270
  fails += CHECK_SUPPORTS (rdrnd, RDRAND);
Packit Service 394270
  fails += CHECK_SUPPORTS (rdseed, RDSEED);
Packit Service 394270
  fails += CHECK_SUPPORTS (rtm, RTM);
Packit Service 394270
  fails += CHECK_SUPPORTS (serialize, SERIALIZE);
Packit Service 394270
  fails += CHECK_SUPPORTS (sha, SHA);
Packit Service 394270
  fails += CHECK_SUPPORTS (shstk, SHSTK);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (sse, SSE);
Packit Service 394270
  fails += CHECK_SUPPORTS (sse2, SSE2);
Packit Service 394270
  fails += CHECK_SUPPORTS (sse3, SSE3);
Packit Service 394270
  fails += CHECK_SUPPORTS (sse4.1, SSE4_1);
Packit Service 394270
  fails += CHECK_SUPPORTS (sse4.2, SSE4_2);
Packit Service 394270
#if __GNUC_PREREQ (4, 9)
Packit Service 394270
  fails += CHECK_SUPPORTS (sse4a, SSE4A);
Packit Service 394270
#endif
Packit Service 394270
  fails += CHECK_SUPPORTS (ssse3, SSSE3);
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (tbm, TBM);
Packit Service 394270
  fails += CHECK_SUPPORTS (tsxldtrk, TSXLDTRK);
Packit Service 394270
  fails += CHECK_SUPPORTS (vaes, VAES);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (8, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (vpclmulqdq, VPCLMULQDQ);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (waitpkg, WAITPKG);
Packit Service 394270
  fails += CHECK_SUPPORTS (wbnoinvd, WBNOINVD);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (4, 9)
Packit Service 394270
  fails += CHECK_SUPPORTS (xop, XOP);
Packit Service 394270
#endif
Packit Service 394270
#if __GNUC_PREREQ (11, 0)
Packit Service 394270
  fails += CHECK_SUPPORTS (xsave, XSAVE);
Packit Service 394270
  fails += CHECK_SUPPORTS (xsavec, XSAVEC);
Packit Service 394270
  fails += CHECK_SUPPORTS (xsaveopt, XSAVEOPT);
Packit Service 394270
  fails += CHECK_SUPPORTS (xsaves, XSAVES);
Packit Service 394270
#endif
Packit Service 394270
Packit Service 394270
  printf ("%d differences between __builtin_cpu_supports and glibc code.\n",
Packit Service 394270
	  fails);
Packit Service 394270
Packit Service 394270
  return (fails != 0);
Packit Service 394270
}
Packit Service 394270
Packit Service 394270
#include "../../../test-skeleton.c"