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