xref: /illumos-gate/usr/src/test/libc-tests/tests/stdbit.c (revision aaceae985c2e78cadef76bf0b7b50ed887ccb3a6)
1*aaceae98SRobert Mustacchi /*
2*aaceae98SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*aaceae98SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*aaceae98SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*aaceae98SRobert Mustacchi  * 1.0 of the CDDL.
6*aaceae98SRobert Mustacchi  *
7*aaceae98SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*aaceae98SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*aaceae98SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*aaceae98SRobert Mustacchi  */
11*aaceae98SRobert Mustacchi 
12*aaceae98SRobert Mustacchi /*
13*aaceae98SRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14*aaceae98SRobert Mustacchi  */
15*aaceae98SRobert Mustacchi 
16*aaceae98SRobert Mustacchi /*
17*aaceae98SRobert Mustacchi  * Test various aspects of the libc stdbit(3C) interfaces. This does not test
18*aaceae98SRobert Mustacchi  * the generic interfaces so that way this can be built and run by compilers
19*aaceae98SRobert Mustacchi  * that don't support C23 and we also want to explicitly test the various type
20*aaceae98SRobert Mustacchi  * specific values.
21*aaceae98SRobert Mustacchi  *
22*aaceae98SRobert Mustacchi  * This test is built 32-bit and 64-bit. The width of a long varies between an
23*aaceae98SRobert Mustacchi  * ILP32 and LP64 environment and therefore will end up getting back different
24*aaceae98SRobert Mustacchi  * values. Hence the ifdefs.
25*aaceae98SRobert Mustacchi  */
26*aaceae98SRobert Mustacchi 
27*aaceae98SRobert Mustacchi #include <stdbit.h>
28*aaceae98SRobert Mustacchi #include <stdlib.h>
29*aaceae98SRobert Mustacchi #include <stdio.h>
30*aaceae98SRobert Mustacchi #include <err.h>
31*aaceae98SRobert Mustacchi #include <sys/debug.h>
32*aaceae98SRobert Mustacchi #include <sys/sysmacros.h>
33*aaceae98SRobert Mustacchi 
34*aaceae98SRobert Mustacchi typedef enum {
35*aaceae98SRobert Mustacchi 	STDBIT_TEST_U8	 = 1 << 0,
36*aaceae98SRobert Mustacchi 	STDBIT_TEST_U16	 = 1 << 1,
37*aaceae98SRobert Mustacchi 	STDBIT_TEST_U32	 = 1 << 2,
38*aaceae98SRobert Mustacchi 	STDBIT_TEST_U64	 = 1 << 3
39*aaceae98SRobert Mustacchi } stdbit_test_type_t;
40*aaceae98SRobert Mustacchi 
41*aaceae98SRobert Mustacchi #define	STDBIT_TEST_64P	(STDBIT_TEST_U64)
42*aaceae98SRobert Mustacchi #define	STDBIT_TEST_32P	(STDBIT_TEST_U32  | STDBIT_TEST_64P)
43*aaceae98SRobert Mustacchi #define	STDBIT_TEST_16P	(STDBIT_TEST_U16 | STDBIT_TEST_32P)
44*aaceae98SRobert Mustacchi #define	STDBIT_TEST_ALL	(STDBIT_TEST_U8 | STDBIT_TEST_16P)
45*aaceae98SRobert Mustacchi 
46*aaceae98SRobert Mustacchi typedef struct {
47*aaceae98SRobert Mustacchi 	const char *so_name;
48*aaceae98SRobert Mustacchi 	unsigned int (*so_uc)(unsigned char);
49*aaceae98SRobert Mustacchi 	unsigned int (*so_us)(unsigned short);
50*aaceae98SRobert Mustacchi 	unsigned int (*so_ui)(unsigned int);
51*aaceae98SRobert Mustacchi 	unsigned int (*so_ul)(unsigned long);
52*aaceae98SRobert Mustacchi 	unsigned int (*so_ull)(unsigned long long);
53*aaceae98SRobert Mustacchi 	int32_t so_delta[3];
54*aaceae98SRobert Mustacchi } stdbit_ops_t;
55*aaceae98SRobert Mustacchi 
56*aaceae98SRobert Mustacchi typedef struct {
57*aaceae98SRobert Mustacchi 	stdbit_test_type_t st_types;
58*aaceae98SRobert Mustacchi 	uint64_t st_val;
59*aaceae98SRobert Mustacchi 	uint64_t st_res;
60*aaceae98SRobert Mustacchi } stdbit_test_t;
61*aaceae98SRobert Mustacchi 
62*aaceae98SRobert Mustacchi /*
63*aaceae98SRobert Mustacchi  * Count Leading Zeros tests. As the integer increases in size, there are a
64*aaceae98SRobert Mustacchi  * bunch of leading zeros added, hence the delta values in this entry.
65*aaceae98SRobert Mustacchi  */
66*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_clz_ops = {
67*aaceae98SRobert Mustacchi 	.so_name = "Count Leading Zeros",
68*aaceae98SRobert Mustacchi 	.so_uc = stdc_leading_zeros_uc,
69*aaceae98SRobert Mustacchi 	.so_us = stdc_leading_zeros_us,
70*aaceae98SRobert Mustacchi 	.so_ui = stdc_leading_zeros_ui,
71*aaceae98SRobert Mustacchi 	.so_ul = stdc_leading_zeros_ul,
72*aaceae98SRobert Mustacchi 	.so_ull = stdc_leading_zeros_ull,
73*aaceae98SRobert Mustacchi 	.so_delta = { 8, 16, 32 }
74*aaceae98SRobert Mustacchi };
75*aaceae98SRobert Mustacchi 
76*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_clz_tests[] = { {
77*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
78*aaceae98SRobert Mustacchi 	.st_val = 0,
79*aaceae98SRobert Mustacchi 	.st_res = 8
80*aaceae98SRobert Mustacchi }, {
81*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
82*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
83*aaceae98SRobert Mustacchi 	.st_res = 0
84*aaceae98SRobert Mustacchi }, {
85*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
86*aaceae98SRobert Mustacchi 	.st_val = 0x42,
87*aaceae98SRobert Mustacchi 	.st_res = 1
88*aaceae98SRobert Mustacchi }, {
89*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
90*aaceae98SRobert Mustacchi 	.st_val = 1,
91*aaceae98SRobert Mustacchi 	.st_res = 7
92*aaceae98SRobert Mustacchi }, {
93*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
94*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
95*aaceae98SRobert Mustacchi 	.st_res = 0
96*aaceae98SRobert Mustacchi }, {
97*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
98*aaceae98SRobert Mustacchi 	.st_val = 0x7777,
99*aaceae98SRobert Mustacchi 	.st_res = 1
100*aaceae98SRobert Mustacchi }, {
101*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
102*aaceae98SRobert Mustacchi 	.st_val = 0x800,
103*aaceae98SRobert Mustacchi 	.st_res = 4
104*aaceae98SRobert Mustacchi }, {
105*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
106*aaceae98SRobert Mustacchi 	.st_val = 0x080,
107*aaceae98SRobert Mustacchi 	.st_res = 8
108*aaceae98SRobert Mustacchi }, {
109*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
110*aaceae98SRobert Mustacchi 	.st_val = 0x008,
111*aaceae98SRobert Mustacchi 	.st_res = 12
112*aaceae98SRobert Mustacchi }, {
113*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
114*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
115*aaceae98SRobert Mustacchi 	.st_res = 0
116*aaceae98SRobert Mustacchi }, {
117*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
118*aaceae98SRobert Mustacchi 	.st_val = 0x23000000,
119*aaceae98SRobert Mustacchi 	.st_res = 2
120*aaceae98SRobert Mustacchi }, {
121*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
122*aaceae98SRobert Mustacchi 	.st_val = 0x23000032,
123*aaceae98SRobert Mustacchi 	.st_res = 2
124*aaceae98SRobert Mustacchi }, {
125*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
126*aaceae98SRobert Mustacchi 	.st_val = 0x400000000,
127*aaceae98SRobert Mustacchi 	.st_res = 29
128*aaceae98SRobert Mustacchi }, {
129*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
130*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
131*aaceae98SRobert Mustacchi 	.st_res = 0
132*aaceae98SRobert Mustacchi } };
133*aaceae98SRobert Mustacchi 
134*aaceae98SRobert Mustacchi /*
135*aaceae98SRobert Mustacchi  * Unlike count leading zeros, when we take a value and hand it to a larger
136*aaceae98SRobert Mustacchi  * function, it will always go to a value of zero. As a result, we don't test
137*aaceae98SRobert Mustacchi  * many of this suite across everything.
138*aaceae98SRobert Mustacchi  */
139*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_clo_ops = {
140*aaceae98SRobert Mustacchi 	.so_name = "Count Leading Ones",
141*aaceae98SRobert Mustacchi 	.so_uc = stdc_leading_ones_uc,
142*aaceae98SRobert Mustacchi 	.so_us = stdc_leading_ones_us,
143*aaceae98SRobert Mustacchi 	.so_ui = stdc_leading_ones_ui,
144*aaceae98SRobert Mustacchi 	.so_ul = stdc_leading_ones_ul,
145*aaceae98SRobert Mustacchi 	.so_ull = stdc_leading_ones_ull,
146*aaceae98SRobert Mustacchi };
147*aaceae98SRobert Mustacchi 
148*aaceae98SRobert Mustacchi 
149*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_clo_tests[] = { {
150*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
151*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
152*aaceae98SRobert Mustacchi 	.st_res = 8
153*aaceae98SRobert Mustacchi }, {
154*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
155*aaceae98SRobert Mustacchi 	.st_val = 0,
156*aaceae98SRobert Mustacchi 	.st_res = 0
157*aaceae98SRobert Mustacchi }, {
158*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
159*aaceae98SRobert Mustacchi 	.st_val = 0x42,
160*aaceae98SRobert Mustacchi 	.st_res = 0
161*aaceae98SRobert Mustacchi }, {
162*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
163*aaceae98SRobert Mustacchi 	.st_val = 0xe0,
164*aaceae98SRobert Mustacchi 	.st_res = 3
165*aaceae98SRobert Mustacchi }, {
166*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
167*aaceae98SRobert Mustacchi 	.st_val = 0xfc,
168*aaceae98SRobert Mustacchi 	.st_res = 6
169*aaceae98SRobert Mustacchi }, {
170*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
171*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
172*aaceae98SRobert Mustacchi 	.st_res = 0
173*aaceae98SRobert Mustacchi }, {
174*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
175*aaceae98SRobert Mustacchi 	.st_val = 0x142,
176*aaceae98SRobert Mustacchi 	.st_res = 0
177*aaceae98SRobert Mustacchi }, {
178*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
179*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
180*aaceae98SRobert Mustacchi 	.st_res = 16
181*aaceae98SRobert Mustacchi }, {
182*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
183*aaceae98SRobert Mustacchi 	.st_val = 0xc0ff,
184*aaceae98SRobert Mustacchi 	.st_res = 2
185*aaceae98SRobert Mustacchi }, {
186*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
187*aaceae98SRobert Mustacchi 	.st_val = 0xf88f,
188*aaceae98SRobert Mustacchi 	.st_res = 5
189*aaceae98SRobert Mustacchi }, {
190*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
191*aaceae98SRobert Mustacchi 	.st_val = 0x12345678,
192*aaceae98SRobert Mustacchi 	.st_res = 0
193*aaceae98SRobert Mustacchi }, {
194*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
195*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
196*aaceae98SRobert Mustacchi 	.st_res = 32
197*aaceae98SRobert Mustacchi }, {
198*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
199*aaceae98SRobert Mustacchi 	.st_val = 0x87654321,
200*aaceae98SRobert Mustacchi 	.st_res = 1
201*aaceae98SRobert Mustacchi }, {
202*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
203*aaceae98SRobert Mustacchi 	.st_val = 0xff7ff7ff,
204*aaceae98SRobert Mustacchi 	.st_res = 8
205*aaceae98SRobert Mustacchi }, {
206*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
207*aaceae98SRobert Mustacchi 	.st_val = 0xfffffeee,
208*aaceae98SRobert Mustacchi 	.st_res = 23
209*aaceae98SRobert Mustacchi }, {
210*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
211*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
212*aaceae98SRobert Mustacchi 	.st_res = 64
213*aaceae98SRobert Mustacchi }, {
214*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
215*aaceae98SRobert Mustacchi 	.st_val = 0x8000000000000000,
216*aaceae98SRobert Mustacchi 	.st_res = 1
217*aaceae98SRobert Mustacchi }, {
218*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
219*aaceae98SRobert Mustacchi 	.st_val = 0xffffffff80000000,
220*aaceae98SRobert Mustacchi 	.st_res = 33
221*aaceae98SRobert Mustacchi }, {
222*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
223*aaceae98SRobert Mustacchi 	.st_val = 0xffffffffffff9999,
224*aaceae98SRobert Mustacchi 	.st_res = 49
225*aaceae98SRobert Mustacchi } };
226*aaceae98SRobert Mustacchi 
227*aaceae98SRobert Mustacchi /*
228*aaceae98SRobert Mustacchi  * The results for zero is the only special case that occurs with this
229*aaceae98SRobert Mustacchi  * particular case.
230*aaceae98SRobert Mustacchi  */
231*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_ctz_ops = {
232*aaceae98SRobert Mustacchi 	.so_name = "Count Trailing Zeros",
233*aaceae98SRobert Mustacchi 	.so_uc = stdc_trailing_zeros_uc,
234*aaceae98SRobert Mustacchi 	.so_us = stdc_trailing_zeros_us,
235*aaceae98SRobert Mustacchi 	.so_ui = stdc_trailing_zeros_ui,
236*aaceae98SRobert Mustacchi 	.so_ul = stdc_trailing_zeros_ul,
237*aaceae98SRobert Mustacchi 	.so_ull = stdc_trailing_zeros_ull,
238*aaceae98SRobert Mustacchi };
239*aaceae98SRobert Mustacchi 
240*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_ctz_tests[] = { {
241*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
242*aaceae98SRobert Mustacchi 	.st_val = 0,
243*aaceae98SRobert Mustacchi 	.st_res = 8
244*aaceae98SRobert Mustacchi }, {
245*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
246*aaceae98SRobert Mustacchi 	.st_val = 0,
247*aaceae98SRobert Mustacchi 	.st_res = 16
248*aaceae98SRobert Mustacchi }, {
249*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
250*aaceae98SRobert Mustacchi 	.st_val = 0,
251*aaceae98SRobert Mustacchi 	.st_res = 32
252*aaceae98SRobert Mustacchi }, {
253*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
254*aaceae98SRobert Mustacchi 	.st_val = 0,
255*aaceae98SRobert Mustacchi 	.st_res = 64
256*aaceae98SRobert Mustacchi }, {
257*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
258*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
259*aaceae98SRobert Mustacchi 	.st_res = 0
260*aaceae98SRobert Mustacchi }, {
261*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
262*aaceae98SRobert Mustacchi 	.st_val = 0x1,
263*aaceae98SRobert Mustacchi 	.st_res = 0
264*aaceae98SRobert Mustacchi }, {
265*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
266*aaceae98SRobert Mustacchi 	.st_val = 0x4,
267*aaceae98SRobert Mustacchi 	.st_res = 2
268*aaceae98SRobert Mustacchi }, {
269*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
270*aaceae98SRobert Mustacchi 	.st_val = 0x80,
271*aaceae98SRobert Mustacchi 	.st_res = 7
272*aaceae98SRobert Mustacchi }, {
273*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
274*aaceae98SRobert Mustacchi 	.st_val = 0xff60,
275*aaceae98SRobert Mustacchi 	.st_res = 5
276*aaceae98SRobert Mustacchi }, {
277*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
278*aaceae98SRobert Mustacchi 	.st_val = 0x8ad0,
279*aaceae98SRobert Mustacchi 	.st_res = 4
280*aaceae98SRobert Mustacchi }, {
281*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
282*aaceae98SRobert Mustacchi 	.st_val = 0x2300,
283*aaceae98SRobert Mustacchi 	.st_res = 8
284*aaceae98SRobert Mustacchi }, {
285*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
286*aaceae98SRobert Mustacchi 	.st_val = 0x42000000,
287*aaceae98SRobert Mustacchi 	.st_res = 25
288*aaceae98SRobert Mustacchi }, {
289*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
290*aaceae98SRobert Mustacchi 	.st_val = 0x99887700,
291*aaceae98SRobert Mustacchi 	.st_res = 8
292*aaceae98SRobert Mustacchi }, {
293*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
294*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
295*aaceae98SRobert Mustacchi 	.st_res = 0
296*aaceae98SRobert Mustacchi }, {
297*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
298*aaceae98SRobert Mustacchi 	.st_val = 0xaa00000000000000,
299*aaceae98SRobert Mustacchi 	.st_res = 57
300*aaceae98SRobert Mustacchi }, {
301*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
302*aaceae98SRobert Mustacchi 	.st_val = 0xbadcaf0000000000,
303*aaceae98SRobert Mustacchi 	.st_res = 40
304*aaceae98SRobert Mustacchi }, {
305*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
306*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
307*aaceae98SRobert Mustacchi 	.st_res = 0
308*aaceae98SRobert Mustacchi } };
309*aaceae98SRobert Mustacchi 
310*aaceae98SRobert Mustacchi /*
311*aaceae98SRobert Mustacchi  * Count Trailing Ones Tests
312*aaceae98SRobert Mustacchi  */
313*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_cto_ops = {
314*aaceae98SRobert Mustacchi 	.so_name = "Count Trailing Ones",
315*aaceae98SRobert Mustacchi 	.so_uc = stdc_trailing_ones_uc,
316*aaceae98SRobert Mustacchi 	.so_us = stdc_trailing_ones_us,
317*aaceae98SRobert Mustacchi 	.so_ui = stdc_trailing_ones_ui,
318*aaceae98SRobert Mustacchi 	.so_ul = stdc_trailing_ones_ul,
319*aaceae98SRobert Mustacchi 	.so_ull = stdc_trailing_ones_ull,
320*aaceae98SRobert Mustacchi };
321*aaceae98SRobert Mustacchi 
322*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_cto_tests[] = { {
323*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
324*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
325*aaceae98SRobert Mustacchi 	.st_res = 8
326*aaceae98SRobert Mustacchi }, {
327*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
328*aaceae98SRobert Mustacchi 	.st_val = 0,
329*aaceae98SRobert Mustacchi 	.st_res = 0
330*aaceae98SRobert Mustacchi }, {
331*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
332*aaceae98SRobert Mustacchi 	.st_val = 3,
333*aaceae98SRobert Mustacchi 	.st_res = 2
334*aaceae98SRobert Mustacchi }, {
335*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
336*aaceae98SRobert Mustacchi 	.st_val = 0x7e,
337*aaceae98SRobert Mustacchi 	.st_res = 0
338*aaceae98SRobert Mustacchi }, {
339*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
340*aaceae98SRobert Mustacchi 	.st_val = 0x7f,
341*aaceae98SRobert Mustacchi 	.st_res = 7
342*aaceae98SRobert Mustacchi }, {
343*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
344*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
345*aaceae98SRobert Mustacchi 	.st_res = 16
346*aaceae98SRobert Mustacchi }, {
347*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
348*aaceae98SRobert Mustacchi 	.st_val = 0x8765,
349*aaceae98SRobert Mustacchi 	.st_res = 1
350*aaceae98SRobert Mustacchi }, {
351*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
352*aaceae98SRobert Mustacchi 	.st_val = 0xcdef,
353*aaceae98SRobert Mustacchi 	.st_res = 4
354*aaceae98SRobert Mustacchi }, {
355*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
356*aaceae98SRobert Mustacchi 	.st_val = 0x9fff,
357*aaceae98SRobert Mustacchi 	.st_res = 13
358*aaceae98SRobert Mustacchi }, {
359*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
360*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
361*aaceae98SRobert Mustacchi 	.st_res = 32
362*aaceae98SRobert Mustacchi }, {
363*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
364*aaceae98SRobert Mustacchi 	.st_val = 0x85ab91ff,
365*aaceae98SRobert Mustacchi 	.st_res = 9
366*aaceae98SRobert Mustacchi }, {
367*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
368*aaceae98SRobert Mustacchi 	.st_val = 0x7fffffff,
369*aaceae98SRobert Mustacchi 	.st_res = 31
370*aaceae98SRobert Mustacchi }, {
371*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
372*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
373*aaceae98SRobert Mustacchi 	.st_res = 64
374*aaceae98SRobert Mustacchi }, {
375*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
376*aaceae98SRobert Mustacchi 	.st_val = 0x1bffffffffffffff,
377*aaceae98SRobert Mustacchi 	.st_res = 58
378*aaceae98SRobert Mustacchi }, {
379*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
380*aaceae98SRobert Mustacchi 	.st_val = 0x9abe83cff6ff7ff8,
381*aaceae98SRobert Mustacchi 	.st_res = 0
382*aaceae98SRobert Mustacchi } };
383*aaceae98SRobert Mustacchi 
384*aaceae98SRobert Mustacchi /*
385*aaceae98SRobert Mustacchi  * See the manual. The C23 definition for "most-significant" bit is
386*aaceae98SRobert Mustacchi  * counter-intuitive. Basically bit 0 is considered the most significant bit. So
387*aaceae98SRobert Mustacchi  * for a uint8_t bit 0 is considered index 7 and bit 7 is index 0. The results
388*aaceae98SRobert Mustacchi  * always have 1 added to them.
389*aaceae98SRobert Mustacchi  */
390*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_flz_ops = {
391*aaceae98SRobert Mustacchi 	.so_name = "First Leading Zero",
392*aaceae98SRobert Mustacchi 	.so_uc = stdc_first_leading_zero_uc,
393*aaceae98SRobert Mustacchi 	.so_us = stdc_first_leading_zero_us,
394*aaceae98SRobert Mustacchi 	.so_ui = stdc_first_leading_zero_ui,
395*aaceae98SRobert Mustacchi 	.so_ul = stdc_first_leading_zero_ul,
396*aaceae98SRobert Mustacchi 	.so_ull = stdc_first_leading_zero_ull,
397*aaceae98SRobert Mustacchi };
398*aaceae98SRobert Mustacchi 
399*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_flz_tests[] = { {
400*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
401*aaceae98SRobert Mustacchi 	.st_val = 0,
402*aaceae98SRobert Mustacchi 	.st_res = 1
403*aaceae98SRobert Mustacchi }, {
404*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
405*aaceae98SRobert Mustacchi 	.st_val = 0x3,
406*aaceae98SRobert Mustacchi 	.st_res = 1
407*aaceae98SRobert Mustacchi }, {
408*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
409*aaceae98SRobert Mustacchi 	.st_val = 0xf0,
410*aaceae98SRobert Mustacchi 	.st_res = 5
411*aaceae98SRobert Mustacchi }, {
412*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
413*aaceae98SRobert Mustacchi 	.st_val = 0xef,
414*aaceae98SRobert Mustacchi 	.st_res = 4
415*aaceae98SRobert Mustacchi }, {
416*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
417*aaceae98SRobert Mustacchi 	.st_val = 0xc4,
418*aaceae98SRobert Mustacchi 	.st_res = 3
419*aaceae98SRobert Mustacchi }, {
420*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
421*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
422*aaceae98SRobert Mustacchi 	.st_res = 0
423*aaceae98SRobert Mustacchi }, {
424*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
425*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
426*aaceae98SRobert Mustacchi 	.st_res = 1
427*aaceae98SRobert Mustacchi }, {
428*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
429*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
430*aaceae98SRobert Mustacchi 	.st_res = 0
431*aaceae98SRobert Mustacchi }, {
432*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
433*aaceae98SRobert Mustacchi 	.st_val = 0xfabc,
434*aaceae98SRobert Mustacchi 	.st_res = 6
435*aaceae98SRobert Mustacchi }, {
436*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
437*aaceae98SRobert Mustacchi 	.st_val = 0xcbaf,
438*aaceae98SRobert Mustacchi 	.st_res = 3
439*aaceae98SRobert Mustacchi }, {
440*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
441*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
442*aaceae98SRobert Mustacchi 	.st_res = 1
443*aaceae98SRobert Mustacchi }, {
444*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
445*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
446*aaceae98SRobert Mustacchi 	.st_res = 0
447*aaceae98SRobert Mustacchi }, {
448*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
449*aaceae98SRobert Mustacchi 	.st_val = 0xff7ff623,
450*aaceae98SRobert Mustacchi 	.st_res = 9
451*aaceae98SRobert Mustacchi }, {
452*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
453*aaceae98SRobert Mustacchi 	.st_val = 0xfffff623,
454*aaceae98SRobert Mustacchi 	.st_res = 21
455*aaceae98SRobert Mustacchi }, {
456*aaceae98SRobert Mustacchi .	st_types = STDBIT_TEST_U32,
457*aaceae98SRobert Mustacchi 	.st_val = 0xffffff95,
458*aaceae98SRobert Mustacchi 	.st_res = 26
459*aaceae98SRobert Mustacchi }, {
460*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
461*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
462*aaceae98SRobert Mustacchi 	.st_res = 1
463*aaceae98SRobert Mustacchi }, {
464*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
465*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
466*aaceae98SRobert Mustacchi 	.st_res = 0
467*aaceae98SRobert Mustacchi }, {
468*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
469*aaceae98SRobert Mustacchi 	.st_val = 0xfffffffffffffffe,
470*aaceae98SRobert Mustacchi 	.st_res = 64
471*aaceae98SRobert Mustacchi }, {
472*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
473*aaceae98SRobert Mustacchi 	.st_val = 0xffff2b9542fffffe,
474*aaceae98SRobert Mustacchi 	.st_res = 17
475*aaceae98SRobert Mustacchi } };
476*aaceae98SRobert Mustacchi 
477*aaceae98SRobert Mustacchi /*
478*aaceae98SRobert Mustacchi  * See the note on the flz tests for the oddities with calculating this. Due to
479*aaceae98SRobert Mustacchi  * the nature of how these are counted, the larger the number gets, the more the
480*aaceae98SRobert Mustacchi  * first 1 increases in its "most-significant" value. However, we have to
481*aaceae98SRobert Mustacchi  * special case 0 in our logic because it will stay consistent across all the
482*aaceae98SRobert Mustacchi  * values.
483*aaceae98SRobert Mustacchi  */
484*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_flo_ops = {
485*aaceae98SRobert Mustacchi 	.so_name = "First Leading One",
486*aaceae98SRobert Mustacchi 	.so_uc = stdc_first_leading_one_uc,
487*aaceae98SRobert Mustacchi 	.so_us = stdc_first_leading_one_us,
488*aaceae98SRobert Mustacchi 	.so_ui = stdc_first_leading_one_ui,
489*aaceae98SRobert Mustacchi 	.so_ul = stdc_first_leading_one_ul,
490*aaceae98SRobert Mustacchi 	.so_ull = stdc_first_leading_one_ull,
491*aaceae98SRobert Mustacchi 	.so_delta = { 8, 16, 32 }
492*aaceae98SRobert Mustacchi };
493*aaceae98SRobert Mustacchi 
494*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_flo_tests[] = { {
495*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
496*aaceae98SRobert Mustacchi 	.st_val = 0,
497*aaceae98SRobert Mustacchi 	.st_res = 0
498*aaceae98SRobert Mustacchi }, {
499*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
500*aaceae98SRobert Mustacchi 	.st_val = 0,
501*aaceae98SRobert Mustacchi 	.st_res = 0
502*aaceae98SRobert Mustacchi }, {
503*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
504*aaceae98SRobert Mustacchi 	.st_val = 0,
505*aaceae98SRobert Mustacchi 	.st_res = 0
506*aaceae98SRobert Mustacchi }, {
507*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
508*aaceae98SRobert Mustacchi 	.st_val = 0,
509*aaceae98SRobert Mustacchi 	.st_res = 0
510*aaceae98SRobert Mustacchi }, {
511*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
512*aaceae98SRobert Mustacchi 	.st_val = 0x1,
513*aaceae98SRobert Mustacchi 	.st_res = 8
514*aaceae98SRobert Mustacchi }, {
515*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
516*aaceae98SRobert Mustacchi 	.st_val = 0xf,
517*aaceae98SRobert Mustacchi 	.st_res = 5
518*aaceae98SRobert Mustacchi }, {
519*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
520*aaceae98SRobert Mustacchi 	.st_val = 0xfe,
521*aaceae98SRobert Mustacchi 	.st_res = 1
522*aaceae98SRobert Mustacchi }, {
523*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
524*aaceae98SRobert Mustacchi 	.st_val = 0x7f,
525*aaceae98SRobert Mustacchi 	.st_res = 2
526*aaceae98SRobert Mustacchi }, {
527*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
528*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
529*aaceae98SRobert Mustacchi 	.st_res = 1
530*aaceae98SRobert Mustacchi }, {
531*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
532*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
533*aaceae98SRobert Mustacchi 	.st_res = 1
534*aaceae98SRobert Mustacchi }, {
535*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
536*aaceae98SRobert Mustacchi 	.st_val = 0xfeed,
537*aaceae98SRobert Mustacchi 	.st_res = 1
538*aaceae98SRobert Mustacchi }, {
539*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
540*aaceae98SRobert Mustacchi 	.st_val = 0x1aff,
541*aaceae98SRobert Mustacchi 	.st_res = 4
542*aaceae98SRobert Mustacchi }, {
543*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
544*aaceae98SRobert Mustacchi 	.st_val = 0x02b0,
545*aaceae98SRobert Mustacchi 	.st_res = 7
546*aaceae98SRobert Mustacchi }, {
547*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
548*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
549*aaceae98SRobert Mustacchi 	.st_res = 1
550*aaceae98SRobert Mustacchi }, {
551*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
552*aaceae98SRobert Mustacchi 	.st_val = 0x00001234,
553*aaceae98SRobert Mustacchi 	.st_res = 20
554*aaceae98SRobert Mustacchi }, {
555*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
556*aaceae98SRobert Mustacchi 	.st_val = 0x2bb22bb2,
557*aaceae98SRobert Mustacchi 	.st_res = 3
558*aaceae98SRobert Mustacchi }, {
559*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
560*aaceae98SRobert Mustacchi 	.st_val = 0x00420000,
561*aaceae98SRobert Mustacchi 	.st_res = 10
562*aaceae98SRobert Mustacchi }, {
563*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
564*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
565*aaceae98SRobert Mustacchi 	.st_res = 1
566*aaceae98SRobert Mustacchi }, {
567*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
568*aaceae98SRobert Mustacchi 	.st_val = 0x000000000c000000,
569*aaceae98SRobert Mustacchi 	.st_res = 37
570*aaceae98SRobert Mustacchi }, {
571*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
572*aaceae98SRobert Mustacchi 	.st_val = 0x000fedcba9abcdef,
573*aaceae98SRobert Mustacchi 	.st_res = 13
574*aaceae98SRobert Mustacchi }, {
575*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
576*aaceae98SRobert Mustacchi 	.st_val = 0x000001992aa3bb4c,
577*aaceae98SRobert Mustacchi 	.st_res = 24
578*aaceae98SRobert Mustacchi }, {
579*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
580*aaceae98SRobert Mustacchi 	.st_val = 0x0706050403020100,
581*aaceae98SRobert Mustacchi 	.st_res = 6
582*aaceae98SRobert Mustacchi } };
583*aaceae98SRobert Mustacchi 
584*aaceae98SRobert Mustacchi /*
585*aaceae98SRobert Mustacchi  * First Trailing Zero. This numbers indexes in the way that someone expects
586*aaceae98SRobert Mustacchi  * where the bit 0 is least significant index zero, which returns a value of 1.
587*aaceae98SRobert Mustacchi  * When there are no zeros this returns 0. There is no reliable increment
588*aaceae98SRobert Mustacchi  * pattern here.
589*aaceae98SRobert Mustacchi  */
590*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_ftz_ops = {
591*aaceae98SRobert Mustacchi 	.so_name = "First Trailing Zero",
592*aaceae98SRobert Mustacchi 	.so_uc = stdc_first_trailing_zero_uc,
593*aaceae98SRobert Mustacchi 	.so_us = stdc_first_trailing_zero_us,
594*aaceae98SRobert Mustacchi 	.so_ui = stdc_first_trailing_zero_ui,
595*aaceae98SRobert Mustacchi 	.so_ul = stdc_first_trailing_zero_ul,
596*aaceae98SRobert Mustacchi 	.so_ull = stdc_first_trailing_zero_ull,
597*aaceae98SRobert Mustacchi };
598*aaceae98SRobert Mustacchi 
599*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_ftz_tests[] = { {
600*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
601*aaceae98SRobert Mustacchi 	.st_val = 0,
602*aaceae98SRobert Mustacchi 	.st_res = 1
603*aaceae98SRobert Mustacchi }, {
604*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
605*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
606*aaceae98SRobert Mustacchi 	.st_res = 0
607*aaceae98SRobert Mustacchi }, {
608*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
609*aaceae98SRobert Mustacchi 	.st_val = 0xfe,
610*aaceae98SRobert Mustacchi 	.st_res = 1
611*aaceae98SRobert Mustacchi }, {
612*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
613*aaceae98SRobert Mustacchi 	.st_val = 0xef,
614*aaceae98SRobert Mustacchi 	.st_res = 5
615*aaceae98SRobert Mustacchi }, {
616*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U8,
617*aaceae98SRobert Mustacchi 	.st_val = 0x7f,
618*aaceae98SRobert Mustacchi 	.st_res = 8
619*aaceae98SRobert Mustacchi }, {
620*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
621*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
622*aaceae98SRobert Mustacchi 	.st_res = 9
623*aaceae98SRobert Mustacchi }, {
624*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
625*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
626*aaceae98SRobert Mustacchi 	.st_res = 0
627*aaceae98SRobert Mustacchi }, {
628*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
629*aaceae98SRobert Mustacchi 	.st_val = 0xfffe,
630*aaceae98SRobert Mustacchi 	.st_res = 1
631*aaceae98SRobert Mustacchi }, {
632*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
633*aaceae98SRobert Mustacchi 	.st_val = 0xefff,
634*aaceae98SRobert Mustacchi 	.st_res = 13
635*aaceae98SRobert Mustacchi }, {
636*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U16,
637*aaceae98SRobert Mustacchi 	.st_val = 0x07ff,
638*aaceae98SRobert Mustacchi 	.st_res = 12
639*aaceae98SRobert Mustacchi }, {
640*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
641*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
642*aaceae98SRobert Mustacchi 	.st_res = 17
643*aaceae98SRobert Mustacchi }, {
644*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
645*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
646*aaceae98SRobert Mustacchi 	.st_res = 0
647*aaceae98SRobert Mustacchi }, {
648*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
649*aaceae98SRobert Mustacchi 	.st_val = 0xcaffffff,
650*aaceae98SRobert Mustacchi 	.st_res = 25
651*aaceae98SRobert Mustacchi }, {
652*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U32,
653*aaceae98SRobert Mustacchi 	.st_val = 0xcabfffff,
654*aaceae98SRobert Mustacchi 	.st_res = 23
655*aaceae98SRobert Mustacchi }, {
656*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
657*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
658*aaceae98SRobert Mustacchi 	.st_res = 33
659*aaceae98SRobert Mustacchi }, {
660*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
661*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
662*aaceae98SRobert Mustacchi 	.st_res = 0
663*aaceae98SRobert Mustacchi }, {
664*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
665*aaceae98SRobert Mustacchi 	.st_val = 0xface2bface95a2ff,
666*aaceae98SRobert Mustacchi 	.st_res = 9
667*aaceae98SRobert Mustacchi }, {
668*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_U64,
669*aaceae98SRobert Mustacchi 	.st_val = 0x7777777777777777,
670*aaceae98SRobert Mustacchi 	.st_res = 4
671*aaceae98SRobert Mustacchi } };
672*aaceae98SRobert Mustacchi 
673*aaceae98SRobert Mustacchi /*
674*aaceae98SRobert Mustacchi  * First Trailing One. This numbers indexes in the way that someone expects
675*aaceae98SRobert Mustacchi  * where the bit 0 is least significant index zero, which returns a value of 1.
676*aaceae98SRobert Mustacchi  * When there are no zeros this returns 0. This is classical ffs().
677*aaceae98SRobert Mustacchi  */
678*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_fto_ops = {
679*aaceae98SRobert Mustacchi 	.so_name = "First Trailing One",
680*aaceae98SRobert Mustacchi 	.so_uc = stdc_first_trailing_one_uc,
681*aaceae98SRobert Mustacchi 	.so_us = stdc_first_trailing_one_us,
682*aaceae98SRobert Mustacchi 	.so_ui = stdc_first_trailing_one_ui,
683*aaceae98SRobert Mustacchi 	.so_ul = stdc_first_trailing_one_ul,
684*aaceae98SRobert Mustacchi 	.so_ull = stdc_first_trailing_one_ull,
685*aaceae98SRobert Mustacchi };
686*aaceae98SRobert Mustacchi 
687*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_fto_tests[] = { {
688*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
689*aaceae98SRobert Mustacchi 	.st_val = 0,
690*aaceae98SRobert Mustacchi 	.st_res = 0
691*aaceae98SRobert Mustacchi }, {
692*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
693*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
694*aaceae98SRobert Mustacchi 	.st_res = 1
695*aaceae98SRobert Mustacchi }, {
696*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
697*aaceae98SRobert Mustacchi 	.st_val = 0xf7,
698*aaceae98SRobert Mustacchi 	.st_res = 1
699*aaceae98SRobert Mustacchi }, {
700*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
701*aaceae98SRobert Mustacchi 	.st_val = 0xf8,
702*aaceae98SRobert Mustacchi 	.st_res = 4
703*aaceae98SRobert Mustacchi }, {
704*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
705*aaceae98SRobert Mustacchi 	.st_val = 0x6d,
706*aaceae98SRobert Mustacchi 	.st_res = 1
707*aaceae98SRobert Mustacchi }, {
708*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
709*aaceae98SRobert Mustacchi 	.st_val = 0xd6,
710*aaceae98SRobert Mustacchi 	.st_res = 2
711*aaceae98SRobert Mustacchi }, {
712*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
713*aaceae98SRobert Mustacchi 	.st_val = 0x40,
714*aaceae98SRobert Mustacchi 	.st_res = 7
715*aaceae98SRobert Mustacchi }, {
716*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
717*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
718*aaceae98SRobert Mustacchi 	.st_res = 1
719*aaceae98SRobert Mustacchi }, {
720*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
721*aaceae98SRobert Mustacchi 	.st_val = 0xf840,
722*aaceae98SRobert Mustacchi 	.st_res = 7
723*aaceae98SRobert Mustacchi }, {
724*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
725*aaceae98SRobert Mustacchi 	.st_val = 0x0a00,
726*aaceae98SRobert Mustacchi 	.st_res = 10
727*aaceae98SRobert Mustacchi }, {
728*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
729*aaceae98SRobert Mustacchi 	.st_val = 0x8000,
730*aaceae98SRobert Mustacchi 	.st_res = 16
731*aaceae98SRobert Mustacchi }, {
732*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
733*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
734*aaceae98SRobert Mustacchi 	.st_res = 1
735*aaceae98SRobert Mustacchi }, {
736*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
737*aaceae98SRobert Mustacchi 	.st_val = 0xb0000000,
738*aaceae98SRobert Mustacchi 	.st_res = 29
739*aaceae98SRobert Mustacchi }, {
740*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
741*aaceae98SRobert Mustacchi 	.st_val = 0xf9c00000,
742*aaceae98SRobert Mustacchi 	.st_res = 23
743*aaceae98SRobert Mustacchi }, {
744*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
745*aaceae98SRobert Mustacchi 	.st_val = 0xfed81500,
746*aaceae98SRobert Mustacchi 	.st_res = 9
747*aaceae98SRobert Mustacchi }, {
748*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
749*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
750*aaceae98SRobert Mustacchi 	.st_res = 1
751*aaceae98SRobert Mustacchi }, {
752*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
753*aaceae98SRobert Mustacchi 	.st_val = 0xfed80d0000000000,
754*aaceae98SRobert Mustacchi 	.st_res = 41
755*aaceae98SRobert Mustacchi }, {
756*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
757*aaceae98SRobert Mustacchi 	.st_val = 0xff70000000000000,
758*aaceae98SRobert Mustacchi 	.st_res = 53
759*aaceae98SRobert Mustacchi } };
760*aaceae98SRobert Mustacchi 
761*aaceae98SRobert Mustacchi /*
762*aaceae98SRobert Mustacchi  * Count Zeros.
763*aaceae98SRobert Mustacchi  */
764*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_cz_ops = {
765*aaceae98SRobert Mustacchi 	.so_name = "Count Zeros",
766*aaceae98SRobert Mustacchi 	.so_uc = stdc_count_zeros_uc,
767*aaceae98SRobert Mustacchi 	.so_us = stdc_count_zeros_us,
768*aaceae98SRobert Mustacchi 	.so_ui = stdc_count_zeros_ui,
769*aaceae98SRobert Mustacchi 	.so_ul = stdc_count_zeros_ul,
770*aaceae98SRobert Mustacchi 	.so_ull = stdc_count_zeros_ull,
771*aaceae98SRobert Mustacchi 	.so_delta = { 8, 16, 32 }
772*aaceae98SRobert Mustacchi };
773*aaceae98SRobert Mustacchi 
774*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_cz_tests[] = { {
775*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
776*aaceae98SRobert Mustacchi 	.st_val = 0,
777*aaceae98SRobert Mustacchi 	.st_res = 8
778*aaceae98SRobert Mustacchi }, {
779*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
780*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
781*aaceae98SRobert Mustacchi 	.st_res = 0
782*aaceae98SRobert Mustacchi }, {
783*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
784*aaceae98SRobert Mustacchi 	.st_val = 0x77,
785*aaceae98SRobert Mustacchi 	.st_res = 2
786*aaceae98SRobert Mustacchi }, {
787*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
788*aaceae98SRobert Mustacchi 	.st_val = 0x88,
789*aaceae98SRobert Mustacchi 	.st_res = 6
790*aaceae98SRobert Mustacchi }, {
791*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
792*aaceae98SRobert Mustacchi 	.st_val = 0x5,
793*aaceae98SRobert Mustacchi 	.st_res = 6
794*aaceae98SRobert Mustacchi }, {
795*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
796*aaceae98SRobert Mustacchi 	.st_val = 0x1f,
797*aaceae98SRobert Mustacchi 	.st_res = 3
798*aaceae98SRobert Mustacchi }, {
799*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
800*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
801*aaceae98SRobert Mustacchi 	.st_res = 0
802*aaceae98SRobert Mustacchi }, {
803*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
804*aaceae98SRobert Mustacchi 	.st_val = 0x1234,
805*aaceae98SRobert Mustacchi 	.st_res = 11
806*aaceae98SRobert Mustacchi }, {
807*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
808*aaceae98SRobert Mustacchi 	.st_val = 0x4321,
809*aaceae98SRobert Mustacchi 	.st_res = 11
810*aaceae98SRobert Mustacchi }, {
811*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
812*aaceae98SRobert Mustacchi 	.st_val = 0x2ba2,
813*aaceae98SRobert Mustacchi 	.st_res = 9
814*aaceae98SRobert Mustacchi }, {
815*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
816*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
817*aaceae98SRobert Mustacchi 	.st_res = 0
818*aaceae98SRobert Mustacchi }, {
819*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
820*aaceae98SRobert Mustacchi 	.st_val = 0xdeadbeef,
821*aaceae98SRobert Mustacchi 	.st_res = 8
822*aaceae98SRobert Mustacchi }, {
823*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
824*aaceae98SRobert Mustacchi 	.st_val = 0x12345678,
825*aaceae98SRobert Mustacchi 	.st_res = 19
826*aaceae98SRobert Mustacchi }, {
827*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
828*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
829*aaceae98SRobert Mustacchi 	.st_res = 0
830*aaceae98SRobert Mustacchi }, {
831*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
832*aaceae98SRobert Mustacchi 	.st_val = 0xabbabccbcddcdeed,
833*aaceae98SRobert Mustacchi 	.st_res = 22
834*aaceae98SRobert Mustacchi }, {
835*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
836*aaceae98SRobert Mustacchi 	.st_val = 0x1221244248848008,
837*aaceae98SRobert Mustacchi 	.st_res = 50
838*aaceae98SRobert Mustacchi }, {
839*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
840*aaceae98SRobert Mustacchi 	.st_val = 0xfffffffeefffffff,
841*aaceae98SRobert Mustacchi 	.st_res = 2
842*aaceae98SRobert Mustacchi } };
843*aaceae98SRobert Mustacchi 
844*aaceae98SRobert Mustacchi /*
845*aaceae98SRobert Mustacchi  * Count Ones.
846*aaceae98SRobert Mustacchi  */
847*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_co_ops = {
848*aaceae98SRobert Mustacchi 	.so_name = "Count Ones",
849*aaceae98SRobert Mustacchi 	.so_uc = stdc_count_ones_uc,
850*aaceae98SRobert Mustacchi 	.so_us = stdc_count_ones_us,
851*aaceae98SRobert Mustacchi 	.so_ui = stdc_count_ones_ui,
852*aaceae98SRobert Mustacchi 	.so_ul = stdc_count_ones_ul,
853*aaceae98SRobert Mustacchi 	.so_ull = stdc_count_ones_ull,
854*aaceae98SRobert Mustacchi };
855*aaceae98SRobert Mustacchi 
856*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_co_tests[] = { {
857*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
858*aaceae98SRobert Mustacchi 	.st_val = 0,
859*aaceae98SRobert Mustacchi 	.st_res = 0
860*aaceae98SRobert Mustacchi }, {
861*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
862*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
863*aaceae98SRobert Mustacchi 	.st_res = 8
864*aaceae98SRobert Mustacchi }, {
865*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
866*aaceae98SRobert Mustacchi 	.st_val = 0x77,
867*aaceae98SRobert Mustacchi 	.st_res = 6
868*aaceae98SRobert Mustacchi }, {
869*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
870*aaceae98SRobert Mustacchi 	.st_val = 0x88,
871*aaceae98SRobert Mustacchi 	.st_res = 2
872*aaceae98SRobert Mustacchi }, {
873*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
874*aaceae98SRobert Mustacchi 	.st_val = 0x5,
875*aaceae98SRobert Mustacchi 	.st_res = 2
876*aaceae98SRobert Mustacchi }, {
877*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
878*aaceae98SRobert Mustacchi 	.st_val = 0x1f,
879*aaceae98SRobert Mustacchi 	.st_res = 5
880*aaceae98SRobert Mustacchi }, {
881*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
882*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
883*aaceae98SRobert Mustacchi 	.st_res = 16
884*aaceae98SRobert Mustacchi }, {
885*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
886*aaceae98SRobert Mustacchi 	.st_val = 0x1234,
887*aaceae98SRobert Mustacchi 	.st_res = 5
888*aaceae98SRobert Mustacchi }, {
889*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
890*aaceae98SRobert Mustacchi 	.st_val = 0x4321,
891*aaceae98SRobert Mustacchi 	.st_res = 5
892*aaceae98SRobert Mustacchi }, {
893*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
894*aaceae98SRobert Mustacchi 	.st_val = 0x2ba2,
895*aaceae98SRobert Mustacchi 	.st_res = 7
896*aaceae98SRobert Mustacchi }, {
897*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
898*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
899*aaceae98SRobert Mustacchi 	.st_res = 32
900*aaceae98SRobert Mustacchi }, {
901*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
902*aaceae98SRobert Mustacchi 	.st_val = 0xdeadbeef,
903*aaceae98SRobert Mustacchi 	.st_res = 24
904*aaceae98SRobert Mustacchi }, {
905*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
906*aaceae98SRobert Mustacchi 	.st_val = 0x12345678,
907*aaceae98SRobert Mustacchi 	.st_res = 13
908*aaceae98SRobert Mustacchi }, {
909*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
910*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
911*aaceae98SRobert Mustacchi 	.st_res = 64
912*aaceae98SRobert Mustacchi }, {
913*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
914*aaceae98SRobert Mustacchi 	.st_val = 0xabbabccbcddcdeed,
915*aaceae98SRobert Mustacchi 	.st_res = 42
916*aaceae98SRobert Mustacchi }, {
917*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
918*aaceae98SRobert Mustacchi 	.st_val = 0x1221244248848008,
919*aaceae98SRobert Mustacchi 	.st_res = 14
920*aaceae98SRobert Mustacchi }, {
921*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
922*aaceae98SRobert Mustacchi 	.st_val = 0xfffffffeefffffff,
923*aaceae98SRobert Mustacchi 	.st_res = 62
924*aaceae98SRobert Mustacchi } };
925*aaceae98SRobert Mustacchi 
926*aaceae98SRobert Mustacchi /*
927*aaceae98SRobert Mustacchi  * Bit width tests. These values should stay the same as we increase integer
928*aaceae98SRobert Mustacchi  * sizes as values are only adding zeros.
929*aaceae98SRobert Mustacchi  */
930*aaceae98SRobert Mustacchi static const stdbit_ops_t stdbit_bw_ops = {
931*aaceae98SRobert Mustacchi 	.so_name = "Bit Width",
932*aaceae98SRobert Mustacchi 	.so_uc = stdc_bit_width_uc,
933*aaceae98SRobert Mustacchi 	.so_us = stdc_bit_width_us,
934*aaceae98SRobert Mustacchi 	.so_ui = stdc_bit_width_ui,
935*aaceae98SRobert Mustacchi 	.so_ul = stdc_bit_width_ul,
936*aaceae98SRobert Mustacchi 	.so_ull = stdc_bit_width_ull,
937*aaceae98SRobert Mustacchi };
938*aaceae98SRobert Mustacchi 
939*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_bw_tests[] = { {
940*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
941*aaceae98SRobert Mustacchi 	.st_val = 0,
942*aaceae98SRobert Mustacchi 	.st_res = 0
943*aaceae98SRobert Mustacchi }, {
944*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
945*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
946*aaceae98SRobert Mustacchi 	.st_res = 8
947*aaceae98SRobert Mustacchi }, {
948*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
949*aaceae98SRobert Mustacchi 	.st_val = 0x80,
950*aaceae98SRobert Mustacchi 	.st_res = 8
951*aaceae98SRobert Mustacchi }, {
952*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
953*aaceae98SRobert Mustacchi 	.st_val = 0x08,
954*aaceae98SRobert Mustacchi 	.st_res = 4
955*aaceae98SRobert Mustacchi }, {
956*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
957*aaceae98SRobert Mustacchi 	.st_val = 0x17,
958*aaceae98SRobert Mustacchi 	.st_res = 5
959*aaceae98SRobert Mustacchi }, {
960*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
961*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
962*aaceae98SRobert Mustacchi 	.st_res = 16
963*aaceae98SRobert Mustacchi }, {
964*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
965*aaceae98SRobert Mustacchi 	.st_val = 0x7777,
966*aaceae98SRobert Mustacchi 	.st_res = 15
967*aaceae98SRobert Mustacchi }, {
968*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
969*aaceae98SRobert Mustacchi 	.st_val = 0x2bb2,
970*aaceae98SRobert Mustacchi 	.st_res = 14
971*aaceae98SRobert Mustacchi }, {
972*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
973*aaceae98SRobert Mustacchi 	.st_val = 0x0230,
974*aaceae98SRobert Mustacchi 	.st_res = 10
975*aaceae98SRobert Mustacchi }, {
976*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
977*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
978*aaceae98SRobert Mustacchi 	.st_res = 32
979*aaceae98SRobert Mustacchi }, {
980*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
981*aaceae98SRobert Mustacchi 	.st_val = 0xfedc4000,
982*aaceae98SRobert Mustacchi 	.st_res = 32
983*aaceae98SRobert Mustacchi }, {
984*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
985*aaceae98SRobert Mustacchi 	.st_val = 0x0004cedf,
986*aaceae98SRobert Mustacchi 	.st_res = 19
987*aaceae98SRobert Mustacchi }, {
988*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
989*aaceae98SRobert Mustacchi 	.st_val = 0x001ee100,
990*aaceae98SRobert Mustacchi 	.st_res = 21
991*aaceae98SRobert Mustacchi }, {
992*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
993*aaceae98SRobert Mustacchi 	.st_val = 0x8000000000000000,
994*aaceae98SRobert Mustacchi 	.st_res = 64
995*aaceae98SRobert Mustacchi }, {
996*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
997*aaceae98SRobert Mustacchi 	.st_val = 0x00ff11ee22dd33cc,
998*aaceae98SRobert Mustacchi 	.st_res = 56
999*aaceae98SRobert Mustacchi }, {
1000*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
1001*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
1002*aaceae98SRobert Mustacchi 	.st_res = 64
1003*aaceae98SRobert Mustacchi } };
1004*aaceae98SRobert Mustacchi 
1005*aaceae98SRobert Mustacchi static void
1006*aaceae98SRobert Mustacchi stdbit_print_pass(stdbit_test_type_t types, uint64_t val, const char *cat)
1007*aaceae98SRobert Mustacchi {
1008*aaceae98SRobert Mustacchi 	bool first = true;
1009*aaceae98SRobert Mustacchi 	(void) printf("TEST PASSED: %s (0x%" PRIx64 ") [", cat, val);
1010*aaceae98SRobert Mustacchi 	if ((types & STDBIT_TEST_U8) != 0) {
1011*aaceae98SRobert Mustacchi 		(void) printf("8");
1012*aaceae98SRobert Mustacchi 		first = false;
1013*aaceae98SRobert Mustacchi 	}
1014*aaceae98SRobert Mustacchi 
1015*aaceae98SRobert Mustacchi 	if ((types & STDBIT_TEST_U16) != 0) {
1016*aaceae98SRobert Mustacchi 		(void) printf("%s16", first ? "" : ",");
1017*aaceae98SRobert Mustacchi 		first = false;
1018*aaceae98SRobert Mustacchi 	}
1019*aaceae98SRobert Mustacchi 
1020*aaceae98SRobert Mustacchi 	if ((types & STDBIT_TEST_U32) != 0) {
1021*aaceae98SRobert Mustacchi 		(void) printf("%s32", first ? "" : ",");
1022*aaceae98SRobert Mustacchi 		first = false;
1023*aaceae98SRobert Mustacchi 	}
1024*aaceae98SRobert Mustacchi 
1025*aaceae98SRobert Mustacchi 	if ((types & STDBIT_TEST_U64) != 0) {
1026*aaceae98SRobert Mustacchi 		(void) printf("%s64", first ? "" : ",");
1027*aaceae98SRobert Mustacchi 		first = false;
1028*aaceae98SRobert Mustacchi 	}
1029*aaceae98SRobert Mustacchi 
1030*aaceae98SRobert Mustacchi 	(void) printf("]\n");
1031*aaceae98SRobert Mustacchi }
1032*aaceae98SRobert Mustacchi 
1033*aaceae98SRobert Mustacchi static bool
1034*aaceae98SRobert Mustacchi stdbit_test_one(const stdbit_test_t *test, const stdbit_ops_t *ops)
1035*aaceae98SRobert Mustacchi {
1036*aaceae98SRobert Mustacchi 	bool ret = true;
1037*aaceae98SRobert Mustacchi 	uint64_t comp = test->st_res;
1038*aaceae98SRobert Mustacchi 
1039*aaceae98SRobert Mustacchi 	VERIFY3U(test->st_types, !=, 0);
1040*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U8) != 0) {
1041*aaceae98SRobert Mustacchi 		unsigned res = ops->so_uc(test->st_val);
1042*aaceae98SRobert Mustacchi 		if (res != comp) {
1043*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 8-bit (uchar) "
1044*aaceae98SRobert Mustacchi 			    "returned 0x%x, expected 0x%" PRIx64,
1045*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1046*aaceae98SRobert Mustacchi 			ret = false;
1047*aaceae98SRobert Mustacchi 		}
1048*aaceae98SRobert Mustacchi 
1049*aaceae98SRobert Mustacchi 		comp += ops->so_delta[0];
1050*aaceae98SRobert Mustacchi 	}
1051*aaceae98SRobert Mustacchi 
1052*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U16) != 0) {
1053*aaceae98SRobert Mustacchi 		unsigned res = ops->so_us(test->st_val);
1054*aaceae98SRobert Mustacchi 		if (res != comp) {
1055*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 16-bit (ushort) "
1056*aaceae98SRobert Mustacchi 			    "returned 0x%x, expected 0x%" PRIx64,
1057*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1058*aaceae98SRobert Mustacchi 			ret = false;
1059*aaceae98SRobert Mustacchi 		}
1060*aaceae98SRobert Mustacchi 
1061*aaceae98SRobert Mustacchi 		comp += ops->so_delta[1];
1062*aaceae98SRobert Mustacchi 	}
1063*aaceae98SRobert Mustacchi 
1064*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U32) != 0) {
1065*aaceae98SRobert Mustacchi 		unsigned res = ops->so_ui(test->st_val);
1066*aaceae98SRobert Mustacchi 		if (res != comp) {
1067*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 32-bit (uint) "
1068*aaceae98SRobert Mustacchi 			    "returned 0x%x, expected 0x%" PRIx64,
1069*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1070*aaceae98SRobert Mustacchi 			ret = false;
1071*aaceae98SRobert Mustacchi 		}
1072*aaceae98SRobert Mustacchi 
1073*aaceae98SRobert Mustacchi #ifdef	_LP32
1074*aaceae98SRobert Mustacchi 		res = ops->so_ul(test->st_val);
1075*aaceae98SRobert Mustacchi 		if (res != comp) {
1076*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 32-bit (ulong) "
1077*aaceae98SRobert Mustacchi 			    "returned 0x%x, expected 0x%" PRIx64,
1078*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1079*aaceae98SRobert Mustacchi 			ret = false;
1080*aaceae98SRobert Mustacchi 		}
1081*aaceae98SRobert Mustacchi #endif	/* _LP32 */
1082*aaceae98SRobert Mustacchi 
1083*aaceae98SRobert Mustacchi 		comp += ops->so_delta[2];
1084*aaceae98SRobert Mustacchi 	}
1085*aaceae98SRobert Mustacchi 
1086*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U64) != 0) {
1087*aaceae98SRobert Mustacchi 		unsigned res;
1088*aaceae98SRobert Mustacchi #ifdef	_LP64
1089*aaceae98SRobert Mustacchi 		res = ops->so_ul(test->st_val);
1090*aaceae98SRobert Mustacchi 		if (res != comp) {
1091*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 64-bit (ulong) "
1092*aaceae98SRobert Mustacchi 			    "returned 0x%x, expected 0x%" PRIx64,
1093*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1094*aaceae98SRobert Mustacchi 			ret = false;
1095*aaceae98SRobert Mustacchi 		}
1096*aaceae98SRobert Mustacchi #endif	/* _LP64 */
1097*aaceae98SRobert Mustacchi 
1098*aaceae98SRobert Mustacchi 		res = ops->so_ull(test->st_val);
1099*aaceae98SRobert Mustacchi 		if (res != comp) {
1100*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: %s (0x%" PRIx64 ") 64-bit (ulong "
1101*aaceae98SRobert Mustacchi 			    "long) returned 0x%x, expected 0x%" PRIx64,
1102*aaceae98SRobert Mustacchi 			    ops->so_name, test->st_val, res, comp);
1103*aaceae98SRobert Mustacchi 			ret = false;
1104*aaceae98SRobert Mustacchi 		}
1105*aaceae98SRobert Mustacchi 	}
1106*aaceae98SRobert Mustacchi 
1107*aaceae98SRobert Mustacchi 	if (ret) {
1108*aaceae98SRobert Mustacchi 		stdbit_print_pass(test->st_types, test->st_val, ops->so_name);
1109*aaceae98SRobert Mustacchi 	}
1110*aaceae98SRobert Mustacchi 
1111*aaceae98SRobert Mustacchi 	return (ret);
1112*aaceae98SRobert Mustacchi }
1113*aaceae98SRobert Mustacchi 
1114*aaceae98SRobert Mustacchi /*
1115*aaceae98SRobert Mustacchi  * This is used for all the functions that can return unsigned.
1116*aaceae98SRobert Mustacchi  */
1117*aaceae98SRobert Mustacchi typedef struct {
1118*aaceae98SRobert Mustacchi 	const stdbit_ops_t *sg_ops;
1119*aaceae98SRobert Mustacchi 	const stdbit_test_t *sg_tests;
1120*aaceae98SRobert Mustacchi 	size_t sg_ntests;
1121*aaceae98SRobert Mustacchi } stdbit_std_group_t;
1122*aaceae98SRobert Mustacchi 
1123*aaceae98SRobert Mustacchi static const stdbit_std_group_t stdbit_groups[] = {
1124*aaceae98SRobert Mustacchi 	{ &stdbit_clz_ops, stdbit_clz_tests, ARRAY_SIZE(stdbit_clz_tests) },
1125*aaceae98SRobert Mustacchi 	{ &stdbit_clo_ops, stdbit_clo_tests, ARRAY_SIZE(stdbit_clo_tests) },
1126*aaceae98SRobert Mustacchi 	{ &stdbit_ctz_ops, stdbit_ctz_tests, ARRAY_SIZE(stdbit_ctz_tests) },
1127*aaceae98SRobert Mustacchi 	{ &stdbit_cto_ops, stdbit_cto_tests, ARRAY_SIZE(stdbit_cto_tests) },
1128*aaceae98SRobert Mustacchi 	{ &stdbit_flz_ops, stdbit_flz_tests, ARRAY_SIZE(stdbit_flz_tests) },
1129*aaceae98SRobert Mustacchi 	{ &stdbit_flo_ops, stdbit_flo_tests, ARRAY_SIZE(stdbit_flo_tests) },
1130*aaceae98SRobert Mustacchi 	{ &stdbit_ftz_ops, stdbit_ftz_tests, ARRAY_SIZE(stdbit_ftz_tests) },
1131*aaceae98SRobert Mustacchi 	{ &stdbit_fto_ops, stdbit_fto_tests, ARRAY_SIZE(stdbit_fto_tests) },
1132*aaceae98SRobert Mustacchi 	{ &stdbit_cz_ops, stdbit_cz_tests, ARRAY_SIZE(stdbit_cz_tests) },
1133*aaceae98SRobert Mustacchi 	{ &stdbit_co_ops, stdbit_co_tests, ARRAY_SIZE(stdbit_co_tests) },
1134*aaceae98SRobert Mustacchi 	{ &stdbit_bw_ops, stdbit_bw_tests, ARRAY_SIZE(stdbit_bw_tests) },
1135*aaceae98SRobert Mustacchi };
1136*aaceae98SRobert Mustacchi 
1137*aaceae98SRobert Mustacchi /*
1138*aaceae98SRobert Mustacchi  * Tests for is a single bit set. These should be the same regardless of integer
1139*aaceae98SRobert Mustacchi  * size.
1140*aaceae98SRobert Mustacchi  */
1141*aaceae98SRobert Mustacchi static const stdbit_test_t stdbit_1b_tests[] = { {
1142*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1143*aaceae98SRobert Mustacchi 	.st_val = 0,
1144*aaceae98SRobert Mustacchi 	.st_res = false
1145*aaceae98SRobert Mustacchi }, {
1146*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1147*aaceae98SRobert Mustacchi 	.st_val = UINT8_MAX,
1148*aaceae98SRobert Mustacchi 	.st_res = false
1149*aaceae98SRobert Mustacchi }, {
1150*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1151*aaceae98SRobert Mustacchi 	.st_val = 0x40,
1152*aaceae98SRobert Mustacchi 	.st_res = true
1153*aaceae98SRobert Mustacchi }, {
1154*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1155*aaceae98SRobert Mustacchi 	.st_val = 0x23,
1156*aaceae98SRobert Mustacchi 	.st_res = false
1157*aaceae98SRobert Mustacchi }, {
1158*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1159*aaceae98SRobert Mustacchi 	.st_val = 0x81,
1160*aaceae98SRobert Mustacchi 	.st_res = false
1161*aaceae98SRobert Mustacchi }, {
1162*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_ALL,
1163*aaceae98SRobert Mustacchi 	.st_val = 0x08,
1164*aaceae98SRobert Mustacchi 	.st_res = true
1165*aaceae98SRobert Mustacchi }, {
1166*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1167*aaceae98SRobert Mustacchi 	.st_val = UINT16_MAX,
1168*aaceae98SRobert Mustacchi 	.st_res = false
1169*aaceae98SRobert Mustacchi }, {
1170*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1171*aaceae98SRobert Mustacchi 	.st_val = 0x0100,
1172*aaceae98SRobert Mustacchi 	.st_res = true
1173*aaceae98SRobert Mustacchi }, {
1174*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1175*aaceae98SRobert Mustacchi 	.st_val = 0x7777,
1176*aaceae98SRobert Mustacchi 	.st_res = false
1177*aaceae98SRobert Mustacchi }, {
1178*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1179*aaceae98SRobert Mustacchi 	.st_val = 0x8000,
1180*aaceae98SRobert Mustacchi 	.st_res = true
1181*aaceae98SRobert Mustacchi }, {
1182*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1183*aaceae98SRobert Mustacchi 	.st_val = 0x0400,
1184*aaceae98SRobert Mustacchi 	.st_res = true
1185*aaceae98SRobert Mustacchi }, {
1186*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1187*aaceae98SRobert Mustacchi 	.st_val = 0x0020,
1188*aaceae98SRobert Mustacchi 	.st_res = true
1189*aaceae98SRobert Mustacchi }, {
1190*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_16P,
1191*aaceae98SRobert Mustacchi 	.st_val = 0x0001,
1192*aaceae98SRobert Mustacchi 	.st_res = true
1193*aaceae98SRobert Mustacchi }, {
1194*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
1195*aaceae98SRobert Mustacchi 	.st_val = UINT32_MAX,
1196*aaceae98SRobert Mustacchi 	.st_res = false
1197*aaceae98SRobert Mustacchi }, {
1198*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
1199*aaceae98SRobert Mustacchi 	.st_val = 0x00200000,
1200*aaceae98SRobert Mustacchi 	.st_res = true
1201*aaceae98SRobert Mustacchi }, {
1202*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
1203*aaceae98SRobert Mustacchi 	.st_val = 0xbaddcafe,
1204*aaceae98SRobert Mustacchi 	.st_res = false
1205*aaceae98SRobert Mustacchi }, {
1206*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_32P,
1207*aaceae98SRobert Mustacchi 	.st_val = 0x80000000,
1208*aaceae98SRobert Mustacchi 	.st_res = true
1209*aaceae98SRobert Mustacchi }, {
1210*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
1211*aaceae98SRobert Mustacchi 	.st_val = UINT64_MAX,
1212*aaceae98SRobert Mustacchi 	.st_res = false
1213*aaceae98SRobert Mustacchi }, {
1214*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
1215*aaceae98SRobert Mustacchi 	.st_val = 0x8000000000000000,
1216*aaceae98SRobert Mustacchi 	.st_res = true
1217*aaceae98SRobert Mustacchi }, {
1218*aaceae98SRobert Mustacchi 	.st_types = STDBIT_TEST_64P,
1219*aaceae98SRobert Mustacchi 	.st_val = 0x0010000000000000,
1220*aaceae98SRobert Mustacchi 	.st_res = true
1221*aaceae98SRobert Mustacchi } };
1222*aaceae98SRobert Mustacchi 
1223*aaceae98SRobert Mustacchi /*
1224*aaceae98SRobert Mustacchi  * The single bit set tests require a slightly different runner because they
1225*aaceae98SRobert Mustacchi  * return a boolean.
1226*aaceae98SRobert Mustacchi  */
1227*aaceae98SRobert Mustacchi static bool
1228*aaceae98SRobert Mustacchi stdbit_1b_test_one(const stdbit_test_t *test)
1229*aaceae98SRobert Mustacchi {
1230*aaceae98SRobert Mustacchi 	bool ret = true, comp;
1231*aaceae98SRobert Mustacchi 
1232*aaceae98SRobert Mustacchi 	VERIFY(test->st_res == 0 || test->st_res == 1);
1233*aaceae98SRobert Mustacchi 	comp = (bool)test->st_res;
1234*aaceae98SRobert Mustacchi 
1235*aaceae98SRobert Mustacchi 	VERIFY3U(test->st_types, !=, 0);
1236*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U8) != 0) {
1237*aaceae98SRobert Mustacchi 		bool res = stdc_has_single_bit_uc(test->st_val);
1238*aaceae98SRobert Mustacchi 		if (res != comp) {
1239*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 8-bit "
1240*aaceae98SRobert Mustacchi 			    "(uchar) returned %s, expected %s", test->st_val,
1241*aaceae98SRobert Mustacchi 			    res ? "true" : "false", comp ? "true" : "false");
1242*aaceae98SRobert Mustacchi 			ret = false;
1243*aaceae98SRobert Mustacchi 		}
1244*aaceae98SRobert Mustacchi 	}
1245*aaceae98SRobert Mustacchi 
1246*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U16) != 0) {
1247*aaceae98SRobert Mustacchi 		bool res = stdc_has_single_bit_us(test->st_val);
1248*aaceae98SRobert Mustacchi 		if (res != comp) {
1249*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 16-bit "
1250*aaceae98SRobert Mustacchi 			    "(ushort) returned %s, expected %s", test->st_val,
1251*aaceae98SRobert Mustacchi 			    res ? "true" : "false", comp ? "true" : "false");
1252*aaceae98SRobert Mustacchi 			ret = false;
1253*aaceae98SRobert Mustacchi 		}
1254*aaceae98SRobert Mustacchi 	}
1255*aaceae98SRobert Mustacchi 
1256*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U32) != 0) {
1257*aaceae98SRobert Mustacchi 		bool res = stdc_has_single_bit_ui(test->st_val);
1258*aaceae98SRobert Mustacchi 		if (res != comp) {
1259*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 32-bit "
1260*aaceae98SRobert Mustacchi 			    "(uint) returned %s, expected %s", test->st_val,
1261*aaceae98SRobert Mustacchi 			    res ? "true" : "false", comp ? "true" : "false");
1262*aaceae98SRobert Mustacchi 			ret = false;
1263*aaceae98SRobert Mustacchi 		}
1264*aaceae98SRobert Mustacchi 
1265*aaceae98SRobert Mustacchi #ifdef	_LP32
1266*aaceae98SRobert Mustacchi 		res = stdc_has_single_bit_ul(test->st_val);
1267*aaceae98SRobert Mustacchi 		if (res != comp) {
1268*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 32-bit "
1269*aaceae98SRobert Mustacchi 			    "(ulong) returned %s, expected %s", test->st_val,
1270*aaceae98SRobert Mustacchi 			    res ? "true" : "false", comp ? "true" : "false");
1271*aaceae98SRobert Mustacchi 			ret = false;
1272*aaceae98SRobert Mustacchi 		}
1273*aaceae98SRobert Mustacchi #endif	/* _LP32 */
1274*aaceae98SRobert Mustacchi 	}
1275*aaceae98SRobert Mustacchi 
1276*aaceae98SRobert Mustacchi 	if ((test->st_types & STDBIT_TEST_U64) != 0) {
1277*aaceae98SRobert Mustacchi 		bool res;
1278*aaceae98SRobert Mustacchi #ifdef	_LP64
1279*aaceae98SRobert Mustacchi 		res = stdc_has_single_bit_ul(test->st_val);
1280*aaceae98SRobert Mustacchi 		if (res != comp) {
1281*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 64-bit "
1282*aaceae98SRobert Mustacchi 			    "(ulong) returned %s, expected %s", test->st_val,
1283*aaceae98SRobert Mustacchi 			    res ? "true" : "false", comp ? "true" : "false");
1284*aaceae98SRobert Mustacchi 			ret = false;
1285*aaceae98SRobert Mustacchi 		}
1286*aaceae98SRobert Mustacchi #endif	/* _LP64 */
1287*aaceae98SRobert Mustacchi 
1288*aaceae98SRobert Mustacchi 		res = stdc_has_single_bit_ull(test->st_val);
1289*aaceae98SRobert Mustacchi 		if (res != comp) {
1290*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Single-bit (0x%" PRIx64 ") 64-bit "
1291*aaceae98SRobert Mustacchi 			    "(ulong long) returned %s, expected %s",
1292*aaceae98SRobert Mustacchi 			    test->st_val, res ? "true" : "false",
1293*aaceae98SRobert Mustacchi 			    comp ? "true" : "false");
1294*aaceae98SRobert Mustacchi 			ret = false;
1295*aaceae98SRobert Mustacchi 		}
1296*aaceae98SRobert Mustacchi 	}
1297*aaceae98SRobert Mustacchi 
1298*aaceae98SRobert Mustacchi 	if (ret) {
1299*aaceae98SRobert Mustacchi 		stdbit_print_pass(test->st_types, test->st_val, "Single-bit");
1300*aaceae98SRobert Mustacchi 	}
1301*aaceae98SRobert Mustacchi 
1302*aaceae98SRobert Mustacchi 	return (ret);
1303*aaceae98SRobert Mustacchi }
1304*aaceae98SRobert Mustacchi 
1305*aaceae98SRobert Mustacchi /*
1306*aaceae98SRobert Mustacchi  * We use a different test structure for the floor and ceiling tests and check
1307*aaceae98SRobert Mustacchi  * both at each stop.
1308*aaceae98SRobert Mustacchi  */
1309*aaceae98SRobert Mustacchi typedef struct {
1310*aaceae98SRobert Mustacchi 	stdbit_test_type_t sfc_types;
1311*aaceae98SRobert Mustacchi 	uint64_t sfc_val;
1312*aaceae98SRobert Mustacchi 	uint64_t sfc_floor;
1313*aaceae98SRobert Mustacchi 	uint64_t sfc_ceil;
1314*aaceae98SRobert Mustacchi } stdbit_fc_test_t;
1315*aaceae98SRobert Mustacchi 
1316*aaceae98SRobert Mustacchi /*
1317*aaceae98SRobert Mustacchi  * Bit floor and ceiling tests. Note, a bit ceiling test can fail and return 0
1318*aaceae98SRobert Mustacchi  * if the value would overlap the type it's in. In those cases we don't use all
1319*aaceae98SRobert Mustacchi  * tests. This happens when the most significant bit in a given integer is set.
1320*aaceae98SRobert Mustacchi  * It will work at the next size up. All others should always pass all tests.
1321*aaceae98SRobert Mustacchi  */
1322*aaceae98SRobert Mustacchi static const stdbit_fc_test_t stdbit_fc_tests[] = { {
1323*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_ALL,
1324*aaceae98SRobert Mustacchi 	.sfc_val = 0,
1325*aaceae98SRobert Mustacchi 	.sfc_floor = 0,
1326*aaceae98SRobert Mustacchi 	.sfc_ceil = 1
1327*aaceae98SRobert Mustacchi }, {
1328*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U8,
1329*aaceae98SRobert Mustacchi 	.sfc_val = UINT8_MAX,
1330*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 7,
1331*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1332*aaceae98SRobert Mustacchi }, {
1333*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_ALL,
1334*aaceae98SRobert Mustacchi 	.sfc_val = 0x23,
1335*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 5,
1336*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 6
1337*aaceae98SRobert Mustacchi }, {
1338*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_ALL,
1339*aaceae98SRobert Mustacchi 	.sfc_val = 0x06,
1340*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 2,
1341*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 3
1342*aaceae98SRobert Mustacchi }, {
1343*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_ALL,
1344*aaceae98SRobert Mustacchi 	.sfc_val = 0x18,
1345*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 4,
1346*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 5
1347*aaceae98SRobert Mustacchi }, {
1348*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U8,
1349*aaceae98SRobert Mustacchi 	.sfc_val = 0x81,
1350*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 7,
1351*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1352*aaceae98SRobert Mustacchi }, {
1353*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_16P,
1354*aaceae98SRobert Mustacchi 	.sfc_val = UINT8_MAX,
1355*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 7,
1356*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 8
1357*aaceae98SRobert Mustacchi }, {
1358*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_16P,
1359*aaceae98SRobert Mustacchi 	.sfc_val = 0x0ff7,
1360*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 11,
1361*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 12
1362*aaceae98SRobert Mustacchi }, {
1363*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_16P,
1364*aaceae98SRobert Mustacchi 	.sfc_val = 0x20a4,
1365*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 13,
1366*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 14
1367*aaceae98SRobert Mustacchi }, {
1368*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U16,
1369*aaceae98SRobert Mustacchi 	.sfc_val = 0x8ab1,
1370*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 15,
1371*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1372*aaceae98SRobert Mustacchi }, {
1373*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U16,
1374*aaceae98SRobert Mustacchi 	.sfc_val = UINT16_MAX,
1375*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 15,
1376*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1377*aaceae98SRobert Mustacchi }, {
1378*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_32P,
1379*aaceae98SRobert Mustacchi 	.sfc_val = UINT16_MAX,
1380*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 15,
1381*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 16
1382*aaceae98SRobert Mustacchi }, {
1383*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_32P,
1384*aaceae98SRobert Mustacchi 	.sfc_val = 0x000271ab,
1385*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 17,
1386*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 18
1387*aaceae98SRobert Mustacchi }, {
1388*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_32P,
1389*aaceae98SRobert Mustacchi 	.sfc_val = 0x01000009,
1390*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 24,
1391*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 25
1392*aaceae98SRobert Mustacchi }, {
1393*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_32P,
1394*aaceae98SRobert Mustacchi 	.sfc_val = 0x02000000,
1395*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 25,
1396*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 25
1397*aaceae98SRobert Mustacchi }, {
1398*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_32P,
1399*aaceae98SRobert Mustacchi 	.sfc_val = 0x1cabf917,
1400*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 28,
1401*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 29
1402*aaceae98SRobert Mustacchi }, {
1403*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U32,
1404*aaceae98SRobert Mustacchi 	.sfc_val = 0x800a9b03,
1405*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 31,
1406*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1407*aaceae98SRobert Mustacchi }, {
1408*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U32,
1409*aaceae98SRobert Mustacchi 	.sfc_val = UINT32_MAX,
1410*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 31,
1411*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1412*aaceae98SRobert Mustacchi }, {
1413*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_64P,
1414*aaceae98SRobert Mustacchi 	.sfc_val = UINT32_MAX,
1415*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 31,
1416*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 32
1417*aaceae98SRobert Mustacchi }, {
1418*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U64,
1419*aaceae98SRobert Mustacchi 	.sfc_val = 0x0089a23b1389ba87,
1420*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 55,
1421*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 56
1422*aaceae98SRobert Mustacchi }, {
1423*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U64,
1424*aaceae98SRobert Mustacchi 	.sfc_val = 0x499aff6eb12e7777,
1425*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 62,
1426*aaceae98SRobert Mustacchi 	.sfc_ceil = 1ULL << 63
1427*aaceae98SRobert Mustacchi }, {
1428*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U64,
1429*aaceae98SRobert Mustacchi 	.sfc_val = 0xc00123481980ab87,
1430*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 63,
1431*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1432*aaceae98SRobert Mustacchi }, {
1433*aaceae98SRobert Mustacchi 	.sfc_types = STDBIT_TEST_U64,
1434*aaceae98SRobert Mustacchi 	.sfc_val = UINT64_MAX,
1435*aaceae98SRobert Mustacchi 	.sfc_floor = 1ULL << 63,
1436*aaceae98SRobert Mustacchi 	.sfc_ceil = 0
1437*aaceae98SRobert Mustacchi } };
1438*aaceae98SRobert Mustacchi 
1439*aaceae98SRobert Mustacchi static bool
1440*aaceae98SRobert Mustacchi stdbit_fc_test_one(const stdbit_fc_test_t *test)
1441*aaceae98SRobert Mustacchi {
1442*aaceae98SRobert Mustacchi 	bool ret = true;
1443*aaceae98SRobert Mustacchi 
1444*aaceae98SRobert Mustacchi 	VERIFY3U(test->sfc_types, !=, 0);
1445*aaceae98SRobert Mustacchi 	if ((test->sfc_types & STDBIT_TEST_U8) != 0) {
1446*aaceae98SRobert Mustacchi 		uint64_t res = stdc_bit_floor_uc(test->sfc_val);
1447*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1448*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 8-bit "
1449*aaceae98SRobert Mustacchi 			    "(uchar) returned 0x%" PRIx64 ", expected 0x%"
1450*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1451*aaceae98SRobert Mustacchi 			ret = false;
1452*aaceae98SRobert Mustacchi 		}
1453*aaceae98SRobert Mustacchi 
1454*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_uc(test->sfc_val);
1455*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1456*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 8-bit "
1457*aaceae98SRobert Mustacchi 			    "(uchar) returned 0x%" PRIx64 ", expected 0x%"
1458*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1459*aaceae98SRobert Mustacchi 			ret = false;
1460*aaceae98SRobert Mustacchi 		}
1461*aaceae98SRobert Mustacchi 	}
1462*aaceae98SRobert Mustacchi 
1463*aaceae98SRobert Mustacchi 	if ((test->sfc_types & STDBIT_TEST_U16) != 0) {
1464*aaceae98SRobert Mustacchi 		uint64_t res = stdc_bit_floor_us(test->sfc_val);
1465*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1466*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 16-bit "
1467*aaceae98SRobert Mustacchi 			    "(ushort) returned 0x%" PRIx64 ", expected 0x%"
1468*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1469*aaceae98SRobert Mustacchi 			ret = false;
1470*aaceae98SRobert Mustacchi 		}
1471*aaceae98SRobert Mustacchi 
1472*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_us(test->sfc_val);
1473*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1474*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 16-bit "
1475*aaceae98SRobert Mustacchi 			    "(ushort) returned 0x%" PRIx64 ", expected 0x%"
1476*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1477*aaceae98SRobert Mustacchi 			ret = false;
1478*aaceae98SRobert Mustacchi 		}
1479*aaceae98SRobert Mustacchi 	}
1480*aaceae98SRobert Mustacchi 
1481*aaceae98SRobert Mustacchi 	if ((test->sfc_types & STDBIT_TEST_U32) != 0) {
1482*aaceae98SRobert Mustacchi 		uint64_t res = stdc_bit_floor_ui(test->sfc_val);
1483*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1484*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 32-bit "
1485*aaceae98SRobert Mustacchi 			    "(uint) returned 0x%" PRIx64 ", expected 0x%"
1486*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1487*aaceae98SRobert Mustacchi 			ret = false;
1488*aaceae98SRobert Mustacchi 		}
1489*aaceae98SRobert Mustacchi 
1490*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_ui(test->sfc_val);
1491*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1492*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 32-bit "
1493*aaceae98SRobert Mustacchi 			    "(uint) returned 0x%" PRIx64 ", expected 0x%"
1494*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1495*aaceae98SRobert Mustacchi 			ret = false;
1496*aaceae98SRobert Mustacchi 		}
1497*aaceae98SRobert Mustacchi 
1498*aaceae98SRobert Mustacchi #ifdef	_LP32
1499*aaceae98SRobert Mustacchi 		res = stdc_bit_floor_ul(test->sfc_val);
1500*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1501*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 32-bit "
1502*aaceae98SRobert Mustacchi 			    "(ulong) returned 0x%" PRIx64 ", expected 0x%"
1503*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1504*aaceae98SRobert Mustacchi 			ret = false;
1505*aaceae98SRobert Mustacchi 		}
1506*aaceae98SRobert Mustacchi 
1507*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_ul(test->sfc_val);
1508*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1509*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 32-bit "
1510*aaceae98SRobert Mustacchi 			    "(ulong) returned 0x%" PRIx64 ", expected 0x%"
1511*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1512*aaceae98SRobert Mustacchi 			ret = false;
1513*aaceae98SRobert Mustacchi 		}
1514*aaceae98SRobert Mustacchi #endif	/* _LP32 */
1515*aaceae98SRobert Mustacchi 	}
1516*aaceae98SRobert Mustacchi 
1517*aaceae98SRobert Mustacchi 	if ((test->sfc_types & STDBIT_TEST_U64) != 0) {
1518*aaceae98SRobert Mustacchi 		uint64_t res;
1519*aaceae98SRobert Mustacchi 
1520*aaceae98SRobert Mustacchi #ifdef	_LP64
1521*aaceae98SRobert Mustacchi 		res = stdc_bit_floor_ul(test->sfc_val);
1522*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1523*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 64-bit "
1524*aaceae98SRobert Mustacchi 			    "(ulong) returned 0x%" PRIx64 ", expected 0x%"
1525*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1526*aaceae98SRobert Mustacchi 			ret = false;
1527*aaceae98SRobert Mustacchi 		}
1528*aaceae98SRobert Mustacchi 
1529*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_ul(test->sfc_val);
1530*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1531*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 64-bit "
1532*aaceae98SRobert Mustacchi 			    "(ulong) returned 0x%" PRIx64 ", expected 0x%"
1533*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1534*aaceae98SRobert Mustacchi 			ret = false;
1535*aaceae98SRobert Mustacchi 		}
1536*aaceae98SRobert Mustacchi #endif	/* _LP64 */
1537*aaceae98SRobert Mustacchi 
1538*aaceae98SRobert Mustacchi 		res = stdc_bit_floor_ull(test->sfc_val);
1539*aaceae98SRobert Mustacchi 		if (res != test->sfc_floor) {
1540*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Floor (0x%" PRIx64 ") 64-bit "
1541*aaceae98SRobert Mustacchi 			    "(ulong long) returned 0x%" PRIx64 ", expected 0x%"
1542*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_floor);
1543*aaceae98SRobert Mustacchi 			ret = false;
1544*aaceae98SRobert Mustacchi 		}
1545*aaceae98SRobert Mustacchi 
1546*aaceae98SRobert Mustacchi 		res = stdc_bit_ceil_ull(test->sfc_val);
1547*aaceae98SRobert Mustacchi 		if (res != test->sfc_ceil) {
1548*aaceae98SRobert Mustacchi 			warnx("TEST FAILED: Bit Ceiling (0x%" PRIx64 ") 64-bit "
1549*aaceae98SRobert Mustacchi 			    "(ulong long) returned 0x%" PRIx64 ", expected 0x%"
1550*aaceae98SRobert Mustacchi 			    PRIx64, test->sfc_val, res, test->sfc_ceil);
1551*aaceae98SRobert Mustacchi 			ret = false;
1552*aaceae98SRobert Mustacchi 		}
1553*aaceae98SRobert Mustacchi 	}
1554*aaceae98SRobert Mustacchi 
1555*aaceae98SRobert Mustacchi 	if (ret) {
1556*aaceae98SRobert Mustacchi 		stdbit_print_pass(test->sfc_types, test->sfc_val,
1557*aaceae98SRobert Mustacchi 		    "Bit Floor/Ceiling");
1558*aaceae98SRobert Mustacchi 	}
1559*aaceae98SRobert Mustacchi 
1560*aaceae98SRobert Mustacchi 	return (ret);
1561*aaceae98SRobert Mustacchi 
1562*aaceae98SRobert Mustacchi }
1563*aaceae98SRobert Mustacchi 
1564*aaceae98SRobert Mustacchi int
1565*aaceae98SRobert Mustacchi main(void)
1566*aaceae98SRobert Mustacchi {
1567*aaceae98SRobert Mustacchi 	int ret = EXIT_SUCCESS;
1568*aaceae98SRobert Mustacchi 
1569*aaceae98SRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(stdbit_groups); i++) {
1570*aaceae98SRobert Mustacchi 		for (size_t t = 0; t < stdbit_groups[i].sg_ntests; t++) {
1571*aaceae98SRobert Mustacchi 			if (!stdbit_test_one(&stdbit_groups[i].sg_tests[t],
1572*aaceae98SRobert Mustacchi 			    stdbit_groups[i].sg_ops)) {
1573*aaceae98SRobert Mustacchi 				ret = EXIT_FAILURE;
1574*aaceae98SRobert Mustacchi 			}
1575*aaceae98SRobert Mustacchi 		}
1576*aaceae98SRobert Mustacchi 	}
1577*aaceae98SRobert Mustacchi 
1578*aaceae98SRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(stdbit_1b_tests); i++) {
1579*aaceae98SRobert Mustacchi 		if (!stdbit_1b_test_one(&stdbit_1b_tests[i])) {
1580*aaceae98SRobert Mustacchi 			ret = EXIT_FAILURE;
1581*aaceae98SRobert Mustacchi 		}
1582*aaceae98SRobert Mustacchi 	}
1583*aaceae98SRobert Mustacchi 
1584*aaceae98SRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(stdbit_fc_tests); i++) {
1585*aaceae98SRobert Mustacchi 		if (!stdbit_fc_test_one(&stdbit_fc_tests[i])) {
1586*aaceae98SRobert Mustacchi 			ret = EXIT_FAILURE;
1587*aaceae98SRobert Mustacchi 		}
1588*aaceae98SRobert Mustacchi 	}
1589*aaceae98SRobert Mustacchi 
1590*aaceae98SRobert Mustacchi 	if (ret == EXIT_SUCCESS) {
1591*aaceae98SRobert Mustacchi 		(void) printf("All tests passed successfully\n");
1592*aaceae98SRobert Mustacchi 	}
1593*aaceae98SRobert Mustacchi 
1594*aaceae98SRobert Mustacchi 	return (ret);
1595*aaceae98SRobert Mustacchi }
1596