xref: /netbsd-src/external/bsd/jemalloc/dist/test/unit/prng.c (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
1a0698ed9Schristos #include "test/jemalloc_test.h"
2a0698ed9Schristos 
3*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_u32) {
4*7bdf38e5Schristos 	uint32_t sa, sb;
5a0698ed9Schristos 	uint32_t ra, rb;
6a0698ed9Schristos 	unsigned lg_range;
7a0698ed9Schristos 
8*7bdf38e5Schristos 	sa = 42;
9*7bdf38e5Schristos 	ra = prng_lg_range_u32(&sa, 32);
10*7bdf38e5Schristos 	sa = 42;
11*7bdf38e5Schristos 	rb = prng_lg_range_u32(&sa, 32);
12*7bdf38e5Schristos 	expect_u32_eq(ra, rb,
13a0698ed9Schristos 	    "Repeated generation should produce repeated results");
14a0698ed9Schristos 
15*7bdf38e5Schristos 	sb = 42;
16*7bdf38e5Schristos 	rb = prng_lg_range_u32(&sb, 32);
17*7bdf38e5Schristos 	expect_u32_eq(ra, rb,
18a0698ed9Schristos 	    "Equivalent generation should produce equivalent results");
19a0698ed9Schristos 
20*7bdf38e5Schristos 	sa = 42;
21*7bdf38e5Schristos 	ra = prng_lg_range_u32(&sa, 32);
22*7bdf38e5Schristos 	rb = prng_lg_range_u32(&sa, 32);
23*7bdf38e5Schristos 	expect_u32_ne(ra, rb,
24a0698ed9Schristos 	    "Full-width results must not immediately repeat");
25a0698ed9Schristos 
26*7bdf38e5Schristos 	sa = 42;
27*7bdf38e5Schristos 	ra = prng_lg_range_u32(&sa, 32);
28a0698ed9Schristos 	for (lg_range = 31; lg_range > 0; lg_range--) {
29*7bdf38e5Schristos 		sb = 42;
30*7bdf38e5Schristos 		rb = prng_lg_range_u32(&sb, lg_range);
31*7bdf38e5Schristos 		expect_u32_eq((rb & (UINT32_C(0xffffffff) << lg_range)),
32a0698ed9Schristos 		    0, "High order bits should be 0, lg_range=%u", lg_range);
33*7bdf38e5Schristos 		expect_u32_eq(rb, (ra >> (32 - lg_range)),
34a0698ed9Schristos 		    "Expected high order bits of full-width result, "
35a0698ed9Schristos 		    "lg_range=%u", lg_range);
36a0698ed9Schristos 	}
37a0698ed9Schristos 
38*7bdf38e5Schristos }
39*7bdf38e5Schristos TEST_END
40*7bdf38e5Schristos 
41*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_u64) {
42a0698ed9Schristos 	uint64_t sa, sb, ra, rb;
43a0698ed9Schristos 	unsigned lg_range;
44a0698ed9Schristos 
45a0698ed9Schristos 	sa = 42;
46a0698ed9Schristos 	ra = prng_lg_range_u64(&sa, 64);
47a0698ed9Schristos 	sa = 42;
48a0698ed9Schristos 	rb = prng_lg_range_u64(&sa, 64);
49*7bdf38e5Schristos 	expect_u64_eq(ra, rb,
50a0698ed9Schristos 	    "Repeated generation should produce repeated results");
51a0698ed9Schristos 
52a0698ed9Schristos 	sb = 42;
53a0698ed9Schristos 	rb = prng_lg_range_u64(&sb, 64);
54*7bdf38e5Schristos 	expect_u64_eq(ra, rb,
55a0698ed9Schristos 	    "Equivalent generation should produce equivalent results");
56a0698ed9Schristos 
57a0698ed9Schristos 	sa = 42;
58a0698ed9Schristos 	ra = prng_lg_range_u64(&sa, 64);
59a0698ed9Schristos 	rb = prng_lg_range_u64(&sa, 64);
60*7bdf38e5Schristos 	expect_u64_ne(ra, rb,
61a0698ed9Schristos 	    "Full-width results must not immediately repeat");
62a0698ed9Schristos 
63a0698ed9Schristos 	sa = 42;
64a0698ed9Schristos 	ra = prng_lg_range_u64(&sa, 64);
65a0698ed9Schristos 	for (lg_range = 63; lg_range > 0; lg_range--) {
66a0698ed9Schristos 		sb = 42;
67a0698ed9Schristos 		rb = prng_lg_range_u64(&sb, lg_range);
68*7bdf38e5Schristos 		expect_u64_eq((rb & (UINT64_C(0xffffffffffffffff) << lg_range)),
69a0698ed9Schristos 		    0, "High order bits should be 0, lg_range=%u", lg_range);
70*7bdf38e5Schristos 		expect_u64_eq(rb, (ra >> (64 - lg_range)),
71a0698ed9Schristos 		    "Expected high order bits of full-width result, "
72a0698ed9Schristos 		    "lg_range=%u", lg_range);
73a0698ed9Schristos 	}
74a0698ed9Schristos }
75*7bdf38e5Schristos TEST_END
76a0698ed9Schristos 
77*7bdf38e5Schristos TEST_BEGIN(test_prng_lg_range_zu) {
78*7bdf38e5Schristos 	size_t sa, sb;
79a0698ed9Schristos 	size_t ra, rb;
80a0698ed9Schristos 	unsigned lg_range;
81a0698ed9Schristos 
82*7bdf38e5Schristos 	sa = 42;
83*7bdf38e5Schristos 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR));
84*7bdf38e5Schristos 	sa = 42;
85*7bdf38e5Schristos 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR));
86*7bdf38e5Schristos 	expect_zu_eq(ra, rb,
87a0698ed9Schristos 	    "Repeated generation should produce repeated results");
88a0698ed9Schristos 
89*7bdf38e5Schristos 	sb = 42;
90*7bdf38e5Schristos 	rb = prng_lg_range_zu(&sb, ZU(1) << (3 + LG_SIZEOF_PTR));
91*7bdf38e5Schristos 	expect_zu_eq(ra, rb,
92a0698ed9Schristos 	    "Equivalent generation should produce equivalent results");
93a0698ed9Schristos 
94*7bdf38e5Schristos 	sa = 42;
95*7bdf38e5Schristos 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR));
96*7bdf38e5Schristos 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR));
97*7bdf38e5Schristos 	expect_zu_ne(ra, rb,
98a0698ed9Schristos 	    "Full-width results must not immediately repeat");
99a0698ed9Schristos 
100*7bdf38e5Schristos 	sa = 42;
101*7bdf38e5Schristos 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR));
102a0698ed9Schristos 	for (lg_range = (ZU(1) << (3 + LG_SIZEOF_PTR)) - 1; lg_range > 0;
103a0698ed9Schristos 	    lg_range--) {
104*7bdf38e5Schristos 		sb = 42;
105*7bdf38e5Schristos 		rb = prng_lg_range_zu(&sb, lg_range);
106*7bdf38e5Schristos 		expect_zu_eq((rb & (SIZE_T_MAX << lg_range)),
107a0698ed9Schristos 		    0, "High order bits should be 0, lg_range=%u", lg_range);
108*7bdf38e5Schristos 		expect_zu_eq(rb, (ra >> ((ZU(1) << (3 + LG_SIZEOF_PTR)) -
109a0698ed9Schristos 		    lg_range)), "Expected high order bits of full-width "
110a0698ed9Schristos 		    "result, lg_range=%u", lg_range);
111a0698ed9Schristos 	}
112a0698ed9Schristos 
113a0698ed9Schristos }
114a0698ed9Schristos TEST_END
115a0698ed9Schristos 
116*7bdf38e5Schristos TEST_BEGIN(test_prng_range_u32) {
117a0698ed9Schristos 	uint32_t range;
118a0698ed9Schristos 
119*7bdf38e5Schristos 	const uint32_t max_range = 10000000;
120*7bdf38e5Schristos 	const uint32_t range_step = 97;
121*7bdf38e5Schristos 	const unsigned nreps = 10;
122*7bdf38e5Schristos 
123*7bdf38e5Schristos 	for (range = 2; range < max_range; range += range_step) {
124*7bdf38e5Schristos 		uint32_t s;
125a0698ed9Schristos 		unsigned rep;
126a0698ed9Schristos 
127*7bdf38e5Schristos 		s = range;
128*7bdf38e5Schristos 		for (rep = 0; rep < nreps; rep++) {
129*7bdf38e5Schristos 			uint32_t r = prng_range_u32(&s, range);
130a0698ed9Schristos 
131*7bdf38e5Schristos 			expect_u32_lt(r, range, "Out of range");
132a0698ed9Schristos 		}
133a0698ed9Schristos 	}
134a0698ed9Schristos }
135*7bdf38e5Schristos TEST_END
136a0698ed9Schristos 
137*7bdf38e5Schristos TEST_BEGIN(test_prng_range_u64) {
138a0698ed9Schristos 	uint64_t range;
139a0698ed9Schristos 
140*7bdf38e5Schristos 	const uint64_t max_range = 10000000;
141*7bdf38e5Schristos 	const uint64_t range_step = 97;
142*7bdf38e5Schristos 	const unsigned nreps = 10;
143*7bdf38e5Schristos 
144*7bdf38e5Schristos 	for (range = 2; range < max_range; range += range_step) {
145a0698ed9Schristos 		uint64_t s;
146a0698ed9Schristos 		unsigned rep;
147a0698ed9Schristos 
148a0698ed9Schristos 		s = range;
149*7bdf38e5Schristos 		for (rep = 0; rep < nreps; rep++) {
150a0698ed9Schristos 			uint64_t r = prng_range_u64(&s, range);
151a0698ed9Schristos 
152*7bdf38e5Schristos 			expect_u64_lt(r, range, "Out of range");
153a0698ed9Schristos 		}
154a0698ed9Schristos 	}
155a0698ed9Schristos }
156*7bdf38e5Schristos TEST_END
157a0698ed9Schristos 
158*7bdf38e5Schristos TEST_BEGIN(test_prng_range_zu) {
159a0698ed9Schristos 	size_t range;
160a0698ed9Schristos 
161*7bdf38e5Schristos 	const size_t max_range = 10000000;
162*7bdf38e5Schristos 	const size_t range_step = 97;
163*7bdf38e5Schristos 	const unsigned nreps = 10;
164*7bdf38e5Schristos 
165*7bdf38e5Schristos 
166*7bdf38e5Schristos 	for (range = 2; range < max_range; range += range_step) {
167*7bdf38e5Schristos 		size_t s;
168a0698ed9Schristos 		unsigned rep;
169a0698ed9Schristos 
170*7bdf38e5Schristos 		s = range;
171*7bdf38e5Schristos 		for (rep = 0; rep < nreps; rep++) {
172*7bdf38e5Schristos 			size_t r = prng_range_zu(&s, range);
173a0698ed9Schristos 
174*7bdf38e5Schristos 			expect_zu_lt(r, range, "Out of range");
175a0698ed9Schristos 		}
176a0698ed9Schristos 	}
177a0698ed9Schristos }
178a0698ed9Schristos TEST_END
179a0698ed9Schristos 
180a0698ed9Schristos int
181a0698ed9Schristos main(void) {
182*7bdf38e5Schristos 	return test_no_reentrancy(
183*7bdf38e5Schristos 	    test_prng_lg_range_u32,
184*7bdf38e5Schristos 	    test_prng_lg_range_u64,
185*7bdf38e5Schristos 	    test_prng_lg_range_zu,
186*7bdf38e5Schristos 	    test_prng_range_u32,
187*7bdf38e5Schristos 	    test_prng_range_u64,
188*7bdf38e5Schristos 	    test_prng_range_zu);
189a0698ed9Schristos }
190