1 /*
2  * PCG Random Number Generation for C.
3  *
4  * Copyright 2014-2019 Melissa O'Neill <oneill@pcg-random.org>,
5  *                     and the PCG Project contributors.
6  *
7  * SPDX-License-Identifier: (Apache-2.0 OR MIT)
8  *
9  * Licensed under the Apache License, Version 2.0 (provided in
10  * LICENSE-APACHE.txt and at http://www.apache.org/licenses/LICENSE-2.0)
11  * or under the MIT license (provided in LICENSE-MIT.txt and at
12  * http://opensource.org/licenses/MIT), at your option. This file may not
13  * be copied, modified, or distributed except according to those terms.
14  *
15  * Distributed on an "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, either
16  * express or implied.  See your chosen license for details.
17  *
18  * For additional information about the PCG random number generation scheme,
19  * visit http://www.pcg-random.org/.
20  */
21 
22 /*
23  * This code is derived from the canonical C++ PCG implementation, which
24  * has many additional features and is preferable if you can use C++ in
25  * your project.
26  *
27  * Much of the derivation was performed mechanically.  In particular, the
28  * output functions were generated by compiling the C++ output functions
29  * into LLVM bitcode and then transforming that using the LLVM C backend
30  * (from https://github.com/draperlaboratory/llvm-cbe), and then
31  * postprocessing and hand editing the output.
32  *
33  * Much of the remaining code was generated by C-preprocessor metaprogramming.
34  */
35 
36 #ifndef PCG_VARIANTS_H_INCLUDED
37 #define PCG_VARIANTS_H_INCLUDED 1
38 
39 #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__
40     typedef __uint128_t pcg128_t;
41     #define PCG_128BIT_CONSTANT(high,low) \
42             ((((pcg128_t)high) << 64) + low)
43     #define PCG_HAS_128BIT_OPS 1
44 #else
45     #define PCG_HAS_128BIT_OPS 0
46 #endif
47 
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51 
52 /*
53  * Rotate helper functions.
54  */
55 
pcg_rotr_8(uint8_t value,unsigned int rot)56 static inline uint8_t pcg_rotr_8(uint8_t value, unsigned int rot)
57 {
58 /* Unfortunately, clang is kinda pathetic when it comes to properly
59  * recognizing idiomatic rotate code, so for clang we actually provide
60  * assembler directives (enabled with PCG_USE_INLINE_ASM).  Boo, hiss.
61  */
62 #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__)  || defined(__i386__))
63     __asm__ ("rorb   %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
64     return value;
65 #else
66     return (value >> rot) | (value << ((- rot) & 7));
67 #endif
68 }
69 
pcg_rotr_16(uint16_t value,unsigned int rot)70 static inline uint16_t pcg_rotr_16(uint16_t value, unsigned int rot)
71 {
72 #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__)  || defined(__i386__))
73     __asm__ ("rorw   %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
74     return value;
75 #else
76     return (value >> rot) | (value << ((- rot) & 15));
77 #endif
78 }
79 
pcg_rotr_32(uint32_t value,unsigned int rot)80 static inline uint32_t pcg_rotr_32(uint32_t value, unsigned int rot)
81 {
82 #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__)  || defined(__i386__))
83     __asm__ ("rorl   %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
84     return value;
85 #else
86     return (value >> rot) | (value << ((- rot) & 31));
87 #endif
88 }
89 
pcg_rotr_64(uint64_t value,unsigned int rot)90 static inline uint64_t pcg_rotr_64(uint64_t value, unsigned int rot)
91 {
92 #if 0 && PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__)  || defined(__i386__))
93     /* For whatever reason, clang actually *does* generate rotq by
94        itself, so we don't need this code. */
95     __asm__ ("rorq   %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
96     return value;
97 #else
98     return (value >> rot) | (value << ((- rot) & 63));
99 #endif
100 }
101 
102 #if PCG_HAS_128BIT_OPS
pcg_rotr_128(pcg128_t value,unsigned int rot)103 static inline pcg128_t pcg_rotr_128(pcg128_t value, unsigned int rot)
104 {
105     return (value >> rot) | (value << ((- rot) & 127));
106 }
107 #endif
108 
109 /*
110  * Output functions.  These are the core of the PCG generation scheme.
111  */
112 
113 /* XSH RS */
114 
pcg_output_xsh_rs_16_8(uint16_t state)115 static inline uint8_t pcg_output_xsh_rs_16_8(uint16_t state)
116 {
117     return (uint8_t)(((state >> 7u) ^ state) >> ((state >> 14u) + 3u));
118 }
119 
pcg_output_xsh_rs_32_16(uint32_t state)120 static inline uint16_t pcg_output_xsh_rs_32_16(uint32_t state)
121 {
122     return (uint16_t)(((state >> 11u) ^ state) >> ((state >> 30u) + 11u));
123 }
124 
pcg_output_xsh_rs_64_32(uint64_t state)125 static inline uint32_t pcg_output_xsh_rs_64_32(uint64_t state)
126 {
127 
128     return (uint32_t)(((state >> 22u) ^ state) >> ((state >> 61u) + 22u));
129 }
130 
131 #if PCG_HAS_128BIT_OPS
pcg_output_xsh_rs_128_64(pcg128_t state)132 static inline uint64_t pcg_output_xsh_rs_128_64(pcg128_t state)
133 {
134     return (uint64_t)(((state >> 43u) ^ state) >> ((state >> 124u) + 45u));
135 }
136 #endif
137 
138 /* XSH RR */
139 
pcg_output_xsh_rr_16_8(uint16_t state)140 static inline uint8_t pcg_output_xsh_rr_16_8(uint16_t state)
141 {
142     return pcg_rotr_8(((state >> 5u) ^ state) >> 5u, state >> 13u);
143 }
144 
pcg_output_xsh_rr_32_16(uint32_t state)145 static inline uint16_t pcg_output_xsh_rr_32_16(uint32_t state)
146 {
147     return pcg_rotr_16(((state >> 10u) ^ state) >> 12u, state >> 28u);
148 }
149 
pcg_output_xsh_rr_64_32(uint64_t state)150 static inline uint32_t pcg_output_xsh_rr_64_32(uint64_t state)
151 {
152     return pcg_rotr_32(((state >> 18u) ^ state) >> 27u, state >> 59u);
153 }
154 
155 #if PCG_HAS_128BIT_OPS
pcg_output_xsh_rr_128_64(pcg128_t state)156 static inline uint64_t pcg_output_xsh_rr_128_64(pcg128_t state)
157 {
158     return pcg_rotr_64(((state >> 35u) ^ state) >> 58u, state >> 122u);
159 }
160 #endif
161 
162 /* RXS M XS */
163 
pcg_output_rxs_m_xs_8_8(uint8_t state)164 static inline uint8_t pcg_output_rxs_m_xs_8_8(uint8_t state)
165 {
166     uint8_t word = ((state >> ((state >> 6u) + 2u)) ^ state) * 217u;
167     return (word >> 6u) ^ word;
168 }
169 
pcg_output_rxs_m_xs_16_16(uint16_t state)170 static inline uint16_t pcg_output_rxs_m_xs_16_16(uint16_t state)
171 {
172     uint16_t word = ((state >> ((state >> 13u) + 3u)) ^ state) * 62169u;
173     return (word >> 11u) ^ word;
174 }
175 
pcg_output_rxs_m_xs_32_32(uint32_t state)176 static inline uint32_t pcg_output_rxs_m_xs_32_32(uint32_t state)
177 {
178     uint32_t word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
179     return (word >> 22u) ^ word;
180 }
181 
pcg_output_rxs_m_xs_64_64(uint64_t state)182 static inline uint64_t pcg_output_rxs_m_xs_64_64(uint64_t state)
183 {
184     uint64_t word = ((state >> ((state >> 59u) + 5u)) ^ state)
185                     * 12605985483714917081ull;
186     return (word >> 43u) ^ word;
187 }
188 
189 #if PCG_HAS_128BIT_OPS
pcg_output_rxs_m_xs_128_128(pcg128_t state)190 static inline pcg128_t pcg_output_rxs_m_xs_128_128(pcg128_t state)
191 {
192     pcg128_t word = ((state >> ((state >> 122u) + 6u)) ^ state)
193                        * (PCG_128BIT_CONSTANT(17766728186571221404ULL,
194                                               12605985483714917081ULL));
195     /* 327738287884841127335028083622016905945 */
196     return (word >> 86u) ^ word;
197 }
198 #endif
199 
200 /* RXS M */
201 
pcg_output_rxs_m_16_8(uint16_t state)202 static inline uint8_t pcg_output_rxs_m_16_8(uint16_t state)
203 {
204     return (((state >> ((state >> 13u) + 3u)) ^ state) * 62169u) >> 8u;
205 }
206 
pcg_output_rxs_m_32_16(uint32_t state)207 static inline uint16_t pcg_output_rxs_m_32_16(uint32_t state)
208 {
209     return (((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u) >> 16u;
210 }
211 
pcg_output_rxs_m_64_32(uint64_t state)212 static inline uint32_t pcg_output_rxs_m_64_32(uint64_t state)
213 {
214     return (((state >> ((state >> 59u) + 5u)) ^ state)
215                * 12605985483714917081ull) >> 32u;
216 }
217 
218 #if PCG_HAS_128BIT_OPS
pcg_output_rxs_m_128_64(pcg128_t state)219 static inline uint64_t pcg_output_rxs_m_128_64(pcg128_t state)
220 {
221     return (((state >> ((state >> 122u) + 6u)) ^ state)
222                * (PCG_128BIT_CONSTANT(17766728186571221404ULL,
223                                       12605985483714917081ULL))) >> 64u;
224     /* 327738287884841127335028083622016905945 */
225 }
226 #endif
227 
228 /* XSL RR (only defined for >= 64 bits) */
229 
pcg_output_xsl_rr_64_32(uint64_t state)230 static inline uint32_t pcg_output_xsl_rr_64_32(uint64_t state)
231 {
232     return pcg_rotr_32(((uint32_t)(state >> 32u)) ^ (uint32_t)state,
233                        state >> 59u);
234 }
235 
236 #if PCG_HAS_128BIT_OPS
pcg_output_xsl_rr_128_64(pcg128_t state)237 static inline uint64_t pcg_output_xsl_rr_128_64(pcg128_t state)
238 {
239     return pcg_rotr_64(((uint64_t)(state >> 64u)) ^ (uint64_t)state,
240                        state >> 122u);
241 }
242 #endif
243 
244 /* XSL RR RR (only defined for >= 64 bits) */
245 
pcg_output_xsl_rr_rr_64_64(uint64_t state)246 static inline uint64_t pcg_output_xsl_rr_rr_64_64(uint64_t state)
247 {
248     uint32_t rot1 = (uint32_t)(state >> 59u);
249     uint32_t high = (uint32_t)(state >> 32u);
250     uint32_t low  = (uint32_t)state;
251     uint32_t xored = high ^ low;
252     uint32_t newlow  = pcg_rotr_32(xored, rot1);
253     uint32_t newhigh = pcg_rotr_32(high, newlow & 31u);
254     return (((uint64_t)newhigh) << 32u) | newlow;
255 }
256 
257 #if PCG_HAS_128BIT_OPS
pcg_output_xsl_rr_rr_128_128(pcg128_t state)258 static inline pcg128_t pcg_output_xsl_rr_rr_128_128(pcg128_t state)
259 {
260     uint32_t rot1 = (uint32_t)(state >> 122u);
261     uint64_t high = (uint64_t)(state >> 64u);
262     uint64_t low  = (uint64_t)state;
263     uint64_t xored = high ^ low;
264     uint64_t newlow  = pcg_rotr_64(xored, rot1);
265     uint64_t newhigh = pcg_rotr_64(high, newlow & 63u);
266     return (((pcg128_t)newhigh) << 64u) | newlow;
267 }
268 #endif
269 
270 #define PCG_DEFAULT_MULTIPLIER_8   141U
271 #define PCG_DEFAULT_MULTIPLIER_16  12829U
272 #define PCG_DEFAULT_MULTIPLIER_32  747796405U
273 #define PCG_DEFAULT_MULTIPLIER_64  6364136223846793005ULL
274 
275 #define PCG_DEFAULT_INCREMENT_8    77U
276 #define PCG_DEFAULT_INCREMENT_16   47989U
277 #define PCG_DEFAULT_INCREMENT_32   2891336453U
278 #define PCG_DEFAULT_INCREMENT_64   1442695040888963407ULL
279 
280 #if PCG_HAS_128BIT_OPS
281 #define PCG_DEFAULT_MULTIPLIER_128 \
282         PCG_128BIT_CONSTANT(2549297995355413924ULL,4865540595714422341ULL)
283 #define PCG_DEFAULT_INCREMENT_128  \
284         PCG_128BIT_CONSTANT(6364136223846793005ULL,1442695040888963407ULL)
285 #endif
286 
287 /*
288  * Static initialization constants (if you can't call srandom for some
289  * bizarre reason).
290  */
291 
292 #define PCG_STATE_ONESEQ_8_INITIALIZER      { 0xd7U }
293 #define PCG_STATE_ONESEQ_16_INITIALIZER     { 0x20dfU }
294 #define PCG_STATE_ONESEQ_32_INITIALIZER     { 0x46b56677U }
295 #define PCG_STATE_ONESEQ_64_INITIALIZER     { 0x4d595df4d0f33173ULL }
296 #if PCG_HAS_128BIT_OPS
297 #define PCG_STATE_ONESEQ_128_INITIALIZER                                       \
298     { PCG_128BIT_CONSTANT(0xb8dc10e158a92392ULL, 0x98046df007ec0a53ULL) }
299 #endif
300 
301 #define PCG_STATE_UNIQUE_8_INITIALIZER      PCG_STATE_ONESEQ_8_INITIALIZER
302 #define PCG_STATE_UNIQUE_16_INITIALIZER     PCG_STATE_ONESEQ_16_INITIALIZER
303 #define PCG_STATE_UNIQUE_32_INITIALIZER     PCG_STATE_ONESEQ_32_INITIALIZER
304 #define PCG_STATE_UNIQUE_64_INITIALIZER     PCG_STATE_ONESEQ_64_INITIALIZER
305 #if PCG_HAS_128BIT_OPS
306 #define PCG_STATE_UNIQUE_128_INITIALIZER    PCG_STATE_ONESEQ_128_INITIALIZER
307 #endif
308 
309 #define PCG_STATE_MCG_8_INITIALIZER         { 0xe5U }
310 #define PCG_STATE_MCG_16_INITIALIZER        { 0xa5e5U }
311 #define PCG_STATE_MCG_32_INITIALIZER        { 0xd15ea5e5U }
312 #define PCG_STATE_MCG_64_INITIALIZER        { 0xcafef00dd15ea5e5ULL }
313 #if PCG_HAS_128BIT_OPS
314 #define PCG_STATE_MCG_128_INITIALIZER                                          \
315     { PCG_128BIT_CONSTANT(0x0000000000000000ULL, 0xcafef00dd15ea5e5ULL) }
316 #endif
317 
318 #define PCG_STATE_SETSEQ_8_INITIALIZER      { 0x9bU, 0xdbU }
319 #define PCG_STATE_SETSEQ_16_INITIALIZER     { 0xe39bU, 0x5bdbU }
320 #define PCG_STATE_SETSEQ_32_INITIALIZER     { 0xec02d89bU, 0x94b95bdbU }
321 #define PCG_STATE_SETSEQ_64_INITIALIZER                                        \
322     { 0x853c49e6748fea9bULL, 0xda3e39cb94b95bdbULL }
323 #if PCG_HAS_128BIT_OPS
324 #define PCG_STATE_SETSEQ_128_INITIALIZER                                       \
325     { PCG_128BIT_CONSTANT(0x979c9a98d8462005ULL, 0x7d3e9cb6cfe0549bULL),       \
326       PCG_128BIT_CONSTANT(0x0000000000000001ULL, 0xda3e39cb94b95bdbULL) }
327 #endif
328 
329 /* Representations for the oneseq, mcg, and unique variants */
330 
331 struct pcg_state_8 {
332     uint8_t state;
333 };
334 
335 struct pcg_state_16 {
336     uint16_t state;
337 };
338 
339 struct pcg_state_32 {
340     uint32_t state;
341 };
342 
343 struct pcg_state_64 {
344     uint64_t state;
345 };
346 
347 #if PCG_HAS_128BIT_OPS
348 struct pcg_state_128 {
349     pcg128_t state;
350 };
351 #endif
352 
353 /* Representations setseq variants */
354 
355 struct pcg_state_setseq_8 {
356     uint8_t state;
357     uint8_t inc;
358 };
359 
360 struct pcg_state_setseq_16 {
361     uint16_t state;
362     uint16_t inc;
363 };
364 
365 struct pcg_state_setseq_32 {
366     uint32_t state;
367     uint32_t inc;
368 };
369 
370 struct pcg_state_setseq_64 {
371     uint64_t state;
372     uint64_t inc;
373 };
374 
375 #if PCG_HAS_128BIT_OPS
376 struct pcg_state_setseq_128 {
377     pcg128_t state;
378     pcg128_t inc;
379 };
380 #endif
381 
382 /* Multi-step advance functions (jump-ahead, jump-back) */
383 
384 extern uint8_t pcg_advance_lcg_8(uint8_t state, uint8_t delta, uint8_t cur_mult,
385                                  uint8_t cur_plus);
386 extern uint16_t pcg_advance_lcg_16(uint16_t state, uint16_t delta,
387                                    uint16_t cur_mult, uint16_t cur_plus);
388 extern uint32_t pcg_advance_lcg_32(uint32_t state, uint32_t delta,
389                                    uint32_t cur_mult, uint32_t cur_plus);
390 extern uint64_t pcg_advance_lcg_64(uint64_t state, uint64_t delta,
391                                    uint64_t cur_mult, uint64_t cur_plus);
392 
393 #if PCG_HAS_128BIT_OPS
394 extern pcg128_t pcg_advance_lcg_128(pcg128_t state, pcg128_t delta,
395                                     pcg128_t cur_mult, pcg128_t cur_plus);
396 #endif
397 
398 /* Functions to advance the underlying LCG, one version for each size and
399  * each style.  These functions are considered semi-private.  There is rarely
400  * a good reason to call them directly.
401  */
402 
pcg_oneseq_8_step_r(struct pcg_state_8 * rng)403 static inline void pcg_oneseq_8_step_r(struct pcg_state_8* rng)
404 {
405     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8
406                  + PCG_DEFAULT_INCREMENT_8;
407 }
408 
pcg_oneseq_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)409 static inline void pcg_oneseq_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
410 {
411     rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
412                                    PCG_DEFAULT_INCREMENT_8);
413 }
414 
pcg_mcg_8_step_r(struct pcg_state_8 * rng)415 static inline void pcg_mcg_8_step_r(struct pcg_state_8* rng)
416 {
417     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8;
418 }
419 
pcg_mcg_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)420 static inline void pcg_mcg_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
421 {
422     rng->state
423         = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 0u);
424 }
425 
pcg_unique_8_step_r(struct pcg_state_8 * rng)426 static inline void pcg_unique_8_step_r(struct pcg_state_8* rng)
427 {
428     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8
429                  + (uint8_t)(((intptr_t)rng) | 1u);
430 }
431 
pcg_unique_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)432 static inline void pcg_unique_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
433 {
434     rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
435                                    (uint8_t)(((intptr_t)rng) | 1u));
436 }
437 
pcg_setseq_8_step_r(struct pcg_state_setseq_8 * rng)438 static inline void pcg_setseq_8_step_r(struct pcg_state_setseq_8* rng)
439 {
440     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8 + rng->inc;
441 }
442 
pcg_setseq_8_advance_r(struct pcg_state_setseq_8 * rng,uint8_t delta)443 static inline void pcg_setseq_8_advance_r(struct pcg_state_setseq_8* rng,
444                                    uint8_t delta)
445 {
446     rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
447                                    rng->inc);
448 }
449 
pcg_oneseq_16_step_r(struct pcg_state_16 * rng)450 static inline void pcg_oneseq_16_step_r(struct pcg_state_16* rng)
451 {
452     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16
453                  + PCG_DEFAULT_INCREMENT_16;
454 }
455 
pcg_oneseq_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)456 static inline void pcg_oneseq_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
457 {
458     rng->state = pcg_advance_lcg_16(
459         rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, PCG_DEFAULT_INCREMENT_16);
460 }
461 
pcg_mcg_16_step_r(struct pcg_state_16 * rng)462 static inline void pcg_mcg_16_step_r(struct pcg_state_16* rng)
463 {
464     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16;
465 }
466 
pcg_mcg_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)467 static inline void pcg_mcg_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
468 {
469     rng->state
470         = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, 0u);
471 }
472 
pcg_unique_16_step_r(struct pcg_state_16 * rng)473 static inline void pcg_unique_16_step_r(struct pcg_state_16* rng)
474 {
475     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16
476                  + (uint16_t)(((intptr_t)rng) | 1u);
477 }
478 
pcg_unique_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)479 static inline void pcg_unique_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
480 {
481     rng->state
482         = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16,
483                              (uint16_t)(((intptr_t)rng) | 1u));
484 }
485 
pcg_setseq_16_step_r(struct pcg_state_setseq_16 * rng)486 static inline void pcg_setseq_16_step_r(struct pcg_state_setseq_16* rng)
487 {
488     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16 + rng->inc;
489 }
490 
pcg_setseq_16_advance_r(struct pcg_state_setseq_16 * rng,uint16_t delta)491 static inline void pcg_setseq_16_advance_r(struct pcg_state_setseq_16* rng,
492                                     uint16_t delta)
493 {
494     rng->state = pcg_advance_lcg_16(rng->state, delta,
495                                     PCG_DEFAULT_MULTIPLIER_16, rng->inc);
496 }
497 
pcg_oneseq_32_step_r(struct pcg_state_32 * rng)498 static inline void pcg_oneseq_32_step_r(struct pcg_state_32* rng)
499 {
500     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32
501                  + PCG_DEFAULT_INCREMENT_32;
502 }
503 
pcg_oneseq_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)504 static inline void pcg_oneseq_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
505 {
506     rng->state = pcg_advance_lcg_32(
507         rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, PCG_DEFAULT_INCREMENT_32);
508 }
509 
pcg_mcg_32_step_r(struct pcg_state_32 * rng)510 static inline void pcg_mcg_32_step_r(struct pcg_state_32* rng)
511 {
512     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32;
513 }
514 
pcg_mcg_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)515 static inline void pcg_mcg_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
516 {
517     rng->state
518         = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, 0u);
519 }
520 
pcg_unique_32_step_r(struct pcg_state_32 * rng)521 static inline void pcg_unique_32_step_r(struct pcg_state_32* rng)
522 {
523     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32
524                  + (uint32_t)(((intptr_t)rng) | 1u);
525 }
526 
pcg_unique_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)527 static inline void pcg_unique_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
528 {
529     rng->state
530         = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32,
531                              (uint32_t)(((intptr_t)rng) | 1u));
532 }
533 
pcg_setseq_32_step_r(struct pcg_state_setseq_32 * rng)534 static inline void pcg_setseq_32_step_r(struct pcg_state_setseq_32* rng)
535 {
536     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32 + rng->inc;
537 }
538 
pcg_setseq_32_advance_r(struct pcg_state_setseq_32 * rng,uint32_t delta)539 static inline void pcg_setseq_32_advance_r(struct pcg_state_setseq_32* rng,
540                                     uint32_t delta)
541 {
542     rng->state = pcg_advance_lcg_32(rng->state, delta,
543                                     PCG_DEFAULT_MULTIPLIER_32, rng->inc);
544 }
545 
pcg_oneseq_64_step_r(struct pcg_state_64 * rng)546 static inline void pcg_oneseq_64_step_r(struct pcg_state_64* rng)
547 {
548     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64
549                  + PCG_DEFAULT_INCREMENT_64;
550 }
551 
pcg_oneseq_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)552 static inline void pcg_oneseq_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
553 {
554     rng->state = pcg_advance_lcg_64(
555         rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, PCG_DEFAULT_INCREMENT_64);
556 }
557 
pcg_mcg_64_step_r(struct pcg_state_64 * rng)558 static inline void pcg_mcg_64_step_r(struct pcg_state_64* rng)
559 {
560     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64;
561 }
562 
pcg_mcg_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)563 static inline void pcg_mcg_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
564 {
565     rng->state
566         = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, 0u);
567 }
568 
pcg_unique_64_step_r(struct pcg_state_64 * rng)569 static inline void pcg_unique_64_step_r(struct pcg_state_64* rng)
570 {
571     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64
572                  + (uint64_t)(((intptr_t)rng) | 1u);
573 }
574 
pcg_unique_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)575 static inline void pcg_unique_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
576 {
577     rng->state
578         = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64,
579                              (uint64_t)(((intptr_t)rng) | 1u));
580 }
581 
pcg_setseq_64_step_r(struct pcg_state_setseq_64 * rng)582 static inline void pcg_setseq_64_step_r(struct pcg_state_setseq_64* rng)
583 {
584     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64 + rng->inc;
585 }
586 
pcg_setseq_64_advance_r(struct pcg_state_setseq_64 * rng,uint64_t delta)587 static inline void pcg_setseq_64_advance_r(struct pcg_state_setseq_64* rng,
588                                     uint64_t delta)
589 {
590     rng->state = pcg_advance_lcg_64(rng->state, delta,
591                                     PCG_DEFAULT_MULTIPLIER_64, rng->inc);
592 }
593 
594 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_step_r(struct pcg_state_128 * rng)595 static inline void pcg_oneseq_128_step_r(struct pcg_state_128* rng)
596 {
597     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128
598                  + PCG_DEFAULT_INCREMENT_128;
599 }
600 #endif
601 
602 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)603 static inline void pcg_oneseq_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
604 {
605     rng->state
606         = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128,
607                               PCG_DEFAULT_INCREMENT_128);
608 }
609 #endif
610 
611 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_step_r(struct pcg_state_128 * rng)612 static inline void pcg_mcg_128_step_r(struct pcg_state_128* rng)
613 {
614     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128;
615 }
616 #endif
617 
618 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)619 static inline void pcg_mcg_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
620 {
621     rng->state = pcg_advance_lcg_128(rng->state, delta,
622                                      PCG_DEFAULT_MULTIPLIER_128, 0u);
623 }
624 #endif
625 
626 #if PCG_HAS_128BIT_OPS
pcg_unique_128_step_r(struct pcg_state_128 * rng)627 static inline void pcg_unique_128_step_r(struct pcg_state_128* rng)
628 {
629     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128
630                  + (pcg128_t)(((intptr_t)rng) | 1u);
631 }
632 #endif
633 
634 #if PCG_HAS_128BIT_OPS
pcg_unique_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)635 static inline void pcg_unique_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
636 {
637     rng->state
638         = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128,
639                               (pcg128_t)(((intptr_t)rng) | 1u));
640 }
641 #endif
642 
643 #if PCG_HAS_128BIT_OPS
pcg_setseq_128_step_r(struct pcg_state_setseq_128 * rng)644 static inline void pcg_setseq_128_step_r(struct pcg_state_setseq_128* rng)
645 {
646     rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128 + rng->inc;
647 }
648 #endif
649 
650 #if PCG_HAS_128BIT_OPS
pcg_setseq_128_advance_r(struct pcg_state_setseq_128 * rng,pcg128_t delta)651 static inline void pcg_setseq_128_advance_r(struct pcg_state_setseq_128* rng,
652                                      pcg128_t delta)
653 {
654     rng->state = pcg_advance_lcg_128(rng->state, delta,
655                                      PCG_DEFAULT_MULTIPLIER_128, rng->inc);
656 }
657 #endif
658 
659 /* Functions to seed the RNG state, one version for each size and each
660  * style.  Unlike the step functions, regular users can and should call
661  * these functions.
662  */
663 
pcg_oneseq_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)664 static inline void pcg_oneseq_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
665 {
666     rng->state = 0U;
667     pcg_oneseq_8_step_r(rng);
668     rng->state += initstate;
669     pcg_oneseq_8_step_r(rng);
670 }
671 
pcg_mcg_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)672 static inline void pcg_mcg_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
673 {
674     rng->state = initstate | 1u;
675 }
676 
pcg_unique_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)677 static inline void pcg_unique_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
678 {
679     rng->state = 0U;
680     pcg_unique_8_step_r(rng);
681     rng->state += initstate;
682     pcg_unique_8_step_r(rng);
683 }
684 
pcg_setseq_8_srandom_r(struct pcg_state_setseq_8 * rng,uint8_t initstate,uint8_t initseq)685 static inline void pcg_setseq_8_srandom_r(struct pcg_state_setseq_8* rng,
686                                    uint8_t initstate, uint8_t initseq)
687 {
688     rng->state = 0U;
689     rng->inc = (initseq << 1u) | 1u;
690     pcg_setseq_8_step_r(rng);
691     rng->state += initstate;
692     pcg_setseq_8_step_r(rng);
693 }
694 
pcg_oneseq_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)695 static inline void pcg_oneseq_16_srandom_r(struct pcg_state_16* rng,
696                                     uint16_t initstate)
697 {
698     rng->state = 0U;
699     pcg_oneseq_16_step_r(rng);
700     rng->state += initstate;
701     pcg_oneseq_16_step_r(rng);
702 }
703 
pcg_mcg_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)704 static inline void pcg_mcg_16_srandom_r(struct pcg_state_16* rng, uint16_t initstate)
705 {
706     rng->state = initstate | 1u;
707 }
708 
pcg_unique_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)709 static inline void pcg_unique_16_srandom_r(struct pcg_state_16* rng,
710                                     uint16_t initstate)
711 {
712     rng->state = 0U;
713     pcg_unique_16_step_r(rng);
714     rng->state += initstate;
715     pcg_unique_16_step_r(rng);
716 }
717 
pcg_setseq_16_srandom_r(struct pcg_state_setseq_16 * rng,uint16_t initstate,uint16_t initseq)718 static inline void pcg_setseq_16_srandom_r(struct pcg_state_setseq_16* rng,
719                                     uint16_t initstate, uint16_t initseq)
720 {
721     rng->state = 0U;
722     rng->inc = (initseq << 1u) | 1u;
723     pcg_setseq_16_step_r(rng);
724     rng->state += initstate;
725     pcg_setseq_16_step_r(rng);
726 }
727 
pcg_oneseq_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)728 static inline void pcg_oneseq_32_srandom_r(struct pcg_state_32* rng,
729                                     uint32_t initstate)
730 {
731     rng->state = 0U;
732     pcg_oneseq_32_step_r(rng);
733     rng->state += initstate;
734     pcg_oneseq_32_step_r(rng);
735 }
736 
pcg_mcg_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)737 static inline void pcg_mcg_32_srandom_r(struct pcg_state_32* rng, uint32_t initstate)
738 {
739     rng->state = initstate | 1u;
740 }
741 
pcg_unique_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)742 static inline void pcg_unique_32_srandom_r(struct pcg_state_32* rng,
743                                     uint32_t initstate)
744 {
745     rng->state = 0U;
746     pcg_unique_32_step_r(rng);
747     rng->state += initstate;
748     pcg_unique_32_step_r(rng);
749 }
750 
pcg_setseq_32_srandom_r(struct pcg_state_setseq_32 * rng,uint32_t initstate,uint32_t initseq)751 static inline void pcg_setseq_32_srandom_r(struct pcg_state_setseq_32* rng,
752                                     uint32_t initstate, uint32_t initseq)
753 {
754     rng->state = 0U;
755     rng->inc = (initseq << 1u) | 1u;
756     pcg_setseq_32_step_r(rng);
757     rng->state += initstate;
758     pcg_setseq_32_step_r(rng);
759 }
760 
pcg_oneseq_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)761 static inline void pcg_oneseq_64_srandom_r(struct pcg_state_64* rng,
762                                     uint64_t initstate)
763 {
764     rng->state = 0U;
765     pcg_oneseq_64_step_r(rng);
766     rng->state += initstate;
767     pcg_oneseq_64_step_r(rng);
768 }
769 
pcg_mcg_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)770 static inline void pcg_mcg_64_srandom_r(struct pcg_state_64* rng, uint64_t initstate)
771 {
772     rng->state = initstate | 1u;
773 }
774 
pcg_unique_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)775 static inline void pcg_unique_64_srandom_r(struct pcg_state_64* rng,
776                                     uint64_t initstate)
777 {
778     rng->state = 0U;
779     pcg_unique_64_step_r(rng);
780     rng->state += initstate;
781     pcg_unique_64_step_r(rng);
782 }
783 
pcg_setseq_64_srandom_r(struct pcg_state_setseq_64 * rng,uint64_t initstate,uint64_t initseq)784 static inline void pcg_setseq_64_srandom_r(struct pcg_state_setseq_64* rng,
785                                     uint64_t initstate, uint64_t initseq)
786 {
787     rng->state = 0U;
788     rng->inc = (initseq << 1u) | 1u;
789     pcg_setseq_64_step_r(rng);
790     rng->state += initstate;
791     pcg_setseq_64_step_r(rng);
792 }
793 
794 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)795 static inline void pcg_oneseq_128_srandom_r(struct pcg_state_128* rng,
796                                      pcg128_t initstate)
797 {
798     rng->state = 0U;
799     pcg_oneseq_128_step_r(rng);
800     rng->state += initstate;
801     pcg_oneseq_128_step_r(rng);
802 }
803 #endif
804 
805 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)806 static inline void pcg_mcg_128_srandom_r(struct pcg_state_128* rng, pcg128_t initstate)
807 {
808     rng->state = initstate | 1u;
809 }
810 #endif
811 
812 #if PCG_HAS_128BIT_OPS
pcg_unique_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)813 static inline void pcg_unique_128_srandom_r(struct pcg_state_128* rng,
814                                      pcg128_t initstate)
815 {
816     rng->state = 0U;
817     pcg_unique_128_step_r(rng);
818     rng->state += initstate;
819     pcg_unique_128_step_r(rng);
820 }
821 #endif
822 
823 #if PCG_HAS_128BIT_OPS
pcg_setseq_128_srandom_r(struct pcg_state_setseq_128 * rng,pcg128_t initstate,pcg128_t initseq)824 static inline void pcg_setseq_128_srandom_r(struct pcg_state_setseq_128* rng,
825                                      pcg128_t initstate, pcg128_t initseq)
826 {
827     rng->state = 0U;
828     rng->inc = (initseq << 1u) | 1u;
829     pcg_setseq_128_step_r(rng);
830     rng->state += initstate;
831     pcg_setseq_128_step_r(rng);
832 }
833 #endif
834 
835 /* Now, finally we create each of the individual generators. We provide
836  * a random_r function that provides a random number of the appropriate
837  * type (using the full range of the type) and a boundedrand_r version
838  * that provides
839  *
840  * Implementation notes for boundedrand_r:
841  *
842  *     To avoid bias, we need to make the range of the RNG a multiple of
843  *     bound, which we do by dropping output less than a threshold.
844  *     Let's consider a 32-bit case...  A naive scheme to calculate the
845  *     threshold would be to do
846  *
847  *         uint32_t threshold = 0x100000000ull % bound;
848  *
849  *     but 64-bit div/mod is slower than 32-bit div/mod (especially on
850  *     32-bit platforms).  In essence, we do
851  *
852  *         uint32_t threshold = (0x100000000ull-bound) % bound;
853  *
854  *     because this version will calculate the same modulus, but the LHS
855  *     value is less than 2^32.
856  *
857  *     (Note that using modulo is only wise for good RNGs, poorer RNGs
858  *     such as raw LCGs do better using a technique based on division.)
859  *     Empricical tests show that division is preferable to modulus for
860  *     reducting the range of an RNG.  It's faster, and sometimes it can
861  *     even be statistically prefereable.
862  */
863 
864 /* Generation functions for XSH RS */
865 
pcg_oneseq_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)866 static inline uint8_t pcg_oneseq_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
867 {
868     uint16_t oldstate = rng->state;
869     pcg_oneseq_16_step_r(rng);
870     return pcg_output_xsh_rs_16_8(oldstate);
871 }
872 
pcg_oneseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)873 static inline uint8_t pcg_oneseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
874                                                     uint8_t bound)
875 {
876     uint8_t threshold = ((uint8_t)(-bound)) % bound;
877     for (;;) {
878         uint8_t r = pcg_oneseq_16_xsh_rs_8_random_r(rng);
879         if (r >= threshold)
880             return r % bound;
881     }
882 }
883 
pcg_oneseq_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)884 static inline uint16_t pcg_oneseq_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
885 {
886     uint32_t oldstate = rng->state;
887     pcg_oneseq_32_step_r(rng);
888     return pcg_output_xsh_rs_32_16(oldstate);
889 }
890 
pcg_oneseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)891 static inline uint16_t pcg_oneseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
892                                                       uint16_t bound)
893 {
894     uint16_t threshold = ((uint16_t)(-bound)) % bound;
895     for (;;) {
896         uint16_t r = pcg_oneseq_32_xsh_rs_16_random_r(rng);
897         if (r >= threshold)
898             return r % bound;
899     }
900 }
901 
pcg_oneseq_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)902 static inline uint32_t pcg_oneseq_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
903 {
904     uint64_t oldstate = rng->state;
905     pcg_oneseq_64_step_r(rng);
906     return pcg_output_xsh_rs_64_32(oldstate);
907 }
908 
pcg_oneseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)909 static inline uint32_t pcg_oneseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
910                                                       uint32_t bound)
911 {
912     uint32_t threshold = -bound % bound;
913     for (;;) {
914         uint32_t r = pcg_oneseq_64_xsh_rs_32_random_r(rng);
915         if (r >= threshold)
916             return r % bound;
917     }
918 }
919 
920 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)921 static inline uint64_t pcg_oneseq_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
922 {
923     pcg_oneseq_128_step_r(rng);
924     return pcg_output_xsh_rs_128_64(rng->state);
925 }
926 #endif
927 
928 #if PCG_HAS_128BIT_OPS
929 static inline uint64_t
pcg_oneseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)930 pcg_oneseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
931                                        uint64_t bound)
932 {
933     uint64_t threshold = -bound % bound;
934     for (;;) {
935         uint64_t r = pcg_oneseq_128_xsh_rs_64_random_r(rng);
936         if (r >= threshold)
937             return r % bound;
938     }
939 }
940 #endif
941 
pcg_unique_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)942 static inline uint8_t pcg_unique_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
943 {
944     uint16_t oldstate = rng->state;
945     pcg_unique_16_step_r(rng);
946     return pcg_output_xsh_rs_16_8(oldstate);
947 }
948 
pcg_unique_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)949 static inline uint8_t pcg_unique_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
950                                                     uint8_t bound)
951 {
952     uint8_t threshold = ((uint8_t)(-bound)) % bound;
953     for (;;) {
954         uint8_t r = pcg_unique_16_xsh_rs_8_random_r(rng);
955         if (r >= threshold)
956             return r % bound;
957     }
958 }
959 
pcg_unique_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)960 static inline uint16_t pcg_unique_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
961 {
962     uint32_t oldstate = rng->state;
963     pcg_unique_32_step_r(rng);
964     return pcg_output_xsh_rs_32_16(oldstate);
965 }
966 
pcg_unique_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)967 static inline uint16_t pcg_unique_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
968                                                       uint16_t bound)
969 {
970     uint16_t threshold = ((uint16_t)(-bound)) % bound;
971     for (;;) {
972         uint16_t r = pcg_unique_32_xsh_rs_16_random_r(rng);
973         if (r >= threshold)
974             return r % bound;
975     }
976 }
977 
pcg_unique_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)978 static inline uint32_t pcg_unique_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
979 {
980     uint64_t oldstate = rng->state;
981     pcg_unique_64_step_r(rng);
982     return pcg_output_xsh_rs_64_32(oldstate);
983 }
984 
pcg_unique_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)985 static inline uint32_t pcg_unique_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
986                                                       uint32_t bound)
987 {
988     uint32_t threshold = -bound % bound;
989     for (;;) {
990         uint32_t r = pcg_unique_64_xsh_rs_32_random_r(rng);
991         if (r >= threshold)
992             return r % bound;
993     }
994 }
995 
996 #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)997 static inline uint64_t pcg_unique_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
998 {
999     pcg_unique_128_step_r(rng);
1000     return pcg_output_xsh_rs_128_64(rng->state);
1001 }
1002 #endif
1003 
1004 #if PCG_HAS_128BIT_OPS
1005 static inline uint64_t
pcg_unique_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1006 pcg_unique_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
1007                                        uint64_t bound)
1008 {
1009     uint64_t threshold = -bound % bound;
1010     for (;;) {
1011         uint64_t r = pcg_unique_128_xsh_rs_64_random_r(rng);
1012         if (r >= threshold)
1013             return r % bound;
1014     }
1015 }
1016 #endif
1017 
pcg_setseq_16_xsh_rs_8_random_r(struct pcg_state_setseq_16 * rng)1018 static inline uint8_t pcg_setseq_16_xsh_rs_8_random_r(struct pcg_state_setseq_16* rng)
1019 {
1020     uint16_t oldstate = rng->state;
1021     pcg_setseq_16_step_r(rng);
1022     return pcg_output_xsh_rs_16_8(oldstate);
1023 }
1024 
1025 static inline uint8_t
pcg_setseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)1026 pcg_setseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_setseq_16* rng,
1027                                      uint8_t bound)
1028 {
1029     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1030     for (;;) {
1031         uint8_t r = pcg_setseq_16_xsh_rs_8_random_r(rng);
1032         if (r >= threshold)
1033             return r % bound;
1034     }
1035 }
1036 
1037 static inline uint16_t
pcg_setseq_32_xsh_rs_16_random_r(struct pcg_state_setseq_32 * rng)1038 pcg_setseq_32_xsh_rs_16_random_r(struct pcg_state_setseq_32* rng)
1039 {
1040     uint32_t oldstate = rng->state;
1041     pcg_setseq_32_step_r(rng);
1042     return pcg_output_xsh_rs_32_16(oldstate);
1043 }
1044 
1045 static inline uint16_t
pcg_setseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)1046 pcg_setseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_setseq_32* rng,
1047                                       uint16_t bound)
1048 {
1049     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1050     for (;;) {
1051         uint16_t r = pcg_setseq_32_xsh_rs_16_random_r(rng);
1052         if (r >= threshold)
1053             return r % bound;
1054     }
1055 }
1056 
1057 static inline uint32_t
pcg_setseq_64_xsh_rs_32_random_r(struct pcg_state_setseq_64 * rng)1058 pcg_setseq_64_xsh_rs_32_random_r(struct pcg_state_setseq_64* rng)
1059 {
1060     uint64_t oldstate = rng->state;
1061     pcg_setseq_64_step_r(rng);
1062     return pcg_output_xsh_rs_64_32(oldstate);
1063 }
1064 
1065 static inline uint32_t
pcg_setseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)1066 pcg_setseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_setseq_64* rng,
1067                                       uint32_t bound)
1068 {
1069     uint32_t threshold = -bound % bound;
1070     for (;;) {
1071         uint32_t r = pcg_setseq_64_xsh_rs_32_random_r(rng);
1072         if (r >= threshold)
1073             return r % bound;
1074     }
1075 }
1076 
1077 #if PCG_HAS_128BIT_OPS
1078 static inline uint64_t
pcg_setseq_128_xsh_rs_64_random_r(struct pcg_state_setseq_128 * rng)1079 pcg_setseq_128_xsh_rs_64_random_r(struct pcg_state_setseq_128* rng)
1080 {
1081     pcg_setseq_128_step_r(rng);
1082     return pcg_output_xsh_rs_128_64(rng->state);
1083 }
1084 #endif
1085 
1086 #if PCG_HAS_128BIT_OPS
1087 static inline uint64_t
pcg_setseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)1088 pcg_setseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_setseq_128* rng,
1089                                        uint64_t bound)
1090 {
1091     uint64_t threshold = -bound % bound;
1092     for (;;) {
1093         uint64_t r = pcg_setseq_128_xsh_rs_64_random_r(rng);
1094         if (r >= threshold)
1095             return r % bound;
1096     }
1097 }
1098 #endif
1099 
pcg_mcg_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)1100 static inline uint8_t pcg_mcg_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
1101 {
1102     uint16_t oldstate = rng->state;
1103     pcg_mcg_16_step_r(rng);
1104     return pcg_output_xsh_rs_16_8(oldstate);
1105 }
1106 
pcg_mcg_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1107 static inline uint8_t pcg_mcg_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
1108                                                  uint8_t bound)
1109 {
1110     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1111     for (;;) {
1112         uint8_t r = pcg_mcg_16_xsh_rs_8_random_r(rng);
1113         if (r >= threshold)
1114             return r % bound;
1115     }
1116 }
1117 
pcg_mcg_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)1118 static inline uint16_t pcg_mcg_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
1119 {
1120     uint32_t oldstate = rng->state;
1121     pcg_mcg_32_step_r(rng);
1122     return pcg_output_xsh_rs_32_16(oldstate);
1123 }
1124 
pcg_mcg_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1125 static inline uint16_t pcg_mcg_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
1126                                                    uint16_t bound)
1127 {
1128     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1129     for (;;) {
1130         uint16_t r = pcg_mcg_32_xsh_rs_16_random_r(rng);
1131         if (r >= threshold)
1132             return r % bound;
1133     }
1134 }
1135 
pcg_mcg_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)1136 static inline uint32_t pcg_mcg_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
1137 {
1138     uint64_t oldstate = rng->state;
1139     pcg_mcg_64_step_r(rng);
1140     return pcg_output_xsh_rs_64_32(oldstate);
1141 }
1142 
pcg_mcg_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1143 static inline uint32_t pcg_mcg_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
1144                                                    uint32_t bound)
1145 {
1146     uint32_t threshold = -bound % bound;
1147     for (;;) {
1148         uint32_t r = pcg_mcg_64_xsh_rs_32_random_r(rng);
1149         if (r >= threshold)
1150             return r % bound;
1151     }
1152 }
1153 
1154 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)1155 static inline uint64_t pcg_mcg_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
1156 {
1157     pcg_mcg_128_step_r(rng);
1158     return pcg_output_xsh_rs_128_64(rng->state);
1159 }
1160 #endif
1161 
1162 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1163 static inline uint64_t pcg_mcg_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
1164                                                     uint64_t bound)
1165 {
1166     uint64_t threshold = -bound % bound;
1167     for (;;) {
1168         uint64_t r = pcg_mcg_128_xsh_rs_64_random_r(rng);
1169         if (r >= threshold)
1170             return r % bound;
1171     }
1172 }
1173 #endif
1174 
1175 /* Generation functions for XSH RR */
1176 
pcg_oneseq_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1177 static inline uint8_t pcg_oneseq_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
1178 {
1179     uint16_t oldstate = rng->state;
1180     pcg_oneseq_16_step_r(rng);
1181     return pcg_output_xsh_rr_16_8(oldstate);
1182 }
1183 
pcg_oneseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1184 static inline uint8_t pcg_oneseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
1185                                                     uint8_t bound)
1186 {
1187     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1188     for (;;) {
1189         uint8_t r = pcg_oneseq_16_xsh_rr_8_random_r(rng);
1190         if (r >= threshold)
1191             return r % bound;
1192     }
1193 }
1194 
pcg_oneseq_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1195 static inline uint16_t pcg_oneseq_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
1196 {
1197     uint32_t oldstate = rng->state;
1198     pcg_oneseq_32_step_r(rng);
1199     return pcg_output_xsh_rr_32_16(oldstate);
1200 }
1201 
pcg_oneseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1202 static inline uint16_t pcg_oneseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
1203                                                       uint16_t bound)
1204 {
1205     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1206     for (;;) {
1207         uint16_t r = pcg_oneseq_32_xsh_rr_16_random_r(rng);
1208         if (r >= threshold)
1209             return r % bound;
1210     }
1211 }
1212 
pcg_oneseq_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1213 static inline uint32_t pcg_oneseq_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
1214 {
1215     uint64_t oldstate = rng->state;
1216     pcg_oneseq_64_step_r(rng);
1217     return pcg_output_xsh_rr_64_32(oldstate);
1218 }
1219 
pcg_oneseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1220 static inline uint32_t pcg_oneseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
1221                                                       uint32_t bound)
1222 {
1223     uint32_t threshold = -bound % bound;
1224     for (;;) {
1225         uint32_t r = pcg_oneseq_64_xsh_rr_32_random_r(rng);
1226         if (r >= threshold)
1227             return r % bound;
1228     }
1229 }
1230 
1231 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1232 static inline uint64_t pcg_oneseq_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
1233 {
1234     pcg_oneseq_128_step_r(rng);
1235     return pcg_output_xsh_rr_128_64(rng->state);
1236 }
1237 #endif
1238 
1239 #if PCG_HAS_128BIT_OPS
1240 static inline uint64_t
pcg_oneseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1241 pcg_oneseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
1242                                        uint64_t bound)
1243 {
1244     uint64_t threshold = -bound % bound;
1245     for (;;) {
1246         uint64_t r = pcg_oneseq_128_xsh_rr_64_random_r(rng);
1247         if (r >= threshold)
1248             return r % bound;
1249     }
1250 }
1251 #endif
1252 
pcg_unique_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1253 static inline uint8_t pcg_unique_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
1254 {
1255     uint16_t oldstate = rng->state;
1256     pcg_unique_16_step_r(rng);
1257     return pcg_output_xsh_rr_16_8(oldstate);
1258 }
1259 
pcg_unique_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1260 static inline uint8_t pcg_unique_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
1261                                                     uint8_t bound)
1262 {
1263     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1264     for (;;) {
1265         uint8_t r = pcg_unique_16_xsh_rr_8_random_r(rng);
1266         if (r >= threshold)
1267             return r % bound;
1268     }
1269 }
1270 
pcg_unique_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1271 static inline uint16_t pcg_unique_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
1272 {
1273     uint32_t oldstate = rng->state;
1274     pcg_unique_32_step_r(rng);
1275     return pcg_output_xsh_rr_32_16(oldstate);
1276 }
1277 
pcg_unique_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1278 static inline uint16_t pcg_unique_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
1279                                                       uint16_t bound)
1280 {
1281     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1282     for (;;) {
1283         uint16_t r = pcg_unique_32_xsh_rr_16_random_r(rng);
1284         if (r >= threshold)
1285             return r % bound;
1286     }
1287 }
1288 
pcg_unique_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1289 static inline uint32_t pcg_unique_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
1290 {
1291     uint64_t oldstate = rng->state;
1292     pcg_unique_64_step_r(rng);
1293     return pcg_output_xsh_rr_64_32(oldstate);
1294 }
1295 
pcg_unique_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1296 static inline uint32_t pcg_unique_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
1297                                                       uint32_t bound)
1298 {
1299     uint32_t threshold = -bound % bound;
1300     for (;;) {
1301         uint32_t r = pcg_unique_64_xsh_rr_32_random_r(rng);
1302         if (r >= threshold)
1303             return r % bound;
1304     }
1305 }
1306 
1307 #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1308 static inline uint64_t pcg_unique_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
1309 {
1310     pcg_unique_128_step_r(rng);
1311     return pcg_output_xsh_rr_128_64(rng->state);
1312 }
1313 #endif
1314 
1315 #if PCG_HAS_128BIT_OPS
1316 static inline uint64_t
pcg_unique_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1317 pcg_unique_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
1318                                        uint64_t bound)
1319 {
1320     uint64_t threshold = -bound % bound;
1321     for (;;) {
1322         uint64_t r = pcg_unique_128_xsh_rr_64_random_r(rng);
1323         if (r >= threshold)
1324             return r % bound;
1325     }
1326 }
1327 #endif
1328 
pcg_setseq_16_xsh_rr_8_random_r(struct pcg_state_setseq_16 * rng)1329 static inline uint8_t pcg_setseq_16_xsh_rr_8_random_r(struct pcg_state_setseq_16* rng)
1330 {
1331     uint16_t oldstate = rng->state;
1332     pcg_setseq_16_step_r(rng);
1333     return pcg_output_xsh_rr_16_8(oldstate);
1334 }
1335 
1336 static inline uint8_t
pcg_setseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)1337 pcg_setseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_setseq_16* rng,
1338                                      uint8_t bound)
1339 {
1340     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1341     for (;;) {
1342         uint8_t r = pcg_setseq_16_xsh_rr_8_random_r(rng);
1343         if (r >= threshold)
1344             return r % bound;
1345     }
1346 }
1347 
1348 static inline uint16_t
pcg_setseq_32_xsh_rr_16_random_r(struct pcg_state_setseq_32 * rng)1349 pcg_setseq_32_xsh_rr_16_random_r(struct pcg_state_setseq_32* rng)
1350 {
1351     uint32_t oldstate = rng->state;
1352     pcg_setseq_32_step_r(rng);
1353     return pcg_output_xsh_rr_32_16(oldstate);
1354 }
1355 
1356 static inline uint16_t
pcg_setseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)1357 pcg_setseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_setseq_32* rng,
1358                                       uint16_t bound)
1359 {
1360     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1361     for (;;) {
1362         uint16_t r = pcg_setseq_32_xsh_rr_16_random_r(rng);
1363         if (r >= threshold)
1364             return r % bound;
1365     }
1366 }
1367 
1368 static inline uint32_t
pcg_setseq_64_xsh_rr_32_random_r(struct pcg_state_setseq_64 * rng)1369 pcg_setseq_64_xsh_rr_32_random_r(struct pcg_state_setseq_64* rng)
1370 {
1371     uint64_t oldstate = rng->state;
1372     pcg_setseq_64_step_r(rng);
1373     return pcg_output_xsh_rr_64_32(oldstate);
1374 }
1375 
1376 static inline uint32_t
pcg_setseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)1377 pcg_setseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng,
1378                                       uint32_t bound)
1379 {
1380     uint32_t threshold = -bound % bound;
1381     for (;;) {
1382         uint32_t r = pcg_setseq_64_xsh_rr_32_random_r(rng);
1383         if (r >= threshold)
1384             return r % bound;
1385     }
1386 }
1387 
1388 #if PCG_HAS_128BIT_OPS
1389 static inline uint64_t
pcg_setseq_128_xsh_rr_64_random_r(struct pcg_state_setseq_128 * rng)1390 pcg_setseq_128_xsh_rr_64_random_r(struct pcg_state_setseq_128* rng)
1391 {
1392     pcg_setseq_128_step_r(rng);
1393     return pcg_output_xsh_rr_128_64(rng->state);
1394 }
1395 #endif
1396 
1397 #if PCG_HAS_128BIT_OPS
1398 static inline uint64_t
pcg_setseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)1399 pcg_setseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng,
1400                                        uint64_t bound)
1401 {
1402     uint64_t threshold = -bound % bound;
1403     for (;;) {
1404         uint64_t r = pcg_setseq_128_xsh_rr_64_random_r(rng);
1405         if (r >= threshold)
1406             return r % bound;
1407     }
1408 }
1409 #endif
1410 
pcg_mcg_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1411 static inline uint8_t pcg_mcg_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
1412 {
1413     uint16_t oldstate = rng->state;
1414     pcg_mcg_16_step_r(rng);
1415     return pcg_output_xsh_rr_16_8(oldstate);
1416 }
1417 
pcg_mcg_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1418 static inline uint8_t pcg_mcg_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
1419                                                  uint8_t bound)
1420 {
1421     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1422     for (;;) {
1423         uint8_t r = pcg_mcg_16_xsh_rr_8_random_r(rng);
1424         if (r >= threshold)
1425             return r % bound;
1426     }
1427 }
1428 
pcg_mcg_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1429 static inline uint16_t pcg_mcg_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
1430 {
1431     uint32_t oldstate = rng->state;
1432     pcg_mcg_32_step_r(rng);
1433     return pcg_output_xsh_rr_32_16(oldstate);
1434 }
1435 
pcg_mcg_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1436 static inline uint16_t pcg_mcg_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
1437                                                    uint16_t bound)
1438 {
1439     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1440     for (;;) {
1441         uint16_t r = pcg_mcg_32_xsh_rr_16_random_r(rng);
1442         if (r >= threshold)
1443             return r % bound;
1444     }
1445 }
1446 
pcg_mcg_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1447 static inline uint32_t pcg_mcg_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
1448 {
1449     uint64_t oldstate = rng->state;
1450     pcg_mcg_64_step_r(rng);
1451     return pcg_output_xsh_rr_64_32(oldstate);
1452 }
1453 
pcg_mcg_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1454 static inline uint32_t pcg_mcg_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
1455                                                    uint32_t bound)
1456 {
1457     uint32_t threshold = -bound % bound;
1458     for (;;) {
1459         uint32_t r = pcg_mcg_64_xsh_rr_32_random_r(rng);
1460         if (r >= threshold)
1461             return r % bound;
1462     }
1463 }
1464 
1465 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1466 static inline uint64_t pcg_mcg_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
1467 {
1468     pcg_mcg_128_step_r(rng);
1469     return pcg_output_xsh_rr_128_64(rng->state);
1470 }
1471 #endif
1472 
1473 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1474 static inline uint64_t pcg_mcg_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
1475                                                     uint64_t bound)
1476 {
1477     uint64_t threshold = -bound % bound;
1478     for (;;) {
1479         uint64_t r = pcg_mcg_128_xsh_rr_64_random_r(rng);
1480         if (r >= threshold)
1481             return r % bound;
1482     }
1483 }
1484 #endif
1485 
1486 /* Generation functions for RXS M XS (no MCG versions because they
1487  * don't make sense when you want to use the entire state)
1488  */
1489 
pcg_oneseq_8_rxs_m_xs_8_random_r(struct pcg_state_8 * rng)1490 static inline uint8_t pcg_oneseq_8_rxs_m_xs_8_random_r(struct pcg_state_8* rng)
1491 {
1492     uint8_t oldstate = rng->state;
1493     pcg_oneseq_8_step_r(rng);
1494     return pcg_output_rxs_m_xs_8_8(oldstate);
1495 }
1496 
pcg_oneseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_8 * rng,uint8_t bound)1497 static inline uint8_t pcg_oneseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_8* rng,
1498                                                      uint8_t bound)
1499 {
1500     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1501     for (;;) {
1502         uint8_t r = pcg_oneseq_8_rxs_m_xs_8_random_r(rng);
1503         if (r >= threshold)
1504             return r % bound;
1505     }
1506 }
1507 
pcg_oneseq_16_rxs_m_xs_16_random_r(struct pcg_state_16 * rng)1508 static inline uint16_t pcg_oneseq_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng)
1509 {
1510     uint16_t oldstate = rng->state;
1511     pcg_oneseq_16_step_r(rng);
1512     return pcg_output_rxs_m_xs_16_16(oldstate);
1513 }
1514 
1515 static inline uint16_t
pcg_oneseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16 * rng,uint16_t bound)1516 pcg_oneseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng,
1517                                         uint16_t bound)
1518 {
1519     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1520     for (;;) {
1521         uint16_t r = pcg_oneseq_16_rxs_m_xs_16_random_r(rng);
1522         if (r >= threshold)
1523             return r % bound;
1524     }
1525 }
1526 
pcg_oneseq_32_rxs_m_xs_32_random_r(struct pcg_state_32 * rng)1527 static inline uint32_t pcg_oneseq_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng)
1528 {
1529     uint32_t oldstate = rng->state;
1530     pcg_oneseq_32_step_r(rng);
1531     return pcg_output_rxs_m_xs_32_32(oldstate);
1532 }
1533 
1534 static inline uint32_t
pcg_oneseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32 * rng,uint32_t bound)1535 pcg_oneseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng,
1536                                         uint32_t bound)
1537 {
1538     uint32_t threshold = -bound % bound;
1539     for (;;) {
1540         uint32_t r = pcg_oneseq_32_rxs_m_xs_32_random_r(rng);
1541         if (r >= threshold)
1542             return r % bound;
1543     }
1544 }
1545 
pcg_oneseq_64_rxs_m_xs_64_random_r(struct pcg_state_64 * rng)1546 static inline uint64_t pcg_oneseq_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng)
1547 {
1548     uint64_t oldstate = rng->state;
1549     pcg_oneseq_64_step_r(rng);
1550     return pcg_output_rxs_m_xs_64_64(oldstate);
1551 }
1552 
1553 static inline uint64_t
pcg_oneseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)1554 pcg_oneseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng,
1555                                         uint64_t bound)
1556 {
1557     uint64_t threshold = -bound % bound;
1558     for (;;) {
1559         uint64_t r = pcg_oneseq_64_rxs_m_xs_64_random_r(rng);
1560         if (r >= threshold)
1561             return r % bound;
1562     }
1563 }
1564 
1565 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_xs_128_random_r(struct pcg_state_128 * rng)1566 static inline pcg128_t pcg_oneseq_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng)
1567 {
1568     pcg_oneseq_128_step_r(rng);
1569     return pcg_output_rxs_m_xs_128_128(rng->state);
1570 }
1571 #endif
1572 
1573 #if PCG_HAS_128BIT_OPS
1574 static inline pcg128_t
pcg_oneseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)1575 pcg_oneseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng,
1576                                           pcg128_t bound)
1577 {
1578     pcg128_t threshold = -bound % bound;
1579     for (;;) {
1580         pcg128_t r = pcg_oneseq_128_rxs_m_xs_128_random_r(rng);
1581         if (r >= threshold)
1582             return r % bound;
1583     }
1584 }
1585 #endif
1586 
pcg_unique_16_rxs_m_xs_16_random_r(struct pcg_state_16 * rng)1587 static inline uint16_t pcg_unique_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng)
1588 {
1589     uint16_t oldstate = rng->state;
1590     pcg_unique_16_step_r(rng);
1591     return pcg_output_rxs_m_xs_16_16(oldstate);
1592 }
1593 
1594 static inline uint16_t
pcg_unique_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16 * rng,uint16_t bound)1595 pcg_unique_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng,
1596                                         uint16_t bound)
1597 {
1598     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1599     for (;;) {
1600         uint16_t r = pcg_unique_16_rxs_m_xs_16_random_r(rng);
1601         if (r >= threshold)
1602             return r % bound;
1603     }
1604 }
1605 
pcg_unique_32_rxs_m_xs_32_random_r(struct pcg_state_32 * rng)1606 static inline uint32_t pcg_unique_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng)
1607 {
1608     uint32_t oldstate = rng->state;
1609     pcg_unique_32_step_r(rng);
1610     return pcg_output_rxs_m_xs_32_32(oldstate);
1611 }
1612 
1613 static inline uint32_t
pcg_unique_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32 * rng,uint32_t bound)1614 pcg_unique_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng,
1615                                         uint32_t bound)
1616 {
1617     uint32_t threshold = -bound % bound;
1618     for (;;) {
1619         uint32_t r = pcg_unique_32_rxs_m_xs_32_random_r(rng);
1620         if (r >= threshold)
1621             return r % bound;
1622     }
1623 }
1624 
pcg_unique_64_rxs_m_xs_64_random_r(struct pcg_state_64 * rng)1625 static inline uint64_t pcg_unique_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng)
1626 {
1627     uint64_t oldstate = rng->state;
1628     pcg_unique_64_step_r(rng);
1629     return pcg_output_rxs_m_xs_64_64(oldstate);
1630 }
1631 
1632 static inline uint64_t
pcg_unique_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)1633 pcg_unique_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng,
1634                                         uint64_t bound)
1635 {
1636     uint64_t threshold = -bound % bound;
1637     for (;;) {
1638         uint64_t r = pcg_unique_64_rxs_m_xs_64_random_r(rng);
1639         if (r >= threshold)
1640             return r % bound;
1641     }
1642 }
1643 
1644 #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_xs_128_random_r(struct pcg_state_128 * rng)1645 static inline pcg128_t pcg_unique_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng)
1646 {
1647     pcg_unique_128_step_r(rng);
1648     return pcg_output_rxs_m_xs_128_128(rng->state);
1649 }
1650 #endif
1651 
1652 #if PCG_HAS_128BIT_OPS
1653 static inline pcg128_t
pcg_unique_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)1654 pcg_unique_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng,
1655                                           pcg128_t bound)
1656 {
1657     pcg128_t threshold = -bound % bound;
1658     for (;;) {
1659         pcg128_t r = pcg_unique_128_rxs_m_xs_128_random_r(rng);
1660         if (r >= threshold)
1661             return r % bound;
1662     }
1663 }
1664 #endif
1665 
pcg_setseq_8_rxs_m_xs_8_random_r(struct pcg_state_setseq_8 * rng)1666 static inline uint8_t pcg_setseq_8_rxs_m_xs_8_random_r(struct pcg_state_setseq_8* rng)
1667 {
1668     uint8_t oldstate = rng->state;
1669     pcg_setseq_8_step_r(rng);
1670     return pcg_output_rxs_m_xs_8_8(oldstate);
1671 }
1672 
1673 static inline uint8_t
pcg_setseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_setseq_8 * rng,uint8_t bound)1674 pcg_setseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_setseq_8* rng,
1675                                       uint8_t bound)
1676 {
1677     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1678     for (;;) {
1679         uint8_t r = pcg_setseq_8_rxs_m_xs_8_random_r(rng);
1680         if (r >= threshold)
1681             return r % bound;
1682     }
1683 }
1684 
1685 static inline uint16_t
pcg_setseq_16_rxs_m_xs_16_random_r(struct pcg_state_setseq_16 * rng)1686 pcg_setseq_16_rxs_m_xs_16_random_r(struct pcg_state_setseq_16* rng)
1687 {
1688     uint16_t oldstate = rng->state;
1689     pcg_setseq_16_step_r(rng);
1690     return pcg_output_rxs_m_xs_16_16(oldstate);
1691 }
1692 
1693 static inline uint16_t
pcg_setseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_setseq_16 * rng,uint16_t bound)1694 pcg_setseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_setseq_16* rng,
1695                                         uint16_t bound)
1696 {
1697     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1698     for (;;) {
1699         uint16_t r = pcg_setseq_16_rxs_m_xs_16_random_r(rng);
1700         if (r >= threshold)
1701             return r % bound;
1702     }
1703 }
1704 
1705 static inline uint32_t
pcg_setseq_32_rxs_m_xs_32_random_r(struct pcg_state_setseq_32 * rng)1706 pcg_setseq_32_rxs_m_xs_32_random_r(struct pcg_state_setseq_32* rng)
1707 {
1708     uint32_t oldstate = rng->state;
1709     pcg_setseq_32_step_r(rng);
1710     return pcg_output_rxs_m_xs_32_32(oldstate);
1711 }
1712 
1713 static inline uint32_t
pcg_setseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_setseq_32 * rng,uint32_t bound)1714 pcg_setseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_setseq_32* rng,
1715                                         uint32_t bound)
1716 {
1717     uint32_t threshold = -bound % bound;
1718     for (;;) {
1719         uint32_t r = pcg_setseq_32_rxs_m_xs_32_random_r(rng);
1720         if (r >= threshold)
1721             return r % bound;
1722     }
1723 }
1724 
1725 static inline uint64_t
pcg_setseq_64_rxs_m_xs_64_random_r(struct pcg_state_setseq_64 * rng)1726 pcg_setseq_64_rxs_m_xs_64_random_r(struct pcg_state_setseq_64* rng)
1727 {
1728     uint64_t oldstate = rng->state;
1729     pcg_setseq_64_step_r(rng);
1730     return pcg_output_rxs_m_xs_64_64(oldstate);
1731 }
1732 
1733 static inline uint64_t
pcg_setseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_setseq_64 * rng,uint64_t bound)1734 pcg_setseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_setseq_64* rng,
1735                                         uint64_t bound)
1736 {
1737     uint64_t threshold = -bound % bound;
1738     for (;;) {
1739         uint64_t r = pcg_setseq_64_rxs_m_xs_64_random_r(rng);
1740         if (r >= threshold)
1741             return r % bound;
1742     }
1743 }
1744 
1745 #if PCG_HAS_128BIT_OPS
1746 static inline pcg128_t
pcg_setseq_128_rxs_m_xs_128_random_r(struct pcg_state_setseq_128 * rng)1747 pcg_setseq_128_rxs_m_xs_128_random_r(struct pcg_state_setseq_128* rng)
1748 {
1749     pcg_setseq_128_step_r(rng);
1750     return pcg_output_rxs_m_xs_128_128(rng->state);
1751 }
1752 #endif
1753 
1754 #if PCG_HAS_128BIT_OPS
1755 static inline pcg128_t
pcg_setseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_setseq_128 * rng,pcg128_t bound)1756 pcg_setseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_setseq_128* rng,
1757                                           pcg128_t bound)
1758 {
1759     pcg128_t threshold = -bound % bound;
1760     for (;;) {
1761         pcg128_t r = pcg_setseq_128_rxs_m_xs_128_random_r(rng);
1762         if (r >= threshold)
1763             return r % bound;
1764     }
1765 }
1766 #endif
1767 
1768 /* Generation functions for RXS M */
1769 
pcg_oneseq_16_rxs_m_8_random_r(struct pcg_state_16 * rng)1770 static inline uint8_t pcg_oneseq_16_rxs_m_8_random_r(struct pcg_state_16* rng)
1771 {
1772     uint16_t oldstate = rng->state;
1773     pcg_oneseq_16_step_r(rng);
1774     return pcg_output_rxs_m_16_8(oldstate);
1775 }
1776 
pcg_oneseq_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1777 static inline uint8_t pcg_oneseq_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
1778                                                    uint8_t bound)
1779 {
1780     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1781     for (;;) {
1782         uint8_t r = pcg_oneseq_16_rxs_m_8_random_r(rng);
1783         if (r >= threshold)
1784             return r % bound;
1785     }
1786 }
1787 
pcg_oneseq_32_rxs_m_16_random_r(struct pcg_state_32 * rng)1788 static inline uint16_t pcg_oneseq_32_rxs_m_16_random_r(struct pcg_state_32* rng)
1789 {
1790     uint32_t oldstate = rng->state;
1791     pcg_oneseq_32_step_r(rng);
1792     return pcg_output_rxs_m_32_16(oldstate);
1793 }
1794 
pcg_oneseq_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1795 static inline uint16_t pcg_oneseq_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
1796                                                      uint16_t bound)
1797 {
1798     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1799     for (;;) {
1800         uint16_t r = pcg_oneseq_32_rxs_m_16_random_r(rng);
1801         if (r >= threshold)
1802             return r % bound;
1803     }
1804 }
1805 
pcg_oneseq_64_rxs_m_32_random_r(struct pcg_state_64 * rng)1806 static inline uint32_t pcg_oneseq_64_rxs_m_32_random_r(struct pcg_state_64* rng)
1807 {
1808     uint64_t oldstate = rng->state;
1809     pcg_oneseq_64_step_r(rng);
1810     return pcg_output_rxs_m_64_32(oldstate);
1811 }
1812 
pcg_oneseq_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1813 static inline uint32_t pcg_oneseq_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
1814                                                      uint32_t bound)
1815 {
1816     uint32_t threshold = -bound % bound;
1817     for (;;) {
1818         uint32_t r = pcg_oneseq_64_rxs_m_32_random_r(rng);
1819         if (r >= threshold)
1820             return r % bound;
1821     }
1822 }
1823 
1824 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_64_random_r(struct pcg_state_128 * rng)1825 static inline uint64_t pcg_oneseq_128_rxs_m_64_random_r(struct pcg_state_128* rng)
1826 {
1827     pcg_oneseq_128_step_r(rng);
1828     return pcg_output_rxs_m_128_64(rng->state);
1829 }
1830 #endif
1831 
1832 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1833 static inline uint64_t pcg_oneseq_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
1834                                                       uint64_t bound)
1835 {
1836     uint64_t threshold = -bound % bound;
1837     for (;;) {
1838         uint64_t r = pcg_oneseq_128_rxs_m_64_random_r(rng);
1839         if (r >= threshold)
1840             return r % bound;
1841     }
1842 }
1843 #endif
1844 
pcg_unique_16_rxs_m_8_random_r(struct pcg_state_16 * rng)1845 static inline uint8_t pcg_unique_16_rxs_m_8_random_r(struct pcg_state_16* rng)
1846 {
1847     uint16_t oldstate = rng->state;
1848     pcg_unique_16_step_r(rng);
1849     return pcg_output_rxs_m_16_8(oldstate);
1850 }
1851 
pcg_unique_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1852 static inline uint8_t pcg_unique_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
1853                                                    uint8_t bound)
1854 {
1855     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1856     for (;;) {
1857         uint8_t r = pcg_unique_16_rxs_m_8_random_r(rng);
1858         if (r >= threshold)
1859             return r % bound;
1860     }
1861 }
1862 
pcg_unique_32_rxs_m_16_random_r(struct pcg_state_32 * rng)1863 static inline uint16_t pcg_unique_32_rxs_m_16_random_r(struct pcg_state_32* rng)
1864 {
1865     uint32_t oldstate = rng->state;
1866     pcg_unique_32_step_r(rng);
1867     return pcg_output_rxs_m_32_16(oldstate);
1868 }
1869 
pcg_unique_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1870 static inline uint16_t pcg_unique_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
1871                                                      uint16_t bound)
1872 {
1873     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1874     for (;;) {
1875         uint16_t r = pcg_unique_32_rxs_m_16_random_r(rng);
1876         if (r >= threshold)
1877             return r % bound;
1878     }
1879 }
1880 
pcg_unique_64_rxs_m_32_random_r(struct pcg_state_64 * rng)1881 static inline uint32_t pcg_unique_64_rxs_m_32_random_r(struct pcg_state_64* rng)
1882 {
1883     uint64_t oldstate = rng->state;
1884     pcg_unique_64_step_r(rng);
1885     return pcg_output_rxs_m_64_32(oldstate);
1886 }
1887 
pcg_unique_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1888 static inline uint32_t pcg_unique_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
1889                                                      uint32_t bound)
1890 {
1891     uint32_t threshold = -bound % bound;
1892     for (;;) {
1893         uint32_t r = pcg_unique_64_rxs_m_32_random_r(rng);
1894         if (r >= threshold)
1895             return r % bound;
1896     }
1897 }
1898 
1899 #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_64_random_r(struct pcg_state_128 * rng)1900 static inline uint64_t pcg_unique_128_rxs_m_64_random_r(struct pcg_state_128* rng)
1901 {
1902     pcg_unique_128_step_r(rng);
1903     return pcg_output_rxs_m_128_64(rng->state);
1904 }
1905 #endif
1906 
1907 #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1908 static inline uint64_t pcg_unique_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
1909                                                       uint64_t bound)
1910 {
1911     uint64_t threshold = -bound % bound;
1912     for (;;) {
1913         uint64_t r = pcg_unique_128_rxs_m_64_random_r(rng);
1914         if (r >= threshold)
1915             return r % bound;
1916     }
1917 }
1918 #endif
1919 
pcg_setseq_16_rxs_m_8_random_r(struct pcg_state_setseq_16 * rng)1920 static inline uint8_t pcg_setseq_16_rxs_m_8_random_r(struct pcg_state_setseq_16* rng)
1921 {
1922     uint16_t oldstate = rng->state;
1923     pcg_setseq_16_step_r(rng);
1924     return pcg_output_rxs_m_16_8(oldstate);
1925 }
1926 
1927 static inline uint8_t
pcg_setseq_16_rxs_m_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)1928 pcg_setseq_16_rxs_m_8_boundedrand_r(struct pcg_state_setseq_16* rng,
1929                                     uint8_t bound)
1930 {
1931     uint8_t threshold = ((uint8_t)(-bound)) % bound;
1932     for (;;) {
1933         uint8_t r = pcg_setseq_16_rxs_m_8_random_r(rng);
1934         if (r >= threshold)
1935             return r % bound;
1936     }
1937 }
1938 
pcg_setseq_32_rxs_m_16_random_r(struct pcg_state_setseq_32 * rng)1939 static inline uint16_t pcg_setseq_32_rxs_m_16_random_r(struct pcg_state_setseq_32* rng)
1940 {
1941     uint32_t oldstate = rng->state;
1942     pcg_setseq_32_step_r(rng);
1943     return pcg_output_rxs_m_32_16(oldstate);
1944 }
1945 
1946 static inline uint16_t
pcg_setseq_32_rxs_m_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)1947 pcg_setseq_32_rxs_m_16_boundedrand_r(struct pcg_state_setseq_32* rng,
1948                                      uint16_t bound)
1949 {
1950     uint16_t threshold = ((uint16_t)(-bound)) % bound;
1951     for (;;) {
1952         uint16_t r = pcg_setseq_32_rxs_m_16_random_r(rng);
1953         if (r >= threshold)
1954             return r % bound;
1955     }
1956 }
1957 
pcg_setseq_64_rxs_m_32_random_r(struct pcg_state_setseq_64 * rng)1958 static inline uint32_t pcg_setseq_64_rxs_m_32_random_r(struct pcg_state_setseq_64* rng)
1959 {
1960     uint64_t oldstate = rng->state;
1961     pcg_setseq_64_step_r(rng);
1962     return pcg_output_rxs_m_64_32(oldstate);
1963 }
1964 
1965 static inline uint32_t
pcg_setseq_64_rxs_m_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)1966 pcg_setseq_64_rxs_m_32_boundedrand_r(struct pcg_state_setseq_64* rng,
1967                                      uint32_t bound)
1968 {
1969     uint32_t threshold = -bound % bound;
1970     for (;;) {
1971         uint32_t r = pcg_setseq_64_rxs_m_32_random_r(rng);
1972         if (r >= threshold)
1973             return r % bound;
1974     }
1975 }
1976 
1977 #if PCG_HAS_128BIT_OPS
1978 static inline uint64_t
pcg_setseq_128_rxs_m_64_random_r(struct pcg_state_setseq_128 * rng)1979 pcg_setseq_128_rxs_m_64_random_r(struct pcg_state_setseq_128* rng)
1980 {
1981     pcg_setseq_128_step_r(rng);
1982     return pcg_output_rxs_m_128_64(rng->state);
1983 }
1984 #endif
1985 
1986 #if PCG_HAS_128BIT_OPS
1987 static inline uint64_t
pcg_setseq_128_rxs_m_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)1988 pcg_setseq_128_rxs_m_64_boundedrand_r(struct pcg_state_setseq_128* rng,
1989                                       uint64_t bound)
1990 {
1991     uint64_t threshold = -bound % bound;
1992     for (;;) {
1993         uint64_t r = pcg_setseq_128_rxs_m_64_random_r(rng);
1994         if (r >= threshold)
1995             return r % bound;
1996     }
1997 }
1998 #endif
1999 
pcg_mcg_16_rxs_m_8_random_r(struct pcg_state_16 * rng)2000 static inline uint8_t pcg_mcg_16_rxs_m_8_random_r(struct pcg_state_16* rng)
2001 {
2002     uint16_t oldstate = rng->state;
2003     pcg_mcg_16_step_r(rng);
2004     return pcg_output_rxs_m_16_8(oldstate);
2005 }
2006 
pcg_mcg_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)2007 static inline uint8_t pcg_mcg_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
2008                                                 uint8_t bound)
2009 {
2010     uint8_t threshold = ((uint8_t)(-bound)) % bound;
2011     for (;;) {
2012         uint8_t r = pcg_mcg_16_rxs_m_8_random_r(rng);
2013         if (r >= threshold)
2014             return r % bound;
2015     }
2016 }
2017 
pcg_mcg_32_rxs_m_16_random_r(struct pcg_state_32 * rng)2018 static inline uint16_t pcg_mcg_32_rxs_m_16_random_r(struct pcg_state_32* rng)
2019 {
2020     uint32_t oldstate = rng->state;
2021     pcg_mcg_32_step_r(rng);
2022     return pcg_output_rxs_m_32_16(oldstate);
2023 }
2024 
pcg_mcg_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)2025 static inline uint16_t pcg_mcg_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
2026                                                   uint16_t bound)
2027 {
2028     uint16_t threshold = ((uint16_t)(-bound)) % bound;
2029     for (;;) {
2030         uint16_t r = pcg_mcg_32_rxs_m_16_random_r(rng);
2031         if (r >= threshold)
2032             return r % bound;
2033     }
2034 }
2035 
pcg_mcg_64_rxs_m_32_random_r(struct pcg_state_64 * rng)2036 static inline uint32_t pcg_mcg_64_rxs_m_32_random_r(struct pcg_state_64* rng)
2037 {
2038     uint64_t oldstate = rng->state;
2039     pcg_mcg_64_step_r(rng);
2040     return pcg_output_rxs_m_64_32(oldstate);
2041 }
2042 
pcg_mcg_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2043 static inline uint32_t pcg_mcg_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
2044                                                   uint32_t bound)
2045 {
2046     uint32_t threshold = -bound % bound;
2047     for (;;) {
2048         uint32_t r = pcg_mcg_64_rxs_m_32_random_r(rng);
2049         if (r >= threshold)
2050             return r % bound;
2051     }
2052 }
2053 
2054 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_rxs_m_64_random_r(struct pcg_state_128 * rng)2055 static inline uint64_t pcg_mcg_128_rxs_m_64_random_r(struct pcg_state_128* rng)
2056 {
2057     pcg_mcg_128_step_r(rng);
2058     return pcg_output_rxs_m_128_64(rng->state);
2059 }
2060 #endif
2061 
2062 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2063 static inline uint64_t pcg_mcg_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
2064                                                    uint64_t bound)
2065 {
2066     uint64_t threshold = -bound % bound;
2067     for (;;) {
2068         uint64_t r = pcg_mcg_128_rxs_m_64_random_r(rng);
2069         if (r >= threshold)
2070             return r % bound;
2071     }
2072 }
2073 #endif
2074 
2075 /* Generation functions for XSL RR (only defined for "large" types) */
2076 
pcg_oneseq_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2077 static inline uint32_t pcg_oneseq_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
2078 {
2079     uint64_t oldstate = rng->state;
2080     pcg_oneseq_64_step_r(rng);
2081     return pcg_output_xsl_rr_64_32(oldstate);
2082 }
2083 
pcg_oneseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2084 static inline uint32_t pcg_oneseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
2085                                                       uint32_t bound)
2086 {
2087     uint32_t threshold = -bound % bound;
2088     for (;;) {
2089         uint32_t r = pcg_oneseq_64_xsl_rr_32_random_r(rng);
2090         if (r >= threshold)
2091             return r % bound;
2092     }
2093 }
2094 
2095 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2096 static inline uint64_t pcg_oneseq_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
2097 {
2098     pcg_oneseq_128_step_r(rng);
2099     return pcg_output_xsl_rr_128_64(rng->state);
2100 }
2101 #endif
2102 
2103 #if PCG_HAS_128BIT_OPS
2104 static inline uint64_t
pcg_oneseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2105 pcg_oneseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
2106                                        uint64_t bound)
2107 {
2108     uint64_t threshold = -bound % bound;
2109     for (;;) {
2110         uint64_t r = pcg_oneseq_128_xsl_rr_64_random_r(rng);
2111         if (r >= threshold)
2112             return r % bound;
2113     }
2114 }
2115 #endif
2116 
pcg_unique_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2117 static inline uint32_t pcg_unique_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
2118 {
2119     uint64_t oldstate = rng->state;
2120     pcg_unique_64_step_r(rng);
2121     return pcg_output_xsl_rr_64_32(oldstate);
2122 }
2123 
pcg_unique_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2124 static inline uint32_t pcg_unique_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
2125                                                       uint32_t bound)
2126 {
2127     uint32_t threshold = -bound % bound;
2128     for (;;) {
2129         uint32_t r = pcg_unique_64_xsl_rr_32_random_r(rng);
2130         if (r >= threshold)
2131             return r % bound;
2132     }
2133 }
2134 
2135 #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2136 static inline uint64_t pcg_unique_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
2137 {
2138     pcg_unique_128_step_r(rng);
2139     return pcg_output_xsl_rr_128_64(rng->state);
2140 }
2141 #endif
2142 
2143 #if PCG_HAS_128BIT_OPS
2144 static inline uint64_t
pcg_unique_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2145 pcg_unique_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
2146                                        uint64_t bound)
2147 {
2148     uint64_t threshold = -bound % bound;
2149     for (;;) {
2150         uint64_t r = pcg_unique_128_xsl_rr_64_random_r(rng);
2151         if (r >= threshold)
2152             return r % bound;
2153     }
2154 }
2155 #endif
2156 
2157 static inline uint32_t
pcg_setseq_64_xsl_rr_32_random_r(struct pcg_state_setseq_64 * rng)2158 pcg_setseq_64_xsl_rr_32_random_r(struct pcg_state_setseq_64* rng)
2159 {
2160     uint64_t oldstate = rng->state;
2161     pcg_setseq_64_step_r(rng);
2162     return pcg_output_xsl_rr_64_32(oldstate);
2163 }
2164 
2165 static inline uint32_t
pcg_setseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)2166 pcg_setseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng,
2167                                       uint32_t bound)
2168 {
2169     uint32_t threshold = -bound % bound;
2170     for (;;) {
2171         uint32_t r = pcg_setseq_64_xsl_rr_32_random_r(rng);
2172         if (r >= threshold)
2173             return r % bound;
2174     }
2175 }
2176 
2177 #if PCG_HAS_128BIT_OPS
2178 static inline uint64_t
pcg_setseq_128_xsl_rr_64_random_r(struct pcg_state_setseq_128 * rng)2179 pcg_setseq_128_xsl_rr_64_random_r(struct pcg_state_setseq_128* rng)
2180 {
2181     pcg_setseq_128_step_r(rng);
2182     return pcg_output_xsl_rr_128_64(rng->state);
2183 }
2184 #endif
2185 
2186 #if PCG_HAS_128BIT_OPS
2187 static inline uint64_t
pcg_setseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)2188 pcg_setseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng,
2189                                        uint64_t bound)
2190 {
2191     uint64_t threshold = -bound % bound;
2192     for (;;) {
2193         uint64_t r = pcg_setseq_128_xsl_rr_64_random_r(rng);
2194         if (r >= threshold)
2195             return r % bound;
2196     }
2197 }
2198 #endif
2199 
pcg_mcg_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2200 static inline uint32_t pcg_mcg_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
2201 {
2202     uint64_t oldstate = rng->state;
2203     pcg_mcg_64_step_r(rng);
2204     return pcg_output_xsl_rr_64_32(oldstate);
2205 }
2206 
pcg_mcg_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2207 static inline uint32_t pcg_mcg_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
2208                                                    uint32_t bound)
2209 {
2210     uint32_t threshold = -bound % bound;
2211     for (;;) {
2212         uint32_t r = pcg_mcg_64_xsl_rr_32_random_r(rng);
2213         if (r >= threshold)
2214             return r % bound;
2215     }
2216 }
2217 
2218 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2219 static inline uint64_t pcg_mcg_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
2220 {
2221     pcg_mcg_128_step_r(rng);
2222     return pcg_output_xsl_rr_128_64(rng->state);
2223 }
2224 #endif
2225 
2226 #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2227 static inline uint64_t pcg_mcg_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
2228                                                     uint64_t bound)
2229 {
2230     uint64_t threshold = -bound % bound;
2231     for (;;) {
2232         uint64_t r = pcg_mcg_128_xsl_rr_64_random_r(rng);
2233         if (r >= threshold)
2234             return r % bound;
2235     }
2236 }
2237 #endif
2238 
2239 /* Generation functions for XSL RR RR (only defined for "large" types) */
2240 
pcg_oneseq_64_xsl_rr_rr_64_random_r(struct pcg_state_64 * rng)2241 static inline uint64_t pcg_oneseq_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng)
2242 {
2243     uint64_t oldstate = rng->state;
2244     pcg_oneseq_64_step_r(rng);
2245     return pcg_output_xsl_rr_rr_64_64(oldstate);
2246 }
2247 
2248 static inline uint64_t
pcg_oneseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)2249 pcg_oneseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng,
2250                                          uint64_t bound)
2251 {
2252     uint64_t threshold = -bound % bound;
2253     for (;;) {
2254         uint64_t r = pcg_oneseq_64_xsl_rr_rr_64_random_r(rng);
2255         if (r >= threshold)
2256             return r % bound;
2257     }
2258 }
2259 
2260 #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsl_rr_rr_128_random_r(struct pcg_state_128 * rng)2261 static inline pcg128_t pcg_oneseq_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng)
2262 {
2263     pcg_oneseq_128_step_r(rng);
2264     return pcg_output_xsl_rr_rr_128_128(rng->state);
2265 }
2266 #endif
2267 
2268 #if PCG_HAS_128BIT_OPS
2269 static inline pcg128_t
pcg_oneseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)2270 pcg_oneseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng,
2271                                            pcg128_t bound)
2272 {
2273     pcg128_t threshold = -bound % bound;
2274     for (;;) {
2275         pcg128_t r = pcg_oneseq_128_xsl_rr_rr_128_random_r(rng);
2276         if (r >= threshold)
2277             return r % bound;
2278     }
2279 }
2280 #endif
2281 
pcg_unique_64_xsl_rr_rr_64_random_r(struct pcg_state_64 * rng)2282 static inline uint64_t pcg_unique_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng)
2283 {
2284     uint64_t oldstate = rng->state;
2285     pcg_unique_64_step_r(rng);
2286     return pcg_output_xsl_rr_rr_64_64(oldstate);
2287 }
2288 
2289 static inline uint64_t
pcg_unique_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)2290 pcg_unique_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng,
2291                                          uint64_t bound)
2292 {
2293     uint64_t threshold = -bound % bound;
2294     for (;;) {
2295         uint64_t r = pcg_unique_64_xsl_rr_rr_64_random_r(rng);
2296         if (r >= threshold)
2297             return r % bound;
2298     }
2299 }
2300 
2301 #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsl_rr_rr_128_random_r(struct pcg_state_128 * rng)2302 static inline pcg128_t pcg_unique_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng)
2303 {
2304     pcg_unique_128_step_r(rng);
2305     return pcg_output_xsl_rr_rr_128_128(rng->state);
2306 }
2307 #endif
2308 
2309 #if PCG_HAS_128BIT_OPS
2310 static inline pcg128_t
pcg_unique_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)2311 pcg_unique_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng,
2312                                            pcg128_t bound)
2313 {
2314     pcg128_t threshold = -bound % bound;
2315     for (;;) {
2316         pcg128_t r = pcg_unique_128_xsl_rr_rr_128_random_r(rng);
2317         if (r >= threshold)
2318             return r % bound;
2319     }
2320 }
2321 #endif
2322 
2323 static inline uint64_t
pcg_setseq_64_xsl_rr_rr_64_random_r(struct pcg_state_setseq_64 * rng)2324 pcg_setseq_64_xsl_rr_rr_64_random_r(struct pcg_state_setseq_64* rng)
2325 {
2326     uint64_t oldstate = rng->state;
2327     pcg_setseq_64_step_r(rng);
2328     return pcg_output_xsl_rr_rr_64_64(oldstate);
2329 }
2330 
2331 static inline uint64_t
pcg_setseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_setseq_64 * rng,uint64_t bound)2332 pcg_setseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_setseq_64* rng,
2333                                          uint64_t bound)
2334 {
2335     uint64_t threshold = -bound % bound;
2336     for (;;) {
2337         uint64_t r = pcg_setseq_64_xsl_rr_rr_64_random_r(rng);
2338         if (r >= threshold)
2339             return r % bound;
2340     }
2341 }
2342 
2343 #if PCG_HAS_128BIT_OPS
2344 static inline pcg128_t
pcg_setseq_128_xsl_rr_rr_128_random_r(struct pcg_state_setseq_128 * rng)2345 pcg_setseq_128_xsl_rr_rr_128_random_r(struct pcg_state_setseq_128* rng)
2346 {
2347     pcg_setseq_128_step_r(rng);
2348     return pcg_output_xsl_rr_rr_128_128(rng->state);
2349 }
2350 #endif
2351 
2352 #if PCG_HAS_128BIT_OPS
2353 static inline pcg128_t
pcg_setseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_setseq_128 * rng,pcg128_t bound)2354 pcg_setseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_setseq_128* rng,
2355                                            pcg128_t bound)
2356 {
2357     pcg128_t threshold = -bound % bound;
2358     for (;;) {
2359         pcg128_t r = pcg_setseq_128_xsl_rr_rr_128_random_r(rng);
2360         if (r >= threshold)
2361             return r % bound;
2362     }
2363 }
2364 #endif
2365 
2366 /*** Typedefs */
2367 typedef struct pcg_state_setseq_64      pcg32_random_t;
2368 typedef struct pcg_state_64             pcg32s_random_t;
2369 typedef struct pcg_state_64             pcg32u_random_t;
2370 typedef struct pcg_state_64             pcg32f_random_t;
2371 /*** random_r */
2372 #define pcg32_random_r                  pcg_setseq_64_xsh_rr_32_random_r
2373 #define pcg32s_random_r                 pcg_oneseq_64_xsh_rr_32_random_r
2374 #define pcg32u_random_r                 pcg_unique_64_xsh_rr_32_random_r
2375 #define pcg32f_random_r                 pcg_mcg_64_xsh_rs_32_random_r
2376 /*** boundedrand_r */
2377 #define pcg32_boundedrand_r             pcg_setseq_64_xsh_rr_32_boundedrand_r
2378 #define pcg32s_boundedrand_r            pcg_oneseq_64_xsh_rr_32_boundedrand_r
2379 #define pcg32u_boundedrand_r            pcg_unique_64_xsh_rr_32_boundedrand_r
2380 #define pcg32f_boundedrand_r            pcg_mcg_64_xsh_rs_32_boundedrand_r
2381 /*** srandom_r */
2382 #define pcg32_srandom_r                 pcg_setseq_64_srandom_r
2383 #define pcg32s_srandom_r                pcg_oneseq_64_srandom_r
2384 #define pcg32u_srandom_r                pcg_unique_64_srandom_r
2385 #define pcg32f_srandom_r                pcg_mcg_64_srandom_r
2386 /*** advance_r */
2387 #define pcg32_advance_r                 pcg_setseq_64_advance_r
2388 #define pcg32s_advance_r                pcg_oneseq_64_advance_r
2389 #define pcg32u_advance_r                pcg_unique_64_advance_r
2390 #define pcg32f_advance_r                pcg_mcg_64_advance_r
2391 
2392 #if PCG_HAS_128BIT_OPS
2393 /*** Typedefs */
2394 typedef struct pcg_state_setseq_128     pcg64_random_t;
2395 typedef struct pcg_state_128            pcg64s_random_t;
2396 typedef struct pcg_state_128            pcg64u_random_t;
2397 typedef struct pcg_state_128            pcg64f_random_t;
2398 /*** random_r */
2399 #define pcg64_random_r                  pcg_setseq_128_xsl_rr_64_random_r
2400 #define pcg64s_random_r                 pcg_oneseq_128_xsl_rr_64_random_r
2401 #define pcg64u_random_r                 pcg_unique_128_xsl_rr_64_random_r
2402 #define pcg64f_random_r                 pcg_mcg_128_xsl_rr_64_random_r
2403 /*** boundedrand_r */
2404 #define pcg64_boundedrand_r             pcg_setseq_128_xsl_rr_64_boundedrand_r
2405 #define pcg64s_boundedrand_r            pcg_oneseq_128_xsl_rr_64_boundedrand_r
2406 #define pcg64u_boundedrand_r            pcg_unique_128_xsl_rr_64_boundedrand_r
2407 #define pcg64f_boundedrand_r            pcg_mcg_128_xsl_rr_64_boundedrand_r
2408 /*** srandom_r */
2409 #define pcg64_srandom_r                 pcg_setseq_128_srandom_r
2410 #define pcg64s_srandom_r                pcg_oneseq_128_srandom_r
2411 #define pcg64u_srandom_r                pcg_unique_128_srandom_r
2412 #define pcg64f_srandom_r                pcg_mcg_128_srandom_r
2413 /*** advance_r */
2414 #define pcg64_advance_r                 pcg_setseq_128_advance_r
2415 #define pcg64s_advance_r                pcg_oneseq_128_advance_r
2416 #define pcg64u_advance_r                pcg_unique_128_advance_r
2417 #define pcg64f_advance_r                pcg_mcg_128_advance_r
2418 #endif
2419 
2420 /*** Typedefs */
2421 typedef struct pcg_state_8              pcg8si_random_t;
2422 typedef struct pcg_state_16             pcg16si_random_t;
2423 typedef struct pcg_state_32             pcg32si_random_t;
2424 typedef struct pcg_state_64             pcg64si_random_t;
2425 /*** random_r */
2426 #define pcg8si_random_r                 pcg_oneseq_8_rxs_m_xs_8_random_r
2427 #define pcg16si_random_r                pcg_oneseq_16_rxs_m_xs_16_random_r
2428 #define pcg32si_random_r                pcg_oneseq_32_rxs_m_xs_32_random_r
2429 #define pcg64si_random_r                pcg_oneseq_64_rxs_m_xs_64_random_r
2430 /*** boundedrand_r */
2431 #define pcg8si_boundedrand_r            pcg_oneseq_8_rxs_m_xs_8_boundedrand_r
2432 #define pcg16si_boundedrand_r           pcg_oneseq_16_rxs_m_xs_16_boundedrand_r
2433 #define pcg32si_boundedrand_r           pcg_oneseq_32_rxs_m_xs_32_boundedrand_r
2434 #define pcg64si_boundedrand_r           pcg_oneseq_64_rxs_m_xs_64_boundedrand_r
2435 /*** srandom_r */
2436 #define pcg8si_srandom_r                pcg_oneseq_8_srandom_r
2437 #define pcg16si_srandom_r               pcg_oneseq_16_srandom_r
2438 #define pcg32si_srandom_r               pcg_oneseq_32_srandom_r
2439 #define pcg64si_srandom_r               pcg_oneseq_64_srandom_r
2440 /*** advance_r */
2441 #define pcg8si_advance_r                pcg_oneseq_8_advance_r
2442 #define pcg16si_advance_r               pcg_oneseq_16_advance_r
2443 #define pcg32si_advance_r               pcg_oneseq_32_advance_r
2444 #define pcg64si_advance_r               pcg_oneseq_64_advance_r
2445 
2446 #if PCG_HAS_128BIT_OPS
2447 typedef struct pcg_state_128        pcg128si_random_t;
2448 #define pcg128si_random_r           pcg_oneseq_128_rxs_m_xs_128_random_r
2449 #define pcg128si_boundedrand_r      pcg_oneseq_128_rxs_m_xs_128_boundedrand_r
2450 #define pcg128si_srandom_r          pcg_oneseq_128_srandom_r
2451 #define pcg128si_advance_r          pcg_oneseq_128_advance_r
2452 #endif
2453 
2454 /*** Typedefs */
2455 typedef struct pcg_state_setseq_8       pcg8i_random_t;
2456 typedef struct pcg_state_setseq_16      pcg16i_random_t;
2457 typedef struct pcg_state_setseq_32      pcg32i_random_t;
2458 typedef struct pcg_state_setseq_64      pcg64i_random_t;
2459 /*** random_r */
2460 #define pcg8i_random_r                  pcg_setseq_8_rxs_m_xs_8_random_r
2461 #define pcg16i_random_r                 pcg_setseq_16_rxs_m_xs_16_random_r
2462 #define pcg32i_random_r                 pcg_setseq_32_rxs_m_xs_32_random_r
2463 #define pcg64i_random_r                 pcg_setseq_64_rxs_m_xs_64_random_r
2464 /*** boundedrand_r */
2465 #define pcg8i_boundedrand_r             pcg_setseq_8_rxs_m_xs_8_boundedrand_r
2466 #define pcg16i_boundedrand_r            pcg_setseq_16_rxs_m_xs_16_boundedrand_r
2467 #define pcg32i_boundedrand_r            pcg_setseq_32_rxs_m_xs_32_boundedrand_r
2468 #define pcg64i_boundedrand_r            pcg_setseq_64_rxs_m_xs_64_boundedrand_r
2469 /*** srandom_r */
2470 #define pcg8i_srandom_r                 pcg_setseq_8_srandom_r
2471 #define pcg16i_srandom_r                pcg_setseq_16_srandom_r
2472 #define pcg32i_srandom_r                pcg_setseq_32_srandom_r
2473 #define pcg64i_srandom_r                pcg_setseq_64_srandom_r
2474 /*** advance_r */
2475 #define pcg8i_advance_r                 pcg_setseq_8_advance_r
2476 #define pcg16i_advance_r                pcg_setseq_16_advance_r
2477 #define pcg32i_advance_r                pcg_setseq_32_advance_r
2478 #define pcg64i_advance_r                pcg_setseq_64_advance_r
2479 
2480 #if PCG_HAS_128BIT_OPS
2481 typedef struct pcg_state_setseq_128   pcg128i_random_t;
2482 #define pcg128i_random_r              pcg_setseq_128_rxs_m_xs_128_random_r
2483 #define pcg128i_boundedrand_r         pcg_setseq_128_rxs_m_xs_128_boundedrand_r
2484 #define pcg128i_srandom_r             pcg_setseq_128_srandom_r
2485 #define pcg128i_advance_r             pcg_setseq_128_advance_r
2486 #endif
2487 
2488 /*
2489  * Static initialization constants (if you can't call srandom for some
2490  * bizarre reason).
2491  */
2492 
2493 #define PCG32_INITIALIZER       PCG_STATE_SETSEQ_64_INITIALIZER
2494 #define PCG32U_INITIALIZER      PCG_STATE_UNIQUE_64_INITIALIZER
2495 #define PCG32S_INITIALIZER      PCG_STATE_ONESEQ_64_INITIALIZER
2496 #define PCG32F_INITIALIZER      PCG_STATE_MCG_64_INITIALIZER
2497 
2498 #if PCG_HAS_128BIT_OPS
2499 #define PCG64_INITIALIZER       PCG_STATE_SETSEQ_128_INITIALIZER
2500 #define PCG64U_INITIALIZER      PCG_STATE_UNIQUE_128_INITIALIZER
2501 #define PCG64S_INITIALIZER      PCG_STATE_ONESEQ_128_INITIALIZER
2502 #define PCG64F_INITIALIZER      PCG_STATE_MCG_128_INITIALIZER
2503 #endif
2504 
2505 #define PCG8SI_INITIALIZER      PCG_STATE_ONESEQ_8_INITIALIZER
2506 #define PCG16SI_INITIALIZER     PCG_STATE_ONESEQ_16_INITIALIZER
2507 #define PCG32SI_INITIALIZER     PCG_STATE_ONESEQ_32_INITIALIZER
2508 #define PCG64SI_INITIALIZER     PCG_STATE_ONESEQ_64_INITIALIZER
2509 #if PCG_HAS_128BIT_OPS
2510 #define PCG128SI_INITIALIZER    PCG_STATE_ONESEQ_128_INITIALIZER
2511 #endif
2512 
2513 #define PCG8I_INITIALIZER       PCG_STATE_SETSEQ_8_INITIALIZER
2514 #define PCG16I_INITIALIZER      PCG_STATE_SETSEQ_16_INITIALIZER
2515 #define PCG32I_INITIALIZER      PCG_STATE_SETSEQ_32_INITIALIZER
2516 #define PCG64I_INITIALIZER      PCG_STATE_SETSEQ_64_INITIALIZER
2517 #if PCG_HAS_128BIT_OPS
2518 #define PCG128I_INITIALIZER     PCG_STATE_SETSEQ_128_INITIALIZER
2519 #endif
2520 
2521 #ifdef __cplusplus
2522 }
2523 #endif
2524 
2525 #endif /* PCG_VARIANTS_H_INCLUDED */
2526 
2527