xref: /aosp_15_r20/external/jemalloc_new/test/unit/prng.c (revision 1208bc7e437ced7eb82efac44ba17e3beba411da)
1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker 
3*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_lg_range_u32(bool atomic)4*1208bc7eSAndroid Build Coastguard Worker test_prng_lg_range_u32(bool atomic) {
5*1208bc7eSAndroid Build Coastguard Worker 	atomic_u32_t sa, sb;
6*1208bc7eSAndroid Build Coastguard Worker 	uint32_t ra, rb;
7*1208bc7eSAndroid Build Coastguard Worker 	unsigned lg_range;
8*1208bc7eSAndroid Build Coastguard Worker 
9*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_u32(&sa, 42, ATOMIC_RELAXED);
10*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u32(&sa, 32, atomic);
11*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_u32(&sa, 42, ATOMIC_RELAXED);
12*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u32(&sa, 32, atomic);
13*1208bc7eSAndroid Build Coastguard Worker 	assert_u32_eq(ra, rb,
14*1208bc7eSAndroid Build Coastguard Worker 	    "Repeated generation should produce repeated results");
15*1208bc7eSAndroid Build Coastguard Worker 
16*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_u32(&sb, 42, ATOMIC_RELAXED);
17*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u32(&sb, 32, atomic);
18*1208bc7eSAndroid Build Coastguard Worker 	assert_u32_eq(ra, rb,
19*1208bc7eSAndroid Build Coastguard Worker 	    "Equivalent generation should produce equivalent results");
20*1208bc7eSAndroid Build Coastguard Worker 
21*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_u32(&sa, 42, ATOMIC_RELAXED);
22*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u32(&sa, 32, atomic);
23*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u32(&sa, 32, atomic);
24*1208bc7eSAndroid Build Coastguard Worker 	assert_u32_ne(ra, rb,
25*1208bc7eSAndroid Build Coastguard Worker 	    "Full-width results must not immediately repeat");
26*1208bc7eSAndroid Build Coastguard Worker 
27*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_u32(&sa, 42, ATOMIC_RELAXED);
28*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u32(&sa, 32, atomic);
29*1208bc7eSAndroid Build Coastguard Worker 	for (lg_range = 31; lg_range > 0; lg_range--) {
30*1208bc7eSAndroid Build Coastguard Worker 		atomic_store_u32(&sb, 42, ATOMIC_RELAXED);
31*1208bc7eSAndroid Build Coastguard Worker 		rb = prng_lg_range_u32(&sb, lg_range, atomic);
32*1208bc7eSAndroid Build Coastguard Worker 		assert_u32_eq((rb & (UINT32_C(0xffffffff) << lg_range)),
33*1208bc7eSAndroid Build Coastguard Worker 		    0, "High order bits should be 0, lg_range=%u", lg_range);
34*1208bc7eSAndroid Build Coastguard Worker 		assert_u32_eq(rb, (ra >> (32 - lg_range)),
35*1208bc7eSAndroid Build Coastguard Worker 		    "Expected high order bits of full-width result, "
36*1208bc7eSAndroid Build Coastguard Worker 		    "lg_range=%u", lg_range);
37*1208bc7eSAndroid Build Coastguard Worker 	}
38*1208bc7eSAndroid Build Coastguard Worker }
39*1208bc7eSAndroid Build Coastguard Worker 
40*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_lg_range_u64(void)41*1208bc7eSAndroid Build Coastguard Worker test_prng_lg_range_u64(void) {
42*1208bc7eSAndroid Build Coastguard Worker 	uint64_t sa, sb, ra, rb;
43*1208bc7eSAndroid Build Coastguard Worker 	unsigned lg_range;
44*1208bc7eSAndroid Build Coastguard Worker 
45*1208bc7eSAndroid Build Coastguard Worker 	sa = 42;
46*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u64(&sa, 64);
47*1208bc7eSAndroid Build Coastguard Worker 	sa = 42;
48*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u64(&sa, 64);
49*1208bc7eSAndroid Build Coastguard Worker 	assert_u64_eq(ra, rb,
50*1208bc7eSAndroid Build Coastguard Worker 	    "Repeated generation should produce repeated results");
51*1208bc7eSAndroid Build Coastguard Worker 
52*1208bc7eSAndroid Build Coastguard Worker 	sb = 42;
53*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u64(&sb, 64);
54*1208bc7eSAndroid Build Coastguard Worker 	assert_u64_eq(ra, rb,
55*1208bc7eSAndroid Build Coastguard Worker 	    "Equivalent generation should produce equivalent results");
56*1208bc7eSAndroid Build Coastguard Worker 
57*1208bc7eSAndroid Build Coastguard Worker 	sa = 42;
58*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u64(&sa, 64);
59*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_u64(&sa, 64);
60*1208bc7eSAndroid Build Coastguard Worker 	assert_u64_ne(ra, rb,
61*1208bc7eSAndroid Build Coastguard Worker 	    "Full-width results must not immediately repeat");
62*1208bc7eSAndroid Build Coastguard Worker 
63*1208bc7eSAndroid Build Coastguard Worker 	sa = 42;
64*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_u64(&sa, 64);
65*1208bc7eSAndroid Build Coastguard Worker 	for (lg_range = 63; lg_range > 0; lg_range--) {
66*1208bc7eSAndroid Build Coastguard Worker 		sb = 42;
67*1208bc7eSAndroid Build Coastguard Worker 		rb = prng_lg_range_u64(&sb, lg_range);
68*1208bc7eSAndroid Build Coastguard Worker 		assert_u64_eq((rb & (UINT64_C(0xffffffffffffffff) << lg_range)),
69*1208bc7eSAndroid Build Coastguard Worker 		    0, "High order bits should be 0, lg_range=%u", lg_range);
70*1208bc7eSAndroid Build Coastguard Worker 		assert_u64_eq(rb, (ra >> (64 - lg_range)),
71*1208bc7eSAndroid Build Coastguard Worker 		    "Expected high order bits of full-width result, "
72*1208bc7eSAndroid Build Coastguard Worker 		    "lg_range=%u", lg_range);
73*1208bc7eSAndroid Build Coastguard Worker 	}
74*1208bc7eSAndroid Build Coastguard Worker }
75*1208bc7eSAndroid Build Coastguard Worker 
76*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_lg_range_zu(bool atomic)77*1208bc7eSAndroid Build Coastguard Worker test_prng_lg_range_zu(bool atomic) {
78*1208bc7eSAndroid Build Coastguard Worker 	atomic_zu_t sa, sb;
79*1208bc7eSAndroid Build Coastguard Worker 	size_t ra, rb;
80*1208bc7eSAndroid Build Coastguard Worker 	unsigned lg_range;
81*1208bc7eSAndroid Build Coastguard Worker 
82*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_zu(&sa, 42, ATOMIC_RELAXED);
83*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
84*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_zu(&sa, 42, ATOMIC_RELAXED);
85*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
86*1208bc7eSAndroid Build Coastguard Worker 	assert_zu_eq(ra, rb,
87*1208bc7eSAndroid Build Coastguard Worker 	    "Repeated generation should produce repeated results");
88*1208bc7eSAndroid Build Coastguard Worker 
89*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_zu(&sb, 42, ATOMIC_RELAXED);
90*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_zu(&sb, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
91*1208bc7eSAndroid Build Coastguard Worker 	assert_zu_eq(ra, rb,
92*1208bc7eSAndroid Build Coastguard Worker 	    "Equivalent generation should produce equivalent results");
93*1208bc7eSAndroid Build Coastguard Worker 
94*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_zu(&sa, 42, ATOMIC_RELAXED);
95*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
96*1208bc7eSAndroid Build Coastguard Worker 	rb = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
97*1208bc7eSAndroid Build Coastguard Worker 	assert_zu_ne(ra, rb,
98*1208bc7eSAndroid Build Coastguard Worker 	    "Full-width results must not immediately repeat");
99*1208bc7eSAndroid Build Coastguard Worker 
100*1208bc7eSAndroid Build Coastguard Worker 	atomic_store_zu(&sa, 42, ATOMIC_RELAXED);
101*1208bc7eSAndroid Build Coastguard Worker 	ra = prng_lg_range_zu(&sa, ZU(1) << (3 + LG_SIZEOF_PTR), atomic);
102*1208bc7eSAndroid Build Coastguard Worker 	for (lg_range = (ZU(1) << (3 + LG_SIZEOF_PTR)) - 1; lg_range > 0;
103*1208bc7eSAndroid Build Coastguard Worker 	    lg_range--) {
104*1208bc7eSAndroid Build Coastguard Worker 		atomic_store_zu(&sb, 42, ATOMIC_RELAXED);
105*1208bc7eSAndroid Build Coastguard Worker 		rb = prng_lg_range_zu(&sb, lg_range, atomic);
106*1208bc7eSAndroid Build Coastguard Worker 		assert_zu_eq((rb & (SIZE_T_MAX << lg_range)),
107*1208bc7eSAndroid Build Coastguard Worker 		    0, "High order bits should be 0, lg_range=%u", lg_range);
108*1208bc7eSAndroid Build Coastguard Worker 		assert_zu_eq(rb, (ra >> ((ZU(1) << (3 + LG_SIZEOF_PTR)) -
109*1208bc7eSAndroid Build Coastguard Worker 		    lg_range)), "Expected high order bits of full-width "
110*1208bc7eSAndroid Build Coastguard Worker 		    "result, lg_range=%u", lg_range);
111*1208bc7eSAndroid Build Coastguard Worker 	}
112*1208bc7eSAndroid Build Coastguard Worker }
113*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_lg_range_u32_nonatomic)114*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_lg_range_u32_nonatomic) {
115*1208bc7eSAndroid Build Coastguard Worker 	test_prng_lg_range_u32(false);
116*1208bc7eSAndroid Build Coastguard Worker }
117*1208bc7eSAndroid Build Coastguard Worker TEST_END
118*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_lg_range_u32_atomic)119*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_lg_range_u32_atomic) {
120*1208bc7eSAndroid Build Coastguard Worker 	test_prng_lg_range_u32(true);
121*1208bc7eSAndroid Build Coastguard Worker }
122*1208bc7eSAndroid Build Coastguard Worker TEST_END
123*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_lg_range_u64_nonatomic)124*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_lg_range_u64_nonatomic) {
125*1208bc7eSAndroid Build Coastguard Worker 	test_prng_lg_range_u64();
126*1208bc7eSAndroid Build Coastguard Worker }
127*1208bc7eSAndroid Build Coastguard Worker TEST_END
128*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_lg_range_zu_nonatomic)129*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_lg_range_zu_nonatomic) {
130*1208bc7eSAndroid Build Coastguard Worker 	test_prng_lg_range_zu(false);
131*1208bc7eSAndroid Build Coastguard Worker }
132*1208bc7eSAndroid Build Coastguard Worker TEST_END
133*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_lg_range_zu_atomic)134*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_lg_range_zu_atomic) {
135*1208bc7eSAndroid Build Coastguard Worker 	test_prng_lg_range_zu(true);
136*1208bc7eSAndroid Build Coastguard Worker }
137*1208bc7eSAndroid Build Coastguard Worker TEST_END
138*1208bc7eSAndroid Build Coastguard Worker 
139*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_range_u32(bool atomic)140*1208bc7eSAndroid Build Coastguard Worker test_prng_range_u32(bool atomic) {
141*1208bc7eSAndroid Build Coastguard Worker 	uint32_t range;
142*1208bc7eSAndroid Build Coastguard Worker #define MAX_RANGE	10000000
143*1208bc7eSAndroid Build Coastguard Worker #define RANGE_STEP	97
144*1208bc7eSAndroid Build Coastguard Worker #define NREPS		10
145*1208bc7eSAndroid Build Coastguard Worker 
146*1208bc7eSAndroid Build Coastguard Worker 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
147*1208bc7eSAndroid Build Coastguard Worker 		atomic_u32_t s;
148*1208bc7eSAndroid Build Coastguard Worker 		unsigned rep;
149*1208bc7eSAndroid Build Coastguard Worker 
150*1208bc7eSAndroid Build Coastguard Worker 		atomic_store_u32(&s, range, ATOMIC_RELAXED);
151*1208bc7eSAndroid Build Coastguard Worker 		for (rep = 0; rep < NREPS; rep++) {
152*1208bc7eSAndroid Build Coastguard Worker 			uint32_t r = prng_range_u32(&s, range, atomic);
153*1208bc7eSAndroid Build Coastguard Worker 
154*1208bc7eSAndroid Build Coastguard Worker 			assert_u32_lt(r, range, "Out of range");
155*1208bc7eSAndroid Build Coastguard Worker 		}
156*1208bc7eSAndroid Build Coastguard Worker 	}
157*1208bc7eSAndroid Build Coastguard Worker }
158*1208bc7eSAndroid Build Coastguard Worker 
159*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_range_u64(void)160*1208bc7eSAndroid Build Coastguard Worker test_prng_range_u64(void) {
161*1208bc7eSAndroid Build Coastguard Worker 	uint64_t range;
162*1208bc7eSAndroid Build Coastguard Worker #define MAX_RANGE	10000000
163*1208bc7eSAndroid Build Coastguard Worker #define RANGE_STEP	97
164*1208bc7eSAndroid Build Coastguard Worker #define NREPS		10
165*1208bc7eSAndroid Build Coastguard Worker 
166*1208bc7eSAndroid Build Coastguard Worker 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
167*1208bc7eSAndroid Build Coastguard Worker 		uint64_t s;
168*1208bc7eSAndroid Build Coastguard Worker 		unsigned rep;
169*1208bc7eSAndroid Build Coastguard Worker 
170*1208bc7eSAndroid Build Coastguard Worker 		s = range;
171*1208bc7eSAndroid Build Coastguard Worker 		for (rep = 0; rep < NREPS; rep++) {
172*1208bc7eSAndroid Build Coastguard Worker 			uint64_t r = prng_range_u64(&s, range);
173*1208bc7eSAndroid Build Coastguard Worker 
174*1208bc7eSAndroid Build Coastguard Worker 			assert_u64_lt(r, range, "Out of range");
175*1208bc7eSAndroid Build Coastguard Worker 		}
176*1208bc7eSAndroid Build Coastguard Worker 	}
177*1208bc7eSAndroid Build Coastguard Worker }
178*1208bc7eSAndroid Build Coastguard Worker 
179*1208bc7eSAndroid Build Coastguard Worker static void
test_prng_range_zu(bool atomic)180*1208bc7eSAndroid Build Coastguard Worker test_prng_range_zu(bool atomic) {
181*1208bc7eSAndroid Build Coastguard Worker 	size_t range;
182*1208bc7eSAndroid Build Coastguard Worker #define MAX_RANGE	10000000
183*1208bc7eSAndroid Build Coastguard Worker #define RANGE_STEP	97
184*1208bc7eSAndroid Build Coastguard Worker #define NREPS		10
185*1208bc7eSAndroid Build Coastguard Worker 
186*1208bc7eSAndroid Build Coastguard Worker 	for (range = 2; range < MAX_RANGE; range += RANGE_STEP) {
187*1208bc7eSAndroid Build Coastguard Worker 		atomic_zu_t s;
188*1208bc7eSAndroid Build Coastguard Worker 		unsigned rep;
189*1208bc7eSAndroid Build Coastguard Worker 
190*1208bc7eSAndroid Build Coastguard Worker 		atomic_store_zu(&s, range, ATOMIC_RELAXED);
191*1208bc7eSAndroid Build Coastguard Worker 		for (rep = 0; rep < NREPS; rep++) {
192*1208bc7eSAndroid Build Coastguard Worker 			size_t r = prng_range_zu(&s, range, atomic);
193*1208bc7eSAndroid Build Coastguard Worker 
194*1208bc7eSAndroid Build Coastguard Worker 			assert_zu_lt(r, range, "Out of range");
195*1208bc7eSAndroid Build Coastguard Worker 		}
196*1208bc7eSAndroid Build Coastguard Worker 	}
197*1208bc7eSAndroid Build Coastguard Worker }
198*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_range_u32_nonatomic)199*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_range_u32_nonatomic) {
200*1208bc7eSAndroid Build Coastguard Worker 	test_prng_range_u32(false);
201*1208bc7eSAndroid Build Coastguard Worker }
202*1208bc7eSAndroid Build Coastguard Worker TEST_END
203*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_range_u32_atomic)204*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_range_u32_atomic) {
205*1208bc7eSAndroid Build Coastguard Worker 	test_prng_range_u32(true);
206*1208bc7eSAndroid Build Coastguard Worker }
207*1208bc7eSAndroid Build Coastguard Worker TEST_END
208*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_range_u64_nonatomic)209*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_range_u64_nonatomic) {
210*1208bc7eSAndroid Build Coastguard Worker 	test_prng_range_u64();
211*1208bc7eSAndroid Build Coastguard Worker }
212*1208bc7eSAndroid Build Coastguard Worker TEST_END
213*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_range_zu_nonatomic)214*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_range_zu_nonatomic) {
215*1208bc7eSAndroid Build Coastguard Worker 	test_prng_range_zu(false);
216*1208bc7eSAndroid Build Coastguard Worker }
217*1208bc7eSAndroid Build Coastguard Worker TEST_END
218*1208bc7eSAndroid Build Coastguard Worker 
TEST_BEGIN(test_prng_range_zu_atomic)219*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prng_range_zu_atomic) {
220*1208bc7eSAndroid Build Coastguard Worker 	test_prng_range_zu(true);
221*1208bc7eSAndroid Build Coastguard Worker }
222*1208bc7eSAndroid Build Coastguard Worker TEST_END
223*1208bc7eSAndroid Build Coastguard Worker 
224*1208bc7eSAndroid Build Coastguard Worker int
main(void)225*1208bc7eSAndroid Build Coastguard Worker main(void) {
226*1208bc7eSAndroid Build Coastguard Worker 	return test(
227*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_lg_range_u32_nonatomic,
228*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_lg_range_u32_atomic,
229*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_lg_range_u64_nonatomic,
230*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_lg_range_zu_nonatomic,
231*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_lg_range_zu_atomic,
232*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_range_u32_nonatomic,
233*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_range_u32_atomic,
234*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_range_u64_nonatomic,
235*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_range_zu_nonatomic,
236*1208bc7eSAndroid Build Coastguard Worker 	    test_prng_range_zu_atomic);
237*1208bc7eSAndroid Build Coastguard Worker }
238