summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2026-01-21 22:40:55 +0100
committerMitja Felicijan <mitja.felicijan@gmail.com>2026-01-21 22:40:55 +0100
commit5d8dfe892a2ea89f706ee140c3bdcfd89fe03fda (patch)
tree1acdfa5220cd13b7be43a2a01368e80d306473ca /examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c
parentc7ab12bba64d9c20ccd79b132dac475f7bc3923e (diff)
downloadcrep-5d8dfe892a2ea89f706ee140c3bdcfd89fe03fda.tar.gz
Add Redis source code for testing
Diffstat (limited to 'examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c')
-rw-r--r--examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c307
1 files changed, 307 insertions, 0 deletions
diff --git a/examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c b/examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c
new file mode 100644
index 0000000..7d31b21
--- /dev/null
+++ b/examples/redis-unstable/deps/jemalloc/test/unit/bit_util.c
@@ -0,0 +1,307 @@
1#include "test/jemalloc_test.h"
2
3#include "jemalloc/internal/bit_util.h"
4
5#define TEST_POW2_CEIL(t, suf, pri) do { \
6 unsigned i, pow2; \
7 t x; \
8 \
9 expect_##suf##_eq(pow2_ceil_##suf(0), 0, "Unexpected result"); \
10 \
11 for (i = 0; i < sizeof(t) * 8; i++) { \
12 expect_##suf##_eq(pow2_ceil_##suf(((t)1) << i), ((t)1) \
13 << i, "Unexpected result"); \
14 } \
15 \
16 for (i = 2; i < sizeof(t) * 8; i++) { \
17 expect_##suf##_eq(pow2_ceil_##suf((((t)1) << i) - 1), \
18 ((t)1) << i, "Unexpected result"); \
19 } \
20 \
21 for (i = 0; i < sizeof(t) * 8 - 1; i++) { \
22 expect_##suf##_eq(pow2_ceil_##suf((((t)1) << i) + 1), \
23 ((t)1) << (i+1), "Unexpected result"); \
24 } \
25 \
26 for (pow2 = 1; pow2 < 25; pow2++) { \
27 for (x = (((t)1) << (pow2-1)) + 1; x <= ((t)1) << pow2; \
28 x++) { \
29 expect_##suf##_eq(pow2_ceil_##suf(x), \
30 ((t)1) << pow2, \
31 "Unexpected result, x=%"pri, x); \
32 } \
33 } \
34} while (0)
35
36TEST_BEGIN(test_pow2_ceil_u64) {
37 TEST_POW2_CEIL(uint64_t, u64, FMTu64);
38}
39TEST_END
40
41TEST_BEGIN(test_pow2_ceil_u32) {
42 TEST_POW2_CEIL(uint32_t, u32, FMTu32);
43}
44TEST_END
45
46TEST_BEGIN(test_pow2_ceil_zu) {
47 TEST_POW2_CEIL(size_t, zu, "zu");
48}
49TEST_END
50
51void
52expect_lg_ceil_range(size_t input, unsigned answer) {
53 if (input == 1) {
54 expect_u_eq(0, answer, "Got %u as lg_ceil of 1", answer);
55 return;
56 }
57 expect_zu_le(input, (ZU(1) << answer),
58 "Got %u as lg_ceil of %zu", answer, input);
59 expect_zu_gt(input, (ZU(1) << (answer - 1)),
60 "Got %u as lg_ceil of %zu", answer, input);
61}
62
63void
64expect_lg_floor_range(size_t input, unsigned answer) {
65 if (input == 1) {
66 expect_u_eq(0, answer, "Got %u as lg_floor of 1", answer);
67 return;
68 }
69 expect_zu_ge(input, (ZU(1) << answer),
70 "Got %u as lg_floor of %zu", answer, input);
71 expect_zu_lt(input, (ZU(1) << (answer + 1)),
72 "Got %u as lg_floor of %zu", answer, input);
73}
74
75TEST_BEGIN(test_lg_ceil_floor) {
76 for (size_t i = 1; i < 10 * 1000 * 1000; i++) {
77 expect_lg_ceil_range(i, lg_ceil(i));
78 expect_lg_ceil_range(i, LG_CEIL(i));
79 expect_lg_floor_range(i, lg_floor(i));
80 expect_lg_floor_range(i, LG_FLOOR(i));
81 }
82 for (int i = 10; i < 8 * (1 << LG_SIZEOF_PTR) - 5; i++) {
83 for (size_t j = 0; j < (1 << 4); j++) {
84 size_t num1 = ((size_t)1 << i)
85 - j * ((size_t)1 << (i - 4));
86 size_t num2 = ((size_t)1 << i)
87 + j * ((size_t)1 << (i - 4));
88 expect_zu_ne(num1, 0, "Invalid lg argument");
89 expect_zu_ne(num2, 0, "Invalid lg argument");
90 expect_lg_ceil_range(num1, lg_ceil(num1));
91 expect_lg_ceil_range(num1, LG_CEIL(num1));
92 expect_lg_ceil_range(num2, lg_ceil(num2));
93 expect_lg_ceil_range(num2, LG_CEIL(num2));
94
95 expect_lg_floor_range(num1, lg_floor(num1));
96 expect_lg_floor_range(num1, LG_FLOOR(num1));
97 expect_lg_floor_range(num2, lg_floor(num2));
98 expect_lg_floor_range(num2, LG_FLOOR(num2));
99 }
100 }
101}
102TEST_END
103
104#define TEST_FFS(t, suf, test_suf, pri) do { \
105 for (unsigned i = 0; i < sizeof(t) * 8; i++) { \
106 for (unsigned j = 0; j <= i; j++) { \
107 for (unsigned k = 0; k <= j; k++) { \
108 t x = (t)1 << i; \
109 x |= (t)1 << j; \
110 x |= (t)1 << k; \
111 expect_##test_suf##_eq(ffs_##suf(x), k, \
112 "Unexpected result, x=%"pri, x); \
113 } \
114 } \
115 } \
116} while(0)
117
118TEST_BEGIN(test_ffs_u) {
119 TEST_FFS(unsigned, u, u,"u");
120}
121TEST_END
122
123TEST_BEGIN(test_ffs_lu) {
124 TEST_FFS(unsigned long, lu, lu, "lu");
125}
126TEST_END
127
128TEST_BEGIN(test_ffs_llu) {
129 TEST_FFS(unsigned long long, llu, qd, "llu");
130}
131TEST_END
132
133TEST_BEGIN(test_ffs_u32) {
134 TEST_FFS(uint32_t, u32, u32, FMTu32);
135}
136TEST_END
137
138TEST_BEGIN(test_ffs_u64) {
139 TEST_FFS(uint64_t, u64, u64, FMTu64);
140}
141TEST_END
142
143TEST_BEGIN(test_ffs_zu) {
144 TEST_FFS(size_t, zu, zu, "zu");
145}
146TEST_END
147
148#define TEST_FLS(t, suf, test_suf, pri) do { \
149 for (unsigned i = 0; i < sizeof(t) * 8; i++) { \
150 for (unsigned j = 0; j <= i; j++) { \
151 for (unsigned k = 0; k <= j; k++) { \
152 t x = (t)1 << i; \
153 x |= (t)1 << j; \
154 x |= (t)1 << k; \
155 expect_##test_suf##_eq(fls_##suf(x), i, \
156 "Unexpected result, x=%"pri, x); \
157 } \
158 } \
159 } \
160} while(0)
161
162TEST_BEGIN(test_fls_u) {
163 TEST_FLS(unsigned, u, u,"u");
164}
165TEST_END
166
167TEST_BEGIN(test_fls_lu) {
168 TEST_FLS(unsigned long, lu, lu, "lu");
169}
170TEST_END
171
172TEST_BEGIN(test_fls_llu) {
173 TEST_FLS(unsigned long long, llu, qd, "llu");
174}
175TEST_END
176
177TEST_BEGIN(test_fls_u32) {
178 TEST_FLS(uint32_t, u32, u32, FMTu32);
179}
180TEST_END
181
182TEST_BEGIN(test_fls_u64) {
183 TEST_FLS(uint64_t, u64, u64, FMTu64);
184}
185TEST_END
186
187TEST_BEGIN(test_fls_zu) {
188 TEST_FLS(size_t, zu, zu, "zu");
189}
190TEST_END
191
192TEST_BEGIN(test_fls_u_slow) {
193 TEST_FLS(unsigned, u_slow, u,"u");
194}
195TEST_END
196
197TEST_BEGIN(test_fls_lu_slow) {
198 TEST_FLS(unsigned long, lu_slow, lu, "lu");
199}
200TEST_END
201
202TEST_BEGIN(test_fls_llu_slow) {
203 TEST_FLS(unsigned long long, llu_slow, qd, "llu");
204}
205TEST_END
206
207static unsigned
208popcount_byte(unsigned byte) {
209 int count = 0;
210 for (int i = 0; i < 8; i++) {
211 if ((byte & (1 << i)) != 0) {
212 count++;
213 }
214 }
215 return count;
216}
217
218static uint64_t
219expand_byte_to_mask(unsigned byte) {
220 uint64_t result = 0;
221 for (int i = 0; i < 8; i++) {
222 if ((byte & (1 << i)) != 0) {
223 result |= ((uint64_t)0xFF << (i * 8));
224 }
225 }
226 return result;
227}
228
229#define TEST_POPCOUNT(t, suf, pri_hex) do { \
230 t bmul = (t)0x0101010101010101ULL; \
231 for (unsigned i = 0; i < (1 << sizeof(t)); i++) { \
232 for (unsigned j = 0; j < 256; j++) { \
233 /* \
234 * Replicate the byte j into various \
235 * bytes of the integer (as indicated by the \
236 * mask in i), and ensure that the popcount of \
237 * the result is popcount(i) * popcount(j) \
238 */ \
239 t mask = (t)expand_byte_to_mask(i); \
240 t x = (bmul * j) & mask; \
241 expect_u_eq( \
242 popcount_byte(i) * popcount_byte(j), \
243 popcount_##suf(x), \
244 "Unexpected result, x=0x%"pri_hex, x); \
245 } \
246 } \
247} while (0)
248
249TEST_BEGIN(test_popcount_u) {
250 TEST_POPCOUNT(unsigned, u, "x");
251}
252TEST_END
253
254TEST_BEGIN(test_popcount_u_slow) {
255 TEST_POPCOUNT(unsigned, u_slow, "x");
256}
257TEST_END
258
259TEST_BEGIN(test_popcount_lu) {
260 TEST_POPCOUNT(unsigned long, lu, "lx");
261}
262TEST_END
263
264TEST_BEGIN(test_popcount_lu_slow) {
265 TEST_POPCOUNT(unsigned long, lu_slow, "lx");
266}
267TEST_END
268
269TEST_BEGIN(test_popcount_llu) {
270 TEST_POPCOUNT(unsigned long long, llu, "llx");
271}
272TEST_END
273
274TEST_BEGIN(test_popcount_llu_slow) {
275 TEST_POPCOUNT(unsigned long long, llu_slow, "llx");
276}
277TEST_END
278
279int
280main(void) {
281 return test_no_reentrancy(
282 test_pow2_ceil_u64,
283 test_pow2_ceil_u32,
284 test_pow2_ceil_zu,
285 test_lg_ceil_floor,
286 test_ffs_u,
287 test_ffs_lu,
288 test_ffs_llu,
289 test_ffs_u32,
290 test_ffs_u64,
291 test_ffs_zu,
292 test_fls_u,
293 test_fls_lu,
294 test_fls_llu,
295 test_fls_u32,
296 test_fls_u64,
297 test_fls_zu,
298 test_fls_u_slow,
299 test_fls_lu_slow,
300 test_fls_llu_slow,
301 test_popcount_u,
302 test_popcount_u_slow,
303 test_popcount_lu,
304 test_popcount_lu_slow,
305 test_popcount_llu,
306 test_popcount_llu_slow);
307}