blob: 136e9f2ddaf59f82a694db758e50dba426e535aa [file] [log] [blame]
Elliott Hughes5e70fe52025-07-22 09:19:37 -07001/*
2 * Copyright (C) 2025 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30
31#if __has_include(<stdbit.h>)
32
33#include <gtest/gtest.h>
34
35#include <stdbit.h>
36
37#include <limits.h>
38
39typedef unsigned char uc;
40typedef unsigned short us;
41typedef unsigned int ui;
42typedef unsigned long int ul;
43typedef unsigned long long int ull;
44
45TEST(stdbit, version) {
46 EXPECT_EQ(202311L, __STDC_VERSION_STDBIT_H__);
47}
48
49TEST(stdbit, endian) {
50 EXPECT_EQ(__STDC_ENDIAN_LITTLE__, __STDC_ENDIAN_NATIVE__);
51}
52
53static constexpr unsigned kLongBit = static_cast<unsigned>(LONG_BIT);
54
55TEST(stdbit, stdc_leading_zeros) {
56 EXPECT_EQ(64u, stdc_leading_zeros(0x0000000000000000ull));
57 EXPECT_EQ(32u, stdc_leading_zeros(0x00000000ffffffffull));
58 EXPECT_EQ(48u, stdc_leading_zeros(0x000000000000ffffull));
59 EXPECT_EQ(0u, stdc_leading_zeros(0xffffffffffffffffull));
60}
61
62TEST(stdbit, stdc_leading_zeros_forwarding) {
63 EXPECT_EQ(8u, stdc_leading_zeros_uc(0x0000000000000000ull));
64 EXPECT_EQ(16u, stdc_leading_zeros_us(0x0000000000000000ull));
65 EXPECT_EQ(32u, stdc_leading_zeros_ui(0x0000000000000000ull));
66 EXPECT_EQ(kLongBit, stdc_leading_zeros_ul(0x0000000000000000ull));
67 EXPECT_EQ(64u, stdc_leading_zeros_ull(0x0000000000000000ull));
68}
69
70TEST(stdbit, stdc_leading_ones) {
71 EXPECT_EQ(64u, stdc_leading_ones(0xffffffffffffffffull));
72 EXPECT_EQ(32u, stdc_leading_ones(0xffffffff00000000ull));
73 EXPECT_EQ(16u, stdc_leading_ones(0xffff000000000000ull));
74 EXPECT_EQ(0u, stdc_leading_ones(0x0000000000000000ull));
75}
76
77TEST(stdbit, stdc_leading_ones_forwarding) {
78 EXPECT_EQ(8u, stdc_leading_ones_uc(0xffffffffffffffffull));
79 EXPECT_EQ(16u, stdc_leading_ones_us(0xffffffffffffffffull));
80 EXPECT_EQ(32u, stdc_leading_ones_ui(0xffffffffffffffffull));
81 EXPECT_EQ(kLongBit, stdc_leading_ones_ul(0xffffffffffffffffull));
82 EXPECT_EQ(64u, stdc_leading_ones_ull(0xffffffffffffffffull));
83}
84
85TEST(stdbit, stdc_trailing_zeros) {
86 EXPECT_EQ(64u, stdc_trailing_zeros(0x0000000000000000ull));
87 EXPECT_EQ(0u, stdc_trailing_zeros(0x0000000000000001ull));
88 EXPECT_EQ(8u, stdc_trailing_zeros(0x0000000000000100ull));
89 EXPECT_EQ(16u, stdc_trailing_zeros(0x0000000000010000ull));
90 EXPECT_EQ(32u, stdc_trailing_zeros(0x0000000100000000ull));
91 EXPECT_EQ(63u, stdc_trailing_zeros(0x8000000000000000ull));
92 EXPECT_EQ(0u, stdc_trailing_zeros(0xffffffffffffffffull));
93}
94
95TEST(stdbit, stdc_trailing_zeros_forwarding) {
96 EXPECT_EQ(8u, stdc_trailing_zeros_uc(0x0000000000000000ull));
97 EXPECT_EQ(16u, stdc_trailing_zeros_us(0x0000000000000000ull));
98 EXPECT_EQ(32u, stdc_trailing_zeros_ui(0x0000000000000000ull));
99 EXPECT_EQ(kLongBit, stdc_trailing_zeros_ul(0x0000000000000000ull));
100 EXPECT_EQ(64u, stdc_trailing_zeros_ull(0x0000000000000000ull));
101}
102
103TEST(stdbit, stdc_trailing_ones) {
104 EXPECT_EQ(0u, stdc_trailing_ones(0x0000000000000000ull));
105 EXPECT_EQ(8u, stdc_trailing_ones(0x00000000000000ffull));
106 EXPECT_EQ(16u, stdc_trailing_ones(0x000000000000ffffull));
107 EXPECT_EQ(32u, stdc_trailing_ones(0x00000000ffffffffull));
108 EXPECT_EQ(64u, stdc_trailing_ones(0xffffffffffffffffull));
109}
110
111TEST(stdbit, stdc_trailing_ones_forwarding) {
112 EXPECT_EQ(8u, stdc_trailing_ones_uc(0xffffffffffffffffull));
113 EXPECT_EQ(16u, stdc_trailing_ones_us(0xffffffffffffffffull));
114 EXPECT_EQ(32u, stdc_trailing_ones_ui(0xffffffffffffffffull));
115 EXPECT_EQ(kLongBit, stdc_trailing_ones_ul(0xffffffffffffffffull));
116 EXPECT_EQ(64u, stdc_trailing_ones_ull(0xffffffffffffffffull));
117}
118
119TEST(stdbit, stdc_first_leading_zero) {
120 EXPECT_EQ(1u, stdc_first_leading_zero(0x0000000000000000ull));
121 EXPECT_EQ(9u, stdc_first_leading_zero(0xff00000000000000ull));
122 EXPECT_EQ(17u, stdc_first_leading_zero(0xffff000000000000ull));
123 EXPECT_EQ(33u, stdc_first_leading_zero(0xffffffff00000000ull));
124 EXPECT_EQ(0u, stdc_first_leading_zero(0xffffffffffffffffull));
125}
126
127TEST(stdbit, stdc_first_leading_zero_forwarding) {
128 EXPECT_EQ(8u, stdc_first_leading_zero_uc(0xfffffffffffffffeull));
129 EXPECT_EQ(16u, stdc_first_leading_zero_us(0xfffffffffffffffeull));
130 EXPECT_EQ(32u, stdc_first_leading_zero_ui(0xfffffffffffffffeull));
Elliott Hughes5e395b82025-07-28 09:50:38 -0700131#if defined(__LP64__)
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700132 EXPECT_EQ(64u, stdc_first_leading_zero_ul(0xfffffffffffffffeull));
Elliott Hughes5e395b82025-07-28 09:50:38 -0700133#else
134 EXPECT_EQ(32u, stdc_first_leading_zero_ul(0xfffffffffffffffeull));
135#endif
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700136 EXPECT_EQ(64u, stdc_first_leading_zero_ull(0xfffffffffffffffeull));
137}
138
139TEST(stdbit, stdc_first_leading_one) {
140 EXPECT_EQ(0u, stdc_first_leading_one(0x0000000000000000ull));
141 EXPECT_EQ(57u, stdc_first_leading_one(0x00000000000000ffull));
142 EXPECT_EQ(49u, stdc_first_leading_one(0x000000000000ffffull));
143 EXPECT_EQ(33u, stdc_first_leading_one(0x00000000ffffffffull));
144 EXPECT_EQ(1u, stdc_first_leading_one(0xffffffffffffffffull));
145}
146
147TEST(stdbit, stdc_first_leading_one_forwarding) {
148 EXPECT_EQ(8u, stdc_first_leading_one_uc(0x0000000000000001ull));
149 EXPECT_EQ(16u, stdc_first_leading_one_us(0x0000000000000001ull));
150 EXPECT_EQ(32u, stdc_first_leading_one_ui(0x0000000000000001ull));
151 EXPECT_EQ(kLongBit, stdc_first_leading_one_ul(0x0000000000000001ull));
152 EXPECT_EQ(64u, stdc_first_leading_one_ull(0x0000000000000001ull));
153}
154
155TEST(stdbit, stdc_first_trailing_zero) {
156 EXPECT_EQ(1u, stdc_first_trailing_zero(0x0000000000000000ull));
157 EXPECT_EQ(9u, stdc_first_trailing_zero(0x00000000000000ffull));
158 EXPECT_EQ(17u, stdc_first_trailing_zero(0x000000000000ffffull));
159 EXPECT_EQ(33u, stdc_first_trailing_zero(0x00000000ffffffffull));
160 EXPECT_EQ(0u, stdc_first_trailing_zero(0xffffffffffffffffull));
161}
162
163TEST(stdbit, stdc_first_trailing_zero_forwarding) {
164 EXPECT_EQ(8u, stdc_first_trailing_zero_uc(0x00000000000007full));
165 EXPECT_EQ(16u, stdc_first_trailing_zero_us(0x000000000007fffull));
166 EXPECT_EQ(32u, stdc_first_trailing_zero_ui(0x00000007fffffffull));
167#if defined(__LP64__)
168 EXPECT_EQ(64u, stdc_first_trailing_zero_ul(0x7fffffffffffffffull));
169#else
170 EXPECT_EQ(32u, stdc_first_trailing_zero_ul(0x00000007fffffffull));
171#endif
172 EXPECT_EQ(64u, stdc_first_trailing_zero_ull(0x7fffffffffffffffull));
173}
174
175TEST(stdbit, stdc_first_trailing_one) {
176 EXPECT_EQ(0u, stdc_first_trailing_one(0x0000000000000000ull));
177 EXPECT_EQ(57u, stdc_first_trailing_one(0xff00000000000000ull));
178 EXPECT_EQ(49u, stdc_first_trailing_one(0xffff000000000000ull));
179 EXPECT_EQ(33u, stdc_first_trailing_one(0xffffffff00000000ull));
180 EXPECT_EQ(1u, stdc_first_trailing_one(0xffffffffffffffffull));
181}
182
183TEST(stdbit, stdc_first_trailing_one_forwarding) {
184 EXPECT_EQ(8u, stdc_first_trailing_one_uc(0x000000000000080ull));
185 EXPECT_EQ(16u, stdc_first_trailing_one_us(0x000000000008000ull));
186 EXPECT_EQ(32u, stdc_first_trailing_one_ui(0x000000080000000ull));
187#if defined(__LP64__)
188 EXPECT_EQ(64u, stdc_first_trailing_one_ul(0x8000000000000000ull));
189#else
190 EXPECT_EQ(32u, stdc_first_trailing_one_ul(0x000000080000000ull));
191#endif
192 EXPECT_EQ(64u, stdc_first_trailing_one_ull(0x8000000000000000ull));
193}
194
195TEST(stdbit, stdc_count_zeros) {
196 EXPECT_EQ(64u, stdc_count_zeros(0x0000000000000000ull));
197 EXPECT_EQ(56u, stdc_count_zeros(0xff00000000000000ull));
198 EXPECT_EQ(48u, stdc_count_zeros(0xffff000000000000ull));
199 EXPECT_EQ(32u, stdc_count_zeros(0xffffffff00000000ull));
200 EXPECT_EQ(0u, stdc_count_zeros(0xffffffffffffffffull));
201}
202
203TEST(stdbit, stdc_count_zeros_forwarding) {
204 EXPECT_EQ(8u, stdc_count_zeros_uc(0x0000000000000000ull));
205 EXPECT_EQ(16u, stdc_count_zeros_us(0x0000000000000000ull));
206 EXPECT_EQ(32u, stdc_count_zeros_ui(0x0000000000000000ull));
207 EXPECT_EQ(kLongBit, stdc_count_zeros_ul(0x0000000000000000ull));
208 EXPECT_EQ(64u, stdc_count_zeros_ull(0x0000000000000000ull));
209}
210
211TEST(stdbit, stdc_count_ones) {
212 EXPECT_EQ(0u, stdc_count_ones(0x0000000000000000ull));
213 EXPECT_EQ(8u, stdc_count_ones(0xff00000000000000ull));
214 EXPECT_EQ(16u, stdc_count_ones(0xffff000000000000ull));
215 EXPECT_EQ(32u, stdc_count_ones(0xffffffff00000000ull));
216 EXPECT_EQ(64u, stdc_count_ones(0xffffffffffffffffull));
217}
218
219TEST(stdbit, stdc_count_ones_forwarding) {
220 EXPECT_EQ(8u, stdc_count_ones_uc(0xffffffffffffffffull));
221 EXPECT_EQ(16u, stdc_count_ones_us(0xffffffffffffffffull));
222 EXPECT_EQ(32u, stdc_count_ones_ui(0xffffffffffffffffull));
223 EXPECT_EQ(kLongBit, stdc_count_ones_ul(0xffffffffffffffffull));
224 EXPECT_EQ(64u, stdc_count_ones_ull(0xffffffffffffffffull));
225}
226
227TEST(stdbit, stdc_has_single_bit) {
228 EXPECT_EQ(false, stdc_has_single_bit(0x0000000000000000ull));
229 EXPECT_EQ(false, stdc_has_single_bit(0x0000000000000003ull));
230 EXPECT_EQ(false, stdc_has_single_bit(0x1000000000000001ull));
231 EXPECT_EQ(false, stdc_has_single_bit(0xffffffffffffffffull));
232
233 EXPECT_EQ(true, stdc_has_single_bit(0x0000000000000001ull));
234 EXPECT_EQ(true, stdc_has_single_bit(0x0000000000008000ull));
235 EXPECT_EQ(true, stdc_has_single_bit(0x0000000080000000ull));
236 EXPECT_EQ(true, stdc_has_single_bit(0x8000000000000000ull));
237}
238
239TEST(stdbit, stdc_has_single_bit_forwarding) {
240 EXPECT_EQ(true, stdc_has_single_bit_uc(0x8000000080008080ull));
241 EXPECT_EQ(true, stdc_has_single_bit_us(0x8000000080008000ull));
242 EXPECT_EQ(true, stdc_has_single_bit_ui(0x8000000080000000ull));
243#if defined(__LP64__)
244 EXPECT_EQ(true, stdc_has_single_bit_ul(0x8000000000000000ull));
245#else
246 EXPECT_EQ(true, stdc_has_single_bit_ul(0x8000000080000000ull));
247#endif
248 EXPECT_EQ(true, stdc_has_single_bit_ull(0x8000000000000000ull));
249}
250
251TEST(stdbit, stdc_bit_width) {
252 EXPECT_EQ(0u, stdc_bit_width(0x0000000000000000ull));
253 EXPECT_EQ(8u, stdc_bit_width(0x0000000000000080ull));
254 EXPECT_EQ(16u, stdc_bit_width(0x0000000000008000ull));
255 EXPECT_EQ(32u, stdc_bit_width(0x0000000080000000ull));
256 EXPECT_EQ(64u, stdc_bit_width(0x8000000000000000ull));
257 EXPECT_EQ(64u, stdc_bit_width(0xffffffffffffffffull));
258}
259
260TEST(stdbit, stdc_bit_width_forwarding) {
261 EXPECT_EQ(8u, stdc_bit_width_uc(0xffffffffffffffffull));
262 EXPECT_EQ(16u, stdc_bit_width_us(0xffffffffffffffffull));
263 EXPECT_EQ(32u, stdc_bit_width_ui(0xffffffffffffffffull));
264 EXPECT_EQ(kLongBit, stdc_bit_width_ul(0xffffffffffffffffull));
265 EXPECT_EQ(64u, stdc_bit_width_ull(0xffffffffffffffffull));
266}
267
268TEST(stdbit, stdc_bit_floor) {
269 EXPECT_EQ(0x0000000000000000ull, stdc_bit_floor(0x0000000000000000ull));
270
271 EXPECT_EQ(0x0000000000000040ull, stdc_bit_floor(0x000000000000007full));
272 EXPECT_EQ(0x0000000000000080ull, stdc_bit_floor(0x0000000000000080ull));
273 EXPECT_EQ(0x0000000000000100ull, stdc_bit_floor(0x0000000000000100ull));
274 EXPECT_EQ(0x0000000000004000ull, stdc_bit_floor(0x0000000000007fffull));
275 EXPECT_EQ(0x0000000000008000ull, stdc_bit_floor(0x0000000000008000ull));
276 EXPECT_EQ(0x0000000000010000ull, stdc_bit_floor(0x0000000000010000ull));
277 EXPECT_EQ(0x0000000040000000ull, stdc_bit_floor(0x000000007fffffffull));
278 EXPECT_EQ(0x0000000080000000ull, stdc_bit_floor(0x0000000080000000ull));
279 EXPECT_EQ(0x0000000100000000ull, stdc_bit_floor(0x0000000100000000ull));
280 EXPECT_EQ(0x4000000000000000ull, stdc_bit_floor(0x7fffffffffffffffull));
281 EXPECT_EQ(0x8000000000000000ull, stdc_bit_floor(0x8000000000000000ull));
282
283 EXPECT_EQ(0x8000000000000000ull, stdc_bit_floor(0xffffffffffffffffull));
284}
285
286TEST(stdbit, stdc_bit_floor_forwarding) {
287 EXPECT_EQ(0x0000000000000080ull, stdc_bit_floor_uc(0x8000000080008080ull));
288 EXPECT_EQ(0x0000000000008000ull, stdc_bit_floor_us(0x8000000080008080ull));
289 EXPECT_EQ(0x0000000080000000ull, stdc_bit_floor_ui(0x8000000080008080ull));
290#if defined(__LP64__)
Elliott Hughes5e395b82025-07-28 09:50:38 -0700291 EXPECT_EQ(0x8000000000000000ull, stdc_bit_floor_ul(0x8000000080008080ull));
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700292#else
Elliott Hughes5e395b82025-07-28 09:50:38 -0700293 EXPECT_EQ(0x0000000080000000ull, stdc_bit_floor_ul(0x8000000080008080ull));
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700294#endif
295 EXPECT_EQ(0x8000000000000000ull, stdc_bit_floor_ull(0x8000000080008080ull));
296}
297
298TEST(stdbit, stdc_bit_ceil) {
299 EXPECT_EQ(0x0000000000000001ull, stdc_bit_ceil(0x0000000000000000ull));
300
301 EXPECT_EQ(0x0000000000000080ull, stdc_bit_ceil(0x000000000000007full));
302 EXPECT_EQ(0x0000000000000080ull, stdc_bit_ceil(0x0000000000000080ull));
303 EXPECT_EQ(0x0000000000000100ull, stdc_bit_ceil(0x0000000000000100ull));
304 EXPECT_EQ(0x0000000000008000ull, stdc_bit_ceil(0x0000000000007fffull));
305 EXPECT_EQ(0x0000000000008000ull, stdc_bit_ceil(0x0000000000008000ull));
306 EXPECT_EQ(0x0000000000010000ull, stdc_bit_ceil(0x0000000000010000ull));
307 EXPECT_EQ(0x0000000080000000ull, stdc_bit_ceil(0x000000007fffffffull));
308 EXPECT_EQ(0x0000000080000000ull, stdc_bit_ceil(0x0000000080000000ull));
309 EXPECT_EQ(0x0000000100000000ull, stdc_bit_ceil(0x0000000100000000ull));
310 EXPECT_EQ(0x8000000000000000ull, stdc_bit_ceil(0x7fffffffffffffffull));
311 EXPECT_EQ(0x8000000000000000ull, stdc_bit_ceil(0x8000000000000000ull));
312
313 EXPECT_EQ(0x0000000000000000ull, stdc_bit_ceil(0xffffffffffffffffull));
314}
315
316TEST(stdbit, stdc_bit_ceil_forwarding) {
317 EXPECT_EQ(0x0000000000000080ull, stdc_bit_ceil_uc(0x800000008000807full));
318 EXPECT_EQ(0x0000000000008000ull, stdc_bit_ceil_us(0x8000000080007fffull));
319 EXPECT_EQ(0x0000000080000000ull, stdc_bit_ceil_ui(0x800000007fffffffull));
320#if defined(__LP64__)
Elliott Hughes5e395b82025-07-28 09:50:38 -0700321 EXPECT_EQ(0x8000000000000000ull, stdc_bit_ceil_ul(0x7fffffffffffffffull));
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700322#else
Elliott Hughes5e395b82025-07-28 09:50:38 -0700323 EXPECT_EQ(0x0000000080000000ull, stdc_bit_ceil_ul(0x800000007fffffffull));
Elliott Hughes5e70fe52025-07-22 09:19:37 -0700324#endif
325 EXPECT_EQ(0x8000000000000000ull, stdc_bit_ceil_ull(0x7fffffffffffffffull));
326}
327
328TEST(stdbit, no_double_evaluation) {
329 ull x;
330
331 x = 0;
332 stdc_leading_zeros(x++);
333 EXPECT_EQ(x, 1u);
334
335 x = 0;
336 stdc_leading_ones(x++);
337 EXPECT_EQ(x, 1u);
338
339 x = 0;
340 stdc_trailing_zeros(x++);
341 EXPECT_EQ(x, 1u);
342
343 x = 0;
344 stdc_trailing_ones(x++);
345 EXPECT_EQ(x, 1u);
346
347 x = 0;
348 stdc_first_leading_zero(x++);
349 EXPECT_EQ(x, 1u);
350
351 x = 0;
352 stdc_first_leading_one(x++);
353 EXPECT_EQ(x, 1u);
354
355 x = 0;
356 stdc_first_trailing_zero(x++);
357 EXPECT_EQ(x, 1u);
358
359 x = 0;
360 stdc_first_trailing_one(x++);
361 EXPECT_EQ(x, 1u);
362
363 x = 0;
364 stdc_count_zeros(x++);
365 EXPECT_EQ(x, 1u);
366
367 x = 0;
368 stdc_count_ones(x++);
369 EXPECT_EQ(x, 1u);
370
371 x = 0;
372 stdc_has_single_bit(x++);
373 EXPECT_EQ(x, 1u);
374
375 x = 0;
376 stdc_bit_width(x++);
377 EXPECT_EQ(x, 1u);
378
379 x = 0;
380 stdc_bit_floor(x++);
381 EXPECT_EQ(x, 1u);
382
383 x = 0;
384 stdc_bit_ceil(x++);
385 EXPECT_EQ(x, 1u);
386}
387
388#endif