1/* Test CPU feature data against __builtin_cpu_supports.
2 This file is part of the GNU C Library.
3 Copyright (C) 2020-2024 Free Software Foundation, Inc.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <sys/platform/x86.h>
20#include <stdio.h>
21
22int
23check_supports (int supports, int active, const char *supports_name,
24 const char *name)
25{
26 printf (format: "Checking %s:\n", name);
27 printf (format: " %s: %d\n", name, active);
28 printf (format: " __builtin_cpu_supports (%s): %d\n",
29 supports_name, supports);
30
31 if ((supports != 0) != (active != 0))
32 {
33 printf (format: " *** failure ***\n");
34 return 1;
35 }
36
37 return 0;
38}
39
40#define CHECK_FEATURE_ACTIVE(str, name) \
41 check_supports (__builtin_cpu_supports (#str), \
42 CPU_FEATURE_ACTIVE (name), \
43 #str, "CPU_FEATURE_ACTIVE (" #name ")");
44
45#define CHECK_FEATURE_PRESENT(str, name) \
46 check_supports (__builtin_cpu_supports (#str), \
47 CPU_FEATURE_PRESENT (name), \
48 #str, "CPU_FEATURE_PRESENT (" #name ")");
49
50static int
51do_test (int argc, char **argv)
52{
53 int fails = 0;
54
55#if __GNUC_PREREQ (11, 0)
56 fails += CHECK_FEATURE_ACTIVE (adx, ADX);
57#endif
58#if __GNUC_PREREQ (6, 0)
59 fails += CHECK_FEATURE_ACTIVE (aes, AES);
60#endif
61#if __GNUC_PREREQ (11, 1)
62 fails += CHECK_FEATURE_ACTIVE (amx-bf16, AMX_BF16);
63 fails += CHECK_FEATURE_ACTIVE (amx-int8, AMX_INT8);
64 fails += CHECK_FEATURE_ACTIVE (amx-tile, AMX_TILE);
65#endif
66 fails += CHECK_FEATURE_ACTIVE (avx, AVX);
67 fails += CHECK_FEATURE_ACTIVE (avx2, AVX2);
68#if __GNUC_PREREQ (7, 0) && !__GNUC_PREREQ (15, 0)
69 fails += CHECK_FEATURE_ACTIVE (avx5124fmaps, AVX512_4FMAPS);
70 fails += CHECK_FEATURE_ACTIVE (avx5124vnniw, AVX512_4VNNIW);
71#endif
72#if __GNUC_PREREQ (10, 0)
73 fails += CHECK_FEATURE_ACTIVE (avx512bf16, AVX512_BF16);
74#endif
75#if __GNUC_PREREQ (8, 0)
76 fails += CHECK_FEATURE_ACTIVE (avx512bitalg, AVX512_BITALG);
77#endif
78#if __GNUC_PREREQ (6, 0)
79 fails += CHECK_FEATURE_ACTIVE (avx512ifma, AVX512_IFMA);
80 fails += CHECK_FEATURE_ACTIVE (avx512vbmi, AVX512_VBMI);
81#endif
82#if __GNUC_PREREQ (8, 0)
83 fails += CHECK_FEATURE_ACTIVE (avx512vbmi2, AVX512_VBMI2);
84 fails += CHECK_FEATURE_ACTIVE (avx512vnni, AVX512_VNNI);
85#endif
86#if __GNUC_PREREQ (10, 0)
87 fails += CHECK_FEATURE_ACTIVE (avx512vp2intersect, AVX512_VP2INTERSECT);
88#endif
89#if __GNUC_PREREQ (7, 0)
90 fails += CHECK_FEATURE_ACTIVE (avx512vpopcntdq, AVX512_VPOPCNTDQ);
91#endif
92#if __GNUC_PREREQ (6, 0)
93 fails += CHECK_FEATURE_ACTIVE (avx512bw, AVX512BW);
94 fails += CHECK_FEATURE_ACTIVE (avx512cd, AVX512CD);
95# if !__GNUC_PREREQ (15, 0)
96 fails += CHECK_FEATURE_ACTIVE (avx512er, AVX512ER);
97# endif
98 fails += CHECK_FEATURE_ACTIVE (avx512dq, AVX512DQ);
99#endif
100#if __GNUC_PREREQ (5, 0)
101 fails += CHECK_FEATURE_ACTIVE (avx512f, AVX512F);
102#endif
103#if __GNUC_PREREQ (6, 0)
104# if !__GNUC_PREREQ (15, 0)
105 fails += CHECK_FEATURE_ACTIVE (avx512pf, AVX512PF);
106# endif
107 fails += CHECK_FEATURE_ACTIVE (avx512vl, AVX512VL);
108#endif
109#if __GNUC_PREREQ (5, 0)
110 fails += CHECK_FEATURE_ACTIVE (bmi, BMI1);
111 fails += CHECK_FEATURE_ACTIVE (bmi2, BMI2);
112#endif
113#if __GNUC_PREREQ (11, 0)
114 fails += CHECK_FEATURE_ACTIVE (cldemote, CLDEMOTE);
115 fails += CHECK_FEATURE_ACTIVE (clflushopt, CLFLUSHOPT);
116 fails += CHECK_FEATURE_ACTIVE (clwb, CLWB);
117#endif
118 fails += CHECK_FEATURE_ACTIVE (cmov, CMOV);
119#if __GNUC_PREREQ (11, 0)
120 fails += CHECK_FEATURE_ACTIVE (cmpxchg16b, CMPXCHG16B);
121 fails += CHECK_FEATURE_ACTIVE (cmpxchg8b, CX8);
122 fails += CHECK_FEATURE_ACTIVE (enqcmd, ENQCMD);
123 fails += CHECK_FEATURE_ACTIVE (f16c, F16C);
124#endif
125#if __GNUC_PREREQ (4, 9)
126 fails += CHECK_FEATURE_ACTIVE (fma, FMA);
127 fails += CHECK_FEATURE_ACTIVE (fma4, FMA4);
128#endif
129#if __GNUC_PREREQ (11, 0)
130 fails += CHECK_FEATURE_PRESENT (fsgsbase, FSGSBASE);
131 fails += CHECK_FEATURE_ACTIVE (fxsave, FXSR);
132#endif
133#if __GNUC_PREREQ (8, 0)
134 fails += CHECK_FEATURE_ACTIVE (gfni, GFNI);
135#endif
136#if __GNUC_PREREQ (11, 0)
137 fails += CHECK_FEATURE_PRESENT (hle, HLE);
138 fails += CHECK_FEATURE_PRESENT (ibt, IBT);
139 fails += CHECK_FEATURE_ACTIVE (lahf_lm, LAHF64_SAHF64);
140 fails += CHECK_FEATURE_PRESENT (lm, LM);
141 fails += CHECK_FEATURE_ACTIVE (lwp, LWP);
142 fails += CHECK_FEATURE_ACTIVE (lzcnt, LZCNT);
143#endif
144 fails += CHECK_FEATURE_ACTIVE (mmx, MMX);
145#if __GNUC_PREREQ (11, 0)
146 fails += CHECK_FEATURE_ACTIVE (movbe, MOVBE);
147 fails += CHECK_FEATURE_ACTIVE (movdiri, MOVDIRI);
148 fails += CHECK_FEATURE_ACTIVE (movdir64b, MOVDIR64B);
149 fails += CHECK_FEATURE_ACTIVE (osxsave, OSXSAVE);
150 fails += CHECK_FEATURE_PRESENT (pconfig, PCONFIG);
151 fails += CHECK_FEATURE_ACTIVE (pku, PKU);
152#endif
153 fails += CHECK_FEATURE_ACTIVE (popcnt, POPCNT);
154#if __GNUC_PREREQ (11, 0)
155# if !__GNUC_PREREQ (15, 0)
156 fails += CHECK_FEATURE_ACTIVE (prefetchwt1, PREFETCHWT1);
157# endif
158 fails += CHECK_FEATURE_ACTIVE (ptwrite, PTWRITE);
159 fails += CHECK_FEATURE_ACTIVE (rdpid, RDPID);
160 fails += CHECK_FEATURE_ACTIVE (rdrnd, RDRAND);
161 fails += CHECK_FEATURE_ACTIVE (rdseed, RDSEED);
162 fails += CHECK_FEATURE_PRESENT (rtm, RTM);
163 fails += CHECK_FEATURE_ACTIVE (serialize, SERIALIZE);
164 fails += CHECK_FEATURE_ACTIVE (sha, SHA);
165 fails += CHECK_FEATURE_PRESENT (shstk, SHSTK);
166#endif
167 fails += CHECK_FEATURE_ACTIVE (sse, SSE);
168 fails += CHECK_FEATURE_ACTIVE (sse2, SSE2);
169 fails += CHECK_FEATURE_ACTIVE (sse3, SSE3);
170 fails += CHECK_FEATURE_ACTIVE (sse4.1, SSE4_1);
171 fails += CHECK_FEATURE_ACTIVE (sse4.2, SSE4_2);
172#if __GNUC_PREREQ (4, 9)
173 fails += CHECK_FEATURE_ACTIVE (sse4a, SSE4A);
174#endif
175 fails += CHECK_FEATURE_ACTIVE (ssse3, SSSE3);
176#if __GNUC_PREREQ (11, 0)
177 fails += CHECK_FEATURE_ACTIVE (tbm, TBM);
178 fails += CHECK_FEATURE_ACTIVE (tsxldtrk, TSXLDTRK);
179 fails += CHECK_FEATURE_ACTIVE (vaes, VAES);
180#endif
181#if __GNUC_PREREQ (8, 0)
182 fails += CHECK_FEATURE_ACTIVE (vpclmulqdq, VPCLMULQDQ);
183#endif
184#if __GNUC_PREREQ (11, 0)
185 fails += CHECK_FEATURE_ACTIVE (waitpkg, WAITPKG);
186 fails += CHECK_FEATURE_ACTIVE (wbnoinvd, WBNOINVD);
187#endif
188#if __GNUC_PREREQ (4, 9)
189 fails += CHECK_FEATURE_ACTIVE (xop, XOP);
190#endif
191#if __GNUC_PREREQ (11, 0)
192 fails += CHECK_FEATURE_ACTIVE (xsave, XSAVE);
193 fails += CHECK_FEATURE_ACTIVE (xsavec, XSAVEC);
194 fails += CHECK_FEATURE_ACTIVE (xsaveopt, XSAVEOPT);
195 fails += CHECK_FEATURE_PRESENT (xsaves, XSAVES);
196#endif
197
198 printf (format: "%d differences between __builtin_cpu_supports and glibc code.\n",
199 fails);
200
201 return (fails != 0);
202}
203
204#include "../../../test-skeleton.c"
205

source code of glibc/sysdeps/x86/tst-cpu-features-supports.c