19119bafbSConrad Meyer /*
29119bafbSConrad Meyer * PCG Random Number Generation for C.
39119bafbSConrad Meyer *
49119bafbSConrad Meyer * Copyright 2014-2019 Melissa O'Neill <oneill@pcg-random.org>,
59119bafbSConrad Meyer * and the PCG Project contributors.
69119bafbSConrad Meyer *
79119bafbSConrad Meyer * SPDX-License-Identifier: (Apache-2.0 OR MIT)
89119bafbSConrad Meyer *
99119bafbSConrad Meyer * Licensed under the Apache License, Version 2.0 (provided in
109119bafbSConrad Meyer * LICENSE-APACHE.txt and at http://www.apache.org/licenses/LICENSE-2.0)
119119bafbSConrad Meyer * or under the MIT license (provided in LICENSE-MIT.txt and at
129119bafbSConrad Meyer * http://opensource.org/licenses/MIT), at your option. This file may not
139119bafbSConrad Meyer * be copied, modified, or distributed except according to those terms.
149119bafbSConrad Meyer *
159119bafbSConrad Meyer * Distributed on an "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, either
169119bafbSConrad Meyer * express or implied. See your chosen license for details.
179119bafbSConrad Meyer *
189119bafbSConrad Meyer * For additional information about the PCG random number generation scheme,
199119bafbSConrad Meyer * visit http://www.pcg-random.org/.
209119bafbSConrad Meyer */
219119bafbSConrad Meyer
229119bafbSConrad Meyer /*
239119bafbSConrad Meyer * This code is derived from the canonical C++ PCG implementation, which
249119bafbSConrad Meyer * has many additional features and is preferable if you can use C++ in
259119bafbSConrad Meyer * your project.
269119bafbSConrad Meyer *
279119bafbSConrad Meyer * Much of the derivation was performed mechanically. In particular, the
289119bafbSConrad Meyer * output functions were generated by compiling the C++ output functions
299119bafbSConrad Meyer * into LLVM bitcode and then transforming that using the LLVM C backend
309119bafbSConrad Meyer * (from https://github.com/draperlaboratory/llvm-cbe), and then
319119bafbSConrad Meyer * postprocessing and hand editing the output.
329119bafbSConrad Meyer *
339119bafbSConrad Meyer * Much of the remaining code was generated by C-preprocessor metaprogramming.
349119bafbSConrad Meyer */
359119bafbSConrad Meyer
369119bafbSConrad Meyer #ifndef PCG_VARIANTS_H_INCLUDED
379119bafbSConrad Meyer #define PCG_VARIANTS_H_INCLUDED 1
389119bafbSConrad Meyer
398a0edc91SConrad Meyer #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__
409119bafbSConrad Meyer typedef __uint128_t pcg128_t;
419119bafbSConrad Meyer #define PCG_128BIT_CONSTANT(high,low) \
429119bafbSConrad Meyer ((((pcg128_t)high) << 64) + low)
439119bafbSConrad Meyer #define PCG_HAS_128BIT_OPS 1
448a0edc91SConrad Meyer #else
458a0edc91SConrad Meyer #define PCG_HAS_128BIT_OPS 0
469119bafbSConrad Meyer #endif
479119bafbSConrad Meyer
488a0edc91SConrad Meyer #ifdef __cplusplus
499119bafbSConrad Meyer extern "C" {
509119bafbSConrad Meyer #endif
519119bafbSConrad Meyer
529119bafbSConrad Meyer /*
539119bafbSConrad Meyer * Rotate helper functions.
549119bafbSConrad Meyer */
559119bafbSConrad Meyer
pcg_rotr_8(uint8_t value,unsigned int rot)56*43eccfe9SConrad Meyer static inline uint8_t pcg_rotr_8(uint8_t value, unsigned int rot)
579119bafbSConrad Meyer {
589119bafbSConrad Meyer /* Unfortunately, clang is kinda pathetic when it comes to properly
599119bafbSConrad Meyer * recognizing idiomatic rotate code, so for clang we actually provide
609119bafbSConrad Meyer * assembler directives (enabled with PCG_USE_INLINE_ASM). Boo, hiss.
619119bafbSConrad Meyer */
628a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
638a0edc91SConrad Meyer __asm__ ("rorb %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
649119bafbSConrad Meyer return value;
659119bafbSConrad Meyer #else
669119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 7));
679119bafbSConrad Meyer #endif
689119bafbSConrad Meyer }
699119bafbSConrad Meyer
pcg_rotr_16(uint16_t value,unsigned int rot)70*43eccfe9SConrad Meyer static inline uint16_t pcg_rotr_16(uint16_t value, unsigned int rot)
719119bafbSConrad Meyer {
728a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
738a0edc91SConrad Meyer __asm__ ("rorw %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
749119bafbSConrad Meyer return value;
759119bafbSConrad Meyer #else
769119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 15));
779119bafbSConrad Meyer #endif
789119bafbSConrad Meyer }
799119bafbSConrad Meyer
pcg_rotr_32(uint32_t value,unsigned int rot)80*43eccfe9SConrad Meyer static inline uint32_t pcg_rotr_32(uint32_t value, unsigned int rot)
819119bafbSConrad Meyer {
828a0edc91SConrad Meyer #if PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
838a0edc91SConrad Meyer __asm__ ("rorl %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
849119bafbSConrad Meyer return value;
859119bafbSConrad Meyer #else
869119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 31));
879119bafbSConrad Meyer #endif
889119bafbSConrad Meyer }
899119bafbSConrad Meyer
pcg_rotr_64(uint64_t value,unsigned int rot)90*43eccfe9SConrad Meyer static inline uint64_t pcg_rotr_64(uint64_t value, unsigned int rot)
919119bafbSConrad Meyer {
928a0edc91SConrad Meyer #if 0 && PCG_USE_INLINE_ASM && defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
939119bafbSConrad Meyer /* For whatever reason, clang actually *does* generate rotq by
949119bafbSConrad Meyer itself, so we don't need this code. */
958a0edc91SConrad Meyer __asm__ ("rorq %%cl, %0" : "=r" (value) : "0" (value), "c" (rot));
969119bafbSConrad Meyer return value;
979119bafbSConrad Meyer #else
989119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 63));
999119bafbSConrad Meyer #endif
1009119bafbSConrad Meyer }
1019119bafbSConrad Meyer
1029119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_rotr_128(pcg128_t value,unsigned int rot)103*43eccfe9SConrad Meyer static inline pcg128_t pcg_rotr_128(pcg128_t value, unsigned int rot)
1049119bafbSConrad Meyer {
1059119bafbSConrad Meyer return (value >> rot) | (value << ((- rot) & 127));
1069119bafbSConrad Meyer }
1079119bafbSConrad Meyer #endif
1089119bafbSConrad Meyer
1099119bafbSConrad Meyer /*
1109119bafbSConrad Meyer * Output functions. These are the core of the PCG generation scheme.
1119119bafbSConrad Meyer */
1129119bafbSConrad Meyer
1139119bafbSConrad Meyer /* XSH RS */
1149119bafbSConrad Meyer
pcg_output_xsh_rs_16_8(uint16_t state)115*43eccfe9SConrad Meyer static inline uint8_t pcg_output_xsh_rs_16_8(uint16_t state)
1169119bafbSConrad Meyer {
1179119bafbSConrad Meyer return (uint8_t)(((state >> 7u) ^ state) >> ((state >> 14u) + 3u));
1189119bafbSConrad Meyer }
1199119bafbSConrad Meyer
pcg_output_xsh_rs_32_16(uint32_t state)120*43eccfe9SConrad Meyer static inline uint16_t pcg_output_xsh_rs_32_16(uint32_t state)
1219119bafbSConrad Meyer {
1229119bafbSConrad Meyer return (uint16_t)(((state >> 11u) ^ state) >> ((state >> 30u) + 11u));
1239119bafbSConrad Meyer }
1249119bafbSConrad Meyer
pcg_output_xsh_rs_64_32(uint64_t state)125*43eccfe9SConrad Meyer static inline uint32_t pcg_output_xsh_rs_64_32(uint64_t state)
1269119bafbSConrad Meyer {
1279119bafbSConrad Meyer
1289119bafbSConrad Meyer return (uint32_t)(((state >> 22u) ^ state) >> ((state >> 61u) + 22u));
1299119bafbSConrad Meyer }
1309119bafbSConrad Meyer
1319119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_xsh_rs_128_64(pcg128_t state)132*43eccfe9SConrad Meyer static inline uint64_t pcg_output_xsh_rs_128_64(pcg128_t state)
1339119bafbSConrad Meyer {
1349119bafbSConrad Meyer return (uint64_t)(((state >> 43u) ^ state) >> ((state >> 124u) + 45u));
1359119bafbSConrad Meyer }
1369119bafbSConrad Meyer #endif
1379119bafbSConrad Meyer
1389119bafbSConrad Meyer /* XSH RR */
1399119bafbSConrad Meyer
pcg_output_xsh_rr_16_8(uint16_t state)140*43eccfe9SConrad Meyer static inline uint8_t pcg_output_xsh_rr_16_8(uint16_t state)
1419119bafbSConrad Meyer {
1429119bafbSConrad Meyer return pcg_rotr_8(((state >> 5u) ^ state) >> 5u, state >> 13u);
1439119bafbSConrad Meyer }
1449119bafbSConrad Meyer
pcg_output_xsh_rr_32_16(uint32_t state)145*43eccfe9SConrad Meyer static inline uint16_t pcg_output_xsh_rr_32_16(uint32_t state)
1469119bafbSConrad Meyer {
1479119bafbSConrad Meyer return pcg_rotr_16(((state >> 10u) ^ state) >> 12u, state >> 28u);
1489119bafbSConrad Meyer }
1499119bafbSConrad Meyer
pcg_output_xsh_rr_64_32(uint64_t state)150*43eccfe9SConrad Meyer static inline uint32_t pcg_output_xsh_rr_64_32(uint64_t state)
1519119bafbSConrad Meyer {
1529119bafbSConrad Meyer return pcg_rotr_32(((state >> 18u) ^ state) >> 27u, state >> 59u);
1539119bafbSConrad Meyer }
1549119bafbSConrad Meyer
1559119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_xsh_rr_128_64(pcg128_t state)156*43eccfe9SConrad Meyer static inline uint64_t pcg_output_xsh_rr_128_64(pcg128_t state)
1579119bafbSConrad Meyer {
1589119bafbSConrad Meyer return pcg_rotr_64(((state >> 35u) ^ state) >> 58u, state >> 122u);
1599119bafbSConrad Meyer }
1609119bafbSConrad Meyer #endif
1619119bafbSConrad Meyer
1629119bafbSConrad Meyer /* RXS M XS */
1639119bafbSConrad Meyer
pcg_output_rxs_m_xs_8_8(uint8_t state)164*43eccfe9SConrad Meyer static inline uint8_t pcg_output_rxs_m_xs_8_8(uint8_t state)
1659119bafbSConrad Meyer {
1669119bafbSConrad Meyer uint8_t word = ((state >> ((state >> 6u) + 2u)) ^ state) * 217u;
1679119bafbSConrad Meyer return (word >> 6u) ^ word;
1689119bafbSConrad Meyer }
1699119bafbSConrad Meyer
pcg_output_rxs_m_xs_16_16(uint16_t state)170*43eccfe9SConrad Meyer static inline uint16_t pcg_output_rxs_m_xs_16_16(uint16_t state)
1719119bafbSConrad Meyer {
1729119bafbSConrad Meyer uint16_t word = ((state >> ((state >> 13u) + 3u)) ^ state) * 62169u;
1739119bafbSConrad Meyer return (word >> 11u) ^ word;
1749119bafbSConrad Meyer }
1759119bafbSConrad Meyer
pcg_output_rxs_m_xs_32_32(uint32_t state)176*43eccfe9SConrad Meyer static inline uint32_t pcg_output_rxs_m_xs_32_32(uint32_t state)
1779119bafbSConrad Meyer {
1789119bafbSConrad Meyer uint32_t word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
1799119bafbSConrad Meyer return (word >> 22u) ^ word;
1809119bafbSConrad Meyer }
1819119bafbSConrad Meyer
pcg_output_rxs_m_xs_64_64(uint64_t state)182*43eccfe9SConrad Meyer static inline uint64_t pcg_output_rxs_m_xs_64_64(uint64_t state)
1839119bafbSConrad Meyer {
1849119bafbSConrad Meyer uint64_t word = ((state >> ((state >> 59u) + 5u)) ^ state)
1859119bafbSConrad Meyer * 12605985483714917081ull;
1869119bafbSConrad Meyer return (word >> 43u) ^ word;
1879119bafbSConrad Meyer }
1889119bafbSConrad Meyer
1899119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_rxs_m_xs_128_128(pcg128_t state)190*43eccfe9SConrad Meyer static inline pcg128_t pcg_output_rxs_m_xs_128_128(pcg128_t state)
1919119bafbSConrad Meyer {
1929119bafbSConrad Meyer pcg128_t word = ((state >> ((state >> 122u) + 6u)) ^ state)
1939119bafbSConrad Meyer * (PCG_128BIT_CONSTANT(17766728186571221404ULL,
1949119bafbSConrad Meyer 12605985483714917081ULL));
1959119bafbSConrad Meyer /* 327738287884841127335028083622016905945 */
1969119bafbSConrad Meyer return (word >> 86u) ^ word;
1979119bafbSConrad Meyer }
1989119bafbSConrad Meyer #endif
1999119bafbSConrad Meyer
2009119bafbSConrad Meyer /* RXS M */
2019119bafbSConrad Meyer
pcg_output_rxs_m_16_8(uint16_t state)202*43eccfe9SConrad Meyer static inline uint8_t pcg_output_rxs_m_16_8(uint16_t state)
2039119bafbSConrad Meyer {
2049119bafbSConrad Meyer return (((state >> ((state >> 13u) + 3u)) ^ state) * 62169u) >> 8u;
2059119bafbSConrad Meyer }
2069119bafbSConrad Meyer
pcg_output_rxs_m_32_16(uint32_t state)207*43eccfe9SConrad Meyer static inline uint16_t pcg_output_rxs_m_32_16(uint32_t state)
2089119bafbSConrad Meyer {
2099119bafbSConrad Meyer return (((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u) >> 16u;
2109119bafbSConrad Meyer }
2119119bafbSConrad Meyer
pcg_output_rxs_m_64_32(uint64_t state)212*43eccfe9SConrad Meyer static inline uint32_t pcg_output_rxs_m_64_32(uint64_t state)
2139119bafbSConrad Meyer {
2149119bafbSConrad Meyer return (((state >> ((state >> 59u) + 5u)) ^ state)
2159119bafbSConrad Meyer * 12605985483714917081ull) >> 32u;
2169119bafbSConrad Meyer }
2179119bafbSConrad Meyer
2189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_rxs_m_128_64(pcg128_t state)219*43eccfe9SConrad Meyer static inline uint64_t pcg_output_rxs_m_128_64(pcg128_t state)
2209119bafbSConrad Meyer {
2219119bafbSConrad Meyer return (((state >> ((state >> 122u) + 6u)) ^ state)
2229119bafbSConrad Meyer * (PCG_128BIT_CONSTANT(17766728186571221404ULL,
2239119bafbSConrad Meyer 12605985483714917081ULL))) >> 64u;
2249119bafbSConrad Meyer /* 327738287884841127335028083622016905945 */
2259119bafbSConrad Meyer }
2269119bafbSConrad Meyer #endif
2279119bafbSConrad Meyer
2289119bafbSConrad Meyer /* XSL RR (only defined for >= 64 bits) */
2299119bafbSConrad Meyer
pcg_output_xsl_rr_64_32(uint64_t state)230*43eccfe9SConrad Meyer static inline uint32_t pcg_output_xsl_rr_64_32(uint64_t state)
2319119bafbSConrad Meyer {
2329119bafbSConrad Meyer return pcg_rotr_32(((uint32_t)(state >> 32u)) ^ (uint32_t)state,
2339119bafbSConrad Meyer state >> 59u);
2349119bafbSConrad Meyer }
2359119bafbSConrad Meyer
2369119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_xsl_rr_128_64(pcg128_t state)237*43eccfe9SConrad Meyer static inline uint64_t pcg_output_xsl_rr_128_64(pcg128_t state)
2389119bafbSConrad Meyer {
2399119bafbSConrad Meyer return pcg_rotr_64(((uint64_t)(state >> 64u)) ^ (uint64_t)state,
2409119bafbSConrad Meyer state >> 122u);
2419119bafbSConrad Meyer }
2429119bafbSConrad Meyer #endif
2439119bafbSConrad Meyer
2449119bafbSConrad Meyer /* XSL RR RR (only defined for >= 64 bits) */
2459119bafbSConrad Meyer
pcg_output_xsl_rr_rr_64_64(uint64_t state)246*43eccfe9SConrad Meyer static inline uint64_t pcg_output_xsl_rr_rr_64_64(uint64_t state)
2479119bafbSConrad Meyer {
2489119bafbSConrad Meyer uint32_t rot1 = (uint32_t)(state >> 59u);
2499119bafbSConrad Meyer uint32_t high = (uint32_t)(state >> 32u);
2509119bafbSConrad Meyer uint32_t low = (uint32_t)state;
2519119bafbSConrad Meyer uint32_t xored = high ^ low;
2529119bafbSConrad Meyer uint32_t newlow = pcg_rotr_32(xored, rot1);
2539119bafbSConrad Meyer uint32_t newhigh = pcg_rotr_32(high, newlow & 31u);
2549119bafbSConrad Meyer return (((uint64_t)newhigh) << 32u) | newlow;
2559119bafbSConrad Meyer }
2569119bafbSConrad Meyer
2579119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_output_xsl_rr_rr_128_128(pcg128_t state)258*43eccfe9SConrad Meyer static inline pcg128_t pcg_output_xsl_rr_rr_128_128(pcg128_t state)
2599119bafbSConrad Meyer {
2609119bafbSConrad Meyer uint32_t rot1 = (uint32_t)(state >> 122u);
2619119bafbSConrad Meyer uint64_t high = (uint64_t)(state >> 64u);
2629119bafbSConrad Meyer uint64_t low = (uint64_t)state;
2639119bafbSConrad Meyer uint64_t xored = high ^ low;
2649119bafbSConrad Meyer uint64_t newlow = pcg_rotr_64(xored, rot1);
2659119bafbSConrad Meyer uint64_t newhigh = pcg_rotr_64(high, newlow & 63u);
2669119bafbSConrad Meyer return (((pcg128_t)newhigh) << 64u) | newlow;
2679119bafbSConrad Meyer }
2689119bafbSConrad Meyer #endif
2699119bafbSConrad Meyer
2709119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_8 141U
2719119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_16 12829U
2729119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_32 747796405U
2739119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_64 6364136223846793005ULL
2749119bafbSConrad Meyer
2759119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_8 77U
2769119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_16 47989U
2779119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_32 2891336453U
2789119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_64 1442695040888963407ULL
2799119bafbSConrad Meyer
2809119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2819119bafbSConrad Meyer #define PCG_DEFAULT_MULTIPLIER_128 \
2829119bafbSConrad Meyer PCG_128BIT_CONSTANT(2549297995355413924ULL,4865540595714422341ULL)
2839119bafbSConrad Meyer #define PCG_DEFAULT_INCREMENT_128 \
2849119bafbSConrad Meyer PCG_128BIT_CONSTANT(6364136223846793005ULL,1442695040888963407ULL)
2859119bafbSConrad Meyer #endif
2869119bafbSConrad Meyer
2879119bafbSConrad Meyer /*
2889119bafbSConrad Meyer * Static initialization constants (if you can't call srandom for some
2899119bafbSConrad Meyer * bizarre reason).
2909119bafbSConrad Meyer */
2919119bafbSConrad Meyer
2929119bafbSConrad Meyer #define PCG_STATE_ONESEQ_8_INITIALIZER { 0xd7U }
2939119bafbSConrad Meyer #define PCG_STATE_ONESEQ_16_INITIALIZER { 0x20dfU }
2949119bafbSConrad Meyer #define PCG_STATE_ONESEQ_32_INITIALIZER { 0x46b56677U }
2959119bafbSConrad Meyer #define PCG_STATE_ONESEQ_64_INITIALIZER { 0x4d595df4d0f33173ULL }
2969119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2979119bafbSConrad Meyer #define PCG_STATE_ONESEQ_128_INITIALIZER \
2989119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0xb8dc10e158a92392ULL, 0x98046df007ec0a53ULL) }
2999119bafbSConrad Meyer #endif
3009119bafbSConrad Meyer
3019119bafbSConrad Meyer #define PCG_STATE_UNIQUE_8_INITIALIZER PCG_STATE_ONESEQ_8_INITIALIZER
3029119bafbSConrad Meyer #define PCG_STATE_UNIQUE_16_INITIALIZER PCG_STATE_ONESEQ_16_INITIALIZER
3039119bafbSConrad Meyer #define PCG_STATE_UNIQUE_32_INITIALIZER PCG_STATE_ONESEQ_32_INITIALIZER
3049119bafbSConrad Meyer #define PCG_STATE_UNIQUE_64_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER
3059119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3069119bafbSConrad Meyer #define PCG_STATE_UNIQUE_128_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER
3079119bafbSConrad Meyer #endif
3089119bafbSConrad Meyer
3099119bafbSConrad Meyer #define PCG_STATE_MCG_8_INITIALIZER { 0xe5U }
3109119bafbSConrad Meyer #define PCG_STATE_MCG_16_INITIALIZER { 0xa5e5U }
3119119bafbSConrad Meyer #define PCG_STATE_MCG_32_INITIALIZER { 0xd15ea5e5U }
3129119bafbSConrad Meyer #define PCG_STATE_MCG_64_INITIALIZER { 0xcafef00dd15ea5e5ULL }
3139119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3149119bafbSConrad Meyer #define PCG_STATE_MCG_128_INITIALIZER \
3159119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0x0000000000000000ULL, 0xcafef00dd15ea5e5ULL) }
3169119bafbSConrad Meyer #endif
3179119bafbSConrad Meyer
3189119bafbSConrad Meyer #define PCG_STATE_SETSEQ_8_INITIALIZER { 0x9bU, 0xdbU }
3199119bafbSConrad Meyer #define PCG_STATE_SETSEQ_16_INITIALIZER { 0xe39bU, 0x5bdbU }
3209119bafbSConrad Meyer #define PCG_STATE_SETSEQ_32_INITIALIZER { 0xec02d89bU, 0x94b95bdbU }
3219119bafbSConrad Meyer #define PCG_STATE_SETSEQ_64_INITIALIZER \
3229119bafbSConrad Meyer { 0x853c49e6748fea9bULL, 0xda3e39cb94b95bdbULL }
3239119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3249119bafbSConrad Meyer #define PCG_STATE_SETSEQ_128_INITIALIZER \
3259119bafbSConrad Meyer { PCG_128BIT_CONSTANT(0x979c9a98d8462005ULL, 0x7d3e9cb6cfe0549bULL), \
3269119bafbSConrad Meyer PCG_128BIT_CONSTANT(0x0000000000000001ULL, 0xda3e39cb94b95bdbULL) }
3279119bafbSConrad Meyer #endif
3289119bafbSConrad Meyer
3299119bafbSConrad Meyer /* Representations for the oneseq, mcg, and unique variants */
3309119bafbSConrad Meyer
3319119bafbSConrad Meyer struct pcg_state_8 {
3329119bafbSConrad Meyer uint8_t state;
3339119bafbSConrad Meyer };
3349119bafbSConrad Meyer
3359119bafbSConrad Meyer struct pcg_state_16 {
3369119bafbSConrad Meyer uint16_t state;
3379119bafbSConrad Meyer };
3389119bafbSConrad Meyer
3399119bafbSConrad Meyer struct pcg_state_32 {
3409119bafbSConrad Meyer uint32_t state;
3419119bafbSConrad Meyer };
3429119bafbSConrad Meyer
3439119bafbSConrad Meyer struct pcg_state_64 {
3449119bafbSConrad Meyer uint64_t state;
3459119bafbSConrad Meyer };
3469119bafbSConrad Meyer
3479119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3489119bafbSConrad Meyer struct pcg_state_128 {
3499119bafbSConrad Meyer pcg128_t state;
3509119bafbSConrad Meyer };
3519119bafbSConrad Meyer #endif
3529119bafbSConrad Meyer
3539119bafbSConrad Meyer /* Representations setseq variants */
3549119bafbSConrad Meyer
3559119bafbSConrad Meyer struct pcg_state_setseq_8 {
3569119bafbSConrad Meyer uint8_t state;
3579119bafbSConrad Meyer uint8_t inc;
3589119bafbSConrad Meyer };
3599119bafbSConrad Meyer
3609119bafbSConrad Meyer struct pcg_state_setseq_16 {
3619119bafbSConrad Meyer uint16_t state;
3629119bafbSConrad Meyer uint16_t inc;
3639119bafbSConrad Meyer };
3649119bafbSConrad Meyer
3659119bafbSConrad Meyer struct pcg_state_setseq_32 {
3669119bafbSConrad Meyer uint32_t state;
3679119bafbSConrad Meyer uint32_t inc;
3689119bafbSConrad Meyer };
3699119bafbSConrad Meyer
3709119bafbSConrad Meyer struct pcg_state_setseq_64 {
3719119bafbSConrad Meyer uint64_t state;
3729119bafbSConrad Meyer uint64_t inc;
3739119bafbSConrad Meyer };
3749119bafbSConrad Meyer
3759119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3769119bafbSConrad Meyer struct pcg_state_setseq_128 {
3779119bafbSConrad Meyer pcg128_t state;
3789119bafbSConrad Meyer pcg128_t inc;
3799119bafbSConrad Meyer };
3809119bafbSConrad Meyer #endif
3819119bafbSConrad Meyer
3829119bafbSConrad Meyer /* Multi-step advance functions (jump-ahead, jump-back) */
3839119bafbSConrad Meyer
3849119bafbSConrad Meyer extern uint8_t pcg_advance_lcg_8(uint8_t state, uint8_t delta, uint8_t cur_mult,
3859119bafbSConrad Meyer uint8_t cur_plus);
3869119bafbSConrad Meyer extern uint16_t pcg_advance_lcg_16(uint16_t state, uint16_t delta,
3879119bafbSConrad Meyer uint16_t cur_mult, uint16_t cur_plus);
3889119bafbSConrad Meyer extern uint32_t pcg_advance_lcg_32(uint32_t state, uint32_t delta,
3899119bafbSConrad Meyer uint32_t cur_mult, uint32_t cur_plus);
3909119bafbSConrad Meyer extern uint64_t pcg_advance_lcg_64(uint64_t state, uint64_t delta,
3919119bafbSConrad Meyer uint64_t cur_mult, uint64_t cur_plus);
3929119bafbSConrad Meyer
3939119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
3949119bafbSConrad Meyer extern pcg128_t pcg_advance_lcg_128(pcg128_t state, pcg128_t delta,
3959119bafbSConrad Meyer pcg128_t cur_mult, pcg128_t cur_plus);
3969119bafbSConrad Meyer #endif
3979119bafbSConrad Meyer
3989119bafbSConrad Meyer /* Functions to advance the underlying LCG, one version for each size and
3999119bafbSConrad Meyer * each style. These functions are considered semi-private. There is rarely
4009119bafbSConrad Meyer * a good reason to call them directly.
4019119bafbSConrad Meyer */
4029119bafbSConrad Meyer
pcg_oneseq_8_step_r(struct pcg_state_8 * rng)403*43eccfe9SConrad Meyer static inline void pcg_oneseq_8_step_r(struct pcg_state_8* rng)
4049119bafbSConrad Meyer {
4059119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8
4069119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_8;
4079119bafbSConrad Meyer }
4089119bafbSConrad Meyer
pcg_oneseq_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)409*43eccfe9SConrad Meyer static inline void pcg_oneseq_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
4109119bafbSConrad Meyer {
4119119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
4129119bafbSConrad Meyer PCG_DEFAULT_INCREMENT_8);
4139119bafbSConrad Meyer }
4149119bafbSConrad Meyer
pcg_mcg_8_step_r(struct pcg_state_8 * rng)415*43eccfe9SConrad Meyer static inline void pcg_mcg_8_step_r(struct pcg_state_8* rng)
4169119bafbSConrad Meyer {
4179119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8;
4189119bafbSConrad Meyer }
4199119bafbSConrad Meyer
pcg_mcg_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)420*43eccfe9SConrad Meyer static inline void pcg_mcg_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
4219119bafbSConrad Meyer {
4229119bafbSConrad Meyer rng->state
4239119bafbSConrad Meyer = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8, 0u);
4249119bafbSConrad Meyer }
4259119bafbSConrad Meyer
pcg_unique_8_step_r(struct pcg_state_8 * rng)426*43eccfe9SConrad Meyer static inline void pcg_unique_8_step_r(struct pcg_state_8* rng)
4279119bafbSConrad Meyer {
4289119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8
4299119bafbSConrad Meyer + (uint8_t)(((intptr_t)rng) | 1u);
4309119bafbSConrad Meyer }
4319119bafbSConrad Meyer
pcg_unique_8_advance_r(struct pcg_state_8 * rng,uint8_t delta)432*43eccfe9SConrad Meyer static inline void pcg_unique_8_advance_r(struct pcg_state_8* rng, uint8_t delta)
4339119bafbSConrad Meyer {
4349119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
4359119bafbSConrad Meyer (uint8_t)(((intptr_t)rng) | 1u));
4369119bafbSConrad Meyer }
4379119bafbSConrad Meyer
pcg_setseq_8_step_r(struct pcg_state_setseq_8 * rng)438*43eccfe9SConrad Meyer static inline void pcg_setseq_8_step_r(struct pcg_state_setseq_8* rng)
4399119bafbSConrad Meyer {
4409119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_8 + rng->inc;
4419119bafbSConrad Meyer }
4429119bafbSConrad Meyer
pcg_setseq_8_advance_r(struct pcg_state_setseq_8 * rng,uint8_t delta)443*43eccfe9SConrad Meyer static inline void pcg_setseq_8_advance_r(struct pcg_state_setseq_8* rng,
4449119bafbSConrad Meyer uint8_t delta)
4459119bafbSConrad Meyer {
4469119bafbSConrad Meyer rng->state = pcg_advance_lcg_8(rng->state, delta, PCG_DEFAULT_MULTIPLIER_8,
4479119bafbSConrad Meyer rng->inc);
4489119bafbSConrad Meyer }
4499119bafbSConrad Meyer
pcg_oneseq_16_step_r(struct pcg_state_16 * rng)450*43eccfe9SConrad Meyer static inline void pcg_oneseq_16_step_r(struct pcg_state_16* rng)
4519119bafbSConrad Meyer {
4529119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16
4539119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_16;
4549119bafbSConrad Meyer }
4559119bafbSConrad Meyer
pcg_oneseq_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)456*43eccfe9SConrad Meyer static inline void pcg_oneseq_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
4579119bafbSConrad Meyer {
4589119bafbSConrad Meyer rng->state = pcg_advance_lcg_16(
4599119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, PCG_DEFAULT_INCREMENT_16);
4609119bafbSConrad Meyer }
4619119bafbSConrad Meyer
pcg_mcg_16_step_r(struct pcg_state_16 * rng)462*43eccfe9SConrad Meyer static inline void pcg_mcg_16_step_r(struct pcg_state_16* rng)
4639119bafbSConrad Meyer {
4649119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16;
4659119bafbSConrad Meyer }
4669119bafbSConrad Meyer
pcg_mcg_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)467*43eccfe9SConrad Meyer static inline void pcg_mcg_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
4689119bafbSConrad Meyer {
4699119bafbSConrad Meyer rng->state
4709119bafbSConrad Meyer = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16, 0u);
4719119bafbSConrad Meyer }
4729119bafbSConrad Meyer
pcg_unique_16_step_r(struct pcg_state_16 * rng)473*43eccfe9SConrad Meyer static inline void pcg_unique_16_step_r(struct pcg_state_16* rng)
4749119bafbSConrad Meyer {
4759119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16
4769119bafbSConrad Meyer + (uint16_t)(((intptr_t)rng) | 1u);
4779119bafbSConrad Meyer }
4789119bafbSConrad Meyer
pcg_unique_16_advance_r(struct pcg_state_16 * rng,uint16_t delta)479*43eccfe9SConrad Meyer static inline void pcg_unique_16_advance_r(struct pcg_state_16* rng, uint16_t delta)
4809119bafbSConrad Meyer {
4819119bafbSConrad Meyer rng->state
4829119bafbSConrad Meyer = pcg_advance_lcg_16(rng->state, delta, PCG_DEFAULT_MULTIPLIER_16,
4839119bafbSConrad Meyer (uint16_t)(((intptr_t)rng) | 1u));
4849119bafbSConrad Meyer }
4859119bafbSConrad Meyer
pcg_setseq_16_step_r(struct pcg_state_setseq_16 * rng)486*43eccfe9SConrad Meyer static inline void pcg_setseq_16_step_r(struct pcg_state_setseq_16* rng)
4879119bafbSConrad Meyer {
4889119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_16 + rng->inc;
4899119bafbSConrad Meyer }
4909119bafbSConrad Meyer
pcg_setseq_16_advance_r(struct pcg_state_setseq_16 * rng,uint16_t delta)491*43eccfe9SConrad Meyer static inline void pcg_setseq_16_advance_r(struct pcg_state_setseq_16* rng,
4929119bafbSConrad Meyer uint16_t delta)
4939119bafbSConrad Meyer {
4949119bafbSConrad Meyer rng->state = pcg_advance_lcg_16(rng->state, delta,
4959119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_16, rng->inc);
4969119bafbSConrad Meyer }
4979119bafbSConrad Meyer
pcg_oneseq_32_step_r(struct pcg_state_32 * rng)498*43eccfe9SConrad Meyer static inline void pcg_oneseq_32_step_r(struct pcg_state_32* rng)
4999119bafbSConrad Meyer {
5009119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32
5019119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_32;
5029119bafbSConrad Meyer }
5039119bafbSConrad Meyer
pcg_oneseq_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)504*43eccfe9SConrad Meyer static inline void pcg_oneseq_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
5059119bafbSConrad Meyer {
5069119bafbSConrad Meyer rng->state = pcg_advance_lcg_32(
5079119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, PCG_DEFAULT_INCREMENT_32);
5089119bafbSConrad Meyer }
5099119bafbSConrad Meyer
pcg_mcg_32_step_r(struct pcg_state_32 * rng)510*43eccfe9SConrad Meyer static inline void pcg_mcg_32_step_r(struct pcg_state_32* rng)
5119119bafbSConrad Meyer {
5129119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32;
5139119bafbSConrad Meyer }
5149119bafbSConrad Meyer
pcg_mcg_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)515*43eccfe9SConrad Meyer static inline void pcg_mcg_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
5169119bafbSConrad Meyer {
5179119bafbSConrad Meyer rng->state
5189119bafbSConrad Meyer = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32, 0u);
5199119bafbSConrad Meyer }
5209119bafbSConrad Meyer
pcg_unique_32_step_r(struct pcg_state_32 * rng)521*43eccfe9SConrad Meyer static inline void pcg_unique_32_step_r(struct pcg_state_32* rng)
5229119bafbSConrad Meyer {
5239119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32
5249119bafbSConrad Meyer + (uint32_t)(((intptr_t)rng) | 1u);
5259119bafbSConrad Meyer }
5269119bafbSConrad Meyer
pcg_unique_32_advance_r(struct pcg_state_32 * rng,uint32_t delta)527*43eccfe9SConrad Meyer static inline void pcg_unique_32_advance_r(struct pcg_state_32* rng, uint32_t delta)
5289119bafbSConrad Meyer {
5299119bafbSConrad Meyer rng->state
5309119bafbSConrad Meyer = pcg_advance_lcg_32(rng->state, delta, PCG_DEFAULT_MULTIPLIER_32,
5319119bafbSConrad Meyer (uint32_t)(((intptr_t)rng) | 1u));
5329119bafbSConrad Meyer }
5339119bafbSConrad Meyer
pcg_setseq_32_step_r(struct pcg_state_setseq_32 * rng)534*43eccfe9SConrad Meyer static inline void pcg_setseq_32_step_r(struct pcg_state_setseq_32* rng)
5359119bafbSConrad Meyer {
5369119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_32 + rng->inc;
5379119bafbSConrad Meyer }
5389119bafbSConrad Meyer
pcg_setseq_32_advance_r(struct pcg_state_setseq_32 * rng,uint32_t delta)539*43eccfe9SConrad Meyer static inline void pcg_setseq_32_advance_r(struct pcg_state_setseq_32* rng,
5409119bafbSConrad Meyer uint32_t delta)
5419119bafbSConrad Meyer {
5429119bafbSConrad Meyer rng->state = pcg_advance_lcg_32(rng->state, delta,
5439119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_32, rng->inc);
5449119bafbSConrad Meyer }
5459119bafbSConrad Meyer
pcg_oneseq_64_step_r(struct pcg_state_64 * rng)546*43eccfe9SConrad Meyer static inline void pcg_oneseq_64_step_r(struct pcg_state_64* rng)
5479119bafbSConrad Meyer {
5489119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64
5499119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_64;
5509119bafbSConrad Meyer }
5519119bafbSConrad Meyer
pcg_oneseq_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)552*43eccfe9SConrad Meyer static inline void pcg_oneseq_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
5539119bafbSConrad Meyer {
5549119bafbSConrad Meyer rng->state = pcg_advance_lcg_64(
5559119bafbSConrad Meyer rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, PCG_DEFAULT_INCREMENT_64);
5569119bafbSConrad Meyer }
5579119bafbSConrad Meyer
pcg_mcg_64_step_r(struct pcg_state_64 * rng)558*43eccfe9SConrad Meyer static inline void pcg_mcg_64_step_r(struct pcg_state_64* rng)
5599119bafbSConrad Meyer {
5609119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64;
5619119bafbSConrad Meyer }
5629119bafbSConrad Meyer
pcg_mcg_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)563*43eccfe9SConrad Meyer static inline void pcg_mcg_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
5649119bafbSConrad Meyer {
5659119bafbSConrad Meyer rng->state
5669119bafbSConrad Meyer = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64, 0u);
5679119bafbSConrad Meyer }
5689119bafbSConrad Meyer
pcg_unique_64_step_r(struct pcg_state_64 * rng)569*43eccfe9SConrad Meyer static inline void pcg_unique_64_step_r(struct pcg_state_64* rng)
5709119bafbSConrad Meyer {
5719119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64
5729119bafbSConrad Meyer + (uint64_t)(((intptr_t)rng) | 1u);
5739119bafbSConrad Meyer }
5749119bafbSConrad Meyer
pcg_unique_64_advance_r(struct pcg_state_64 * rng,uint64_t delta)575*43eccfe9SConrad Meyer static inline void pcg_unique_64_advance_r(struct pcg_state_64* rng, uint64_t delta)
5769119bafbSConrad Meyer {
5779119bafbSConrad Meyer rng->state
5789119bafbSConrad Meyer = pcg_advance_lcg_64(rng->state, delta, PCG_DEFAULT_MULTIPLIER_64,
5799119bafbSConrad Meyer (uint64_t)(((intptr_t)rng) | 1u));
5809119bafbSConrad Meyer }
5819119bafbSConrad Meyer
pcg_setseq_64_step_r(struct pcg_state_setseq_64 * rng)582*43eccfe9SConrad Meyer static inline void pcg_setseq_64_step_r(struct pcg_state_setseq_64* rng)
5839119bafbSConrad Meyer {
5849119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_64 + rng->inc;
5859119bafbSConrad Meyer }
5869119bafbSConrad Meyer
pcg_setseq_64_advance_r(struct pcg_state_setseq_64 * rng,uint64_t delta)587*43eccfe9SConrad Meyer static inline void pcg_setseq_64_advance_r(struct pcg_state_setseq_64* rng,
5889119bafbSConrad Meyer uint64_t delta)
5899119bafbSConrad Meyer {
5909119bafbSConrad Meyer rng->state = pcg_advance_lcg_64(rng->state, delta,
5919119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_64, rng->inc);
5929119bafbSConrad Meyer }
5939119bafbSConrad Meyer
5949119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_step_r(struct pcg_state_128 * rng)595*43eccfe9SConrad Meyer static inline void pcg_oneseq_128_step_r(struct pcg_state_128* rng)
5969119bafbSConrad Meyer {
5979119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128
5989119bafbSConrad Meyer + PCG_DEFAULT_INCREMENT_128;
5999119bafbSConrad Meyer }
6009119bafbSConrad Meyer #endif
6019119bafbSConrad Meyer
6029119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)603*43eccfe9SConrad Meyer static inline void pcg_oneseq_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
6049119bafbSConrad Meyer {
6059119bafbSConrad Meyer rng->state
6069119bafbSConrad Meyer = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128,
6079119bafbSConrad Meyer PCG_DEFAULT_INCREMENT_128);
6089119bafbSConrad Meyer }
6099119bafbSConrad Meyer #endif
6109119bafbSConrad Meyer
6119119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_step_r(struct pcg_state_128 * rng)612*43eccfe9SConrad Meyer static inline void pcg_mcg_128_step_r(struct pcg_state_128* rng)
6139119bafbSConrad Meyer {
6149119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128;
6159119bafbSConrad Meyer }
6169119bafbSConrad Meyer #endif
6179119bafbSConrad Meyer
6189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)619*43eccfe9SConrad Meyer static inline void pcg_mcg_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
6209119bafbSConrad Meyer {
6219119bafbSConrad Meyer rng->state = pcg_advance_lcg_128(rng->state, delta,
6229119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_128, 0u);
6239119bafbSConrad Meyer }
6249119bafbSConrad Meyer #endif
6259119bafbSConrad Meyer
6269119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_step_r(struct pcg_state_128 * rng)627*43eccfe9SConrad Meyer static inline void pcg_unique_128_step_r(struct pcg_state_128* rng)
6289119bafbSConrad Meyer {
6299119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128
6309119bafbSConrad Meyer + (pcg128_t)(((intptr_t)rng) | 1u);
6319119bafbSConrad Meyer }
6329119bafbSConrad Meyer #endif
6339119bafbSConrad Meyer
6349119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_advance_r(struct pcg_state_128 * rng,pcg128_t delta)635*43eccfe9SConrad Meyer static inline void pcg_unique_128_advance_r(struct pcg_state_128* rng, pcg128_t delta)
6369119bafbSConrad Meyer {
6379119bafbSConrad Meyer rng->state
6389119bafbSConrad Meyer = pcg_advance_lcg_128(rng->state, delta, PCG_DEFAULT_MULTIPLIER_128,
6399119bafbSConrad Meyer (pcg128_t)(((intptr_t)rng) | 1u));
6409119bafbSConrad Meyer }
6419119bafbSConrad Meyer #endif
6429119bafbSConrad Meyer
6439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_setseq_128_step_r(struct pcg_state_setseq_128 * rng)644*43eccfe9SConrad Meyer static inline void pcg_setseq_128_step_r(struct pcg_state_setseq_128* rng)
6459119bafbSConrad Meyer {
6469119bafbSConrad Meyer rng->state = rng->state * PCG_DEFAULT_MULTIPLIER_128 + rng->inc;
6479119bafbSConrad Meyer }
6489119bafbSConrad Meyer #endif
6499119bafbSConrad Meyer
6509119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_setseq_128_advance_r(struct pcg_state_setseq_128 * rng,pcg128_t delta)651*43eccfe9SConrad Meyer static inline void pcg_setseq_128_advance_r(struct pcg_state_setseq_128* rng,
6529119bafbSConrad Meyer pcg128_t delta)
6539119bafbSConrad Meyer {
6549119bafbSConrad Meyer rng->state = pcg_advance_lcg_128(rng->state, delta,
6559119bafbSConrad Meyer PCG_DEFAULT_MULTIPLIER_128, rng->inc);
6569119bafbSConrad Meyer }
6579119bafbSConrad Meyer #endif
6589119bafbSConrad Meyer
6599119bafbSConrad Meyer /* Functions to seed the RNG state, one version for each size and each
6609119bafbSConrad Meyer * style. Unlike the step functions, regular users can and should call
6619119bafbSConrad Meyer * these functions.
6629119bafbSConrad Meyer */
6639119bafbSConrad Meyer
pcg_oneseq_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)664*43eccfe9SConrad Meyer static inline void pcg_oneseq_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
6659119bafbSConrad Meyer {
6669119bafbSConrad Meyer rng->state = 0U;
6679119bafbSConrad Meyer pcg_oneseq_8_step_r(rng);
6689119bafbSConrad Meyer rng->state += initstate;
6699119bafbSConrad Meyer pcg_oneseq_8_step_r(rng);
6709119bafbSConrad Meyer }
6719119bafbSConrad Meyer
pcg_mcg_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)672*43eccfe9SConrad Meyer static inline void pcg_mcg_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
6739119bafbSConrad Meyer {
6749119bafbSConrad Meyer rng->state = initstate | 1u;
6759119bafbSConrad Meyer }
6769119bafbSConrad Meyer
pcg_unique_8_srandom_r(struct pcg_state_8 * rng,uint8_t initstate)677*43eccfe9SConrad Meyer static inline void pcg_unique_8_srandom_r(struct pcg_state_8* rng, uint8_t initstate)
6789119bafbSConrad Meyer {
6799119bafbSConrad Meyer rng->state = 0U;
6809119bafbSConrad Meyer pcg_unique_8_step_r(rng);
6819119bafbSConrad Meyer rng->state += initstate;
6829119bafbSConrad Meyer pcg_unique_8_step_r(rng);
6839119bafbSConrad Meyer }
6849119bafbSConrad Meyer
pcg_setseq_8_srandom_r(struct pcg_state_setseq_8 * rng,uint8_t initstate,uint8_t initseq)685*43eccfe9SConrad Meyer static inline void pcg_setseq_8_srandom_r(struct pcg_state_setseq_8* rng,
6869119bafbSConrad Meyer uint8_t initstate, uint8_t initseq)
6879119bafbSConrad Meyer {
6889119bafbSConrad Meyer rng->state = 0U;
6899119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u;
6909119bafbSConrad Meyer pcg_setseq_8_step_r(rng);
6919119bafbSConrad Meyer rng->state += initstate;
6929119bafbSConrad Meyer pcg_setseq_8_step_r(rng);
6939119bafbSConrad Meyer }
6949119bafbSConrad Meyer
pcg_oneseq_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)695*43eccfe9SConrad Meyer static inline void pcg_oneseq_16_srandom_r(struct pcg_state_16* rng,
6969119bafbSConrad Meyer uint16_t initstate)
6979119bafbSConrad Meyer {
6989119bafbSConrad Meyer rng->state = 0U;
6999119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
7009119bafbSConrad Meyer rng->state += initstate;
7019119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
7029119bafbSConrad Meyer }
7039119bafbSConrad Meyer
pcg_mcg_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)704*43eccfe9SConrad Meyer static inline void pcg_mcg_16_srandom_r(struct pcg_state_16* rng, uint16_t initstate)
7059119bafbSConrad Meyer {
7069119bafbSConrad Meyer rng->state = initstate | 1u;
7079119bafbSConrad Meyer }
7089119bafbSConrad Meyer
pcg_unique_16_srandom_r(struct pcg_state_16 * rng,uint16_t initstate)709*43eccfe9SConrad Meyer static inline void pcg_unique_16_srandom_r(struct pcg_state_16* rng,
7109119bafbSConrad Meyer uint16_t initstate)
7119119bafbSConrad Meyer {
7129119bafbSConrad Meyer rng->state = 0U;
7139119bafbSConrad Meyer pcg_unique_16_step_r(rng);
7149119bafbSConrad Meyer rng->state += initstate;
7159119bafbSConrad Meyer pcg_unique_16_step_r(rng);
7169119bafbSConrad Meyer }
7179119bafbSConrad Meyer
pcg_setseq_16_srandom_r(struct pcg_state_setseq_16 * rng,uint16_t initstate,uint16_t initseq)718*43eccfe9SConrad Meyer static inline void pcg_setseq_16_srandom_r(struct pcg_state_setseq_16* rng,
7199119bafbSConrad Meyer uint16_t initstate, uint16_t initseq)
7209119bafbSConrad Meyer {
7219119bafbSConrad Meyer rng->state = 0U;
7229119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u;
7239119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
7249119bafbSConrad Meyer rng->state += initstate;
7259119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
7269119bafbSConrad Meyer }
7279119bafbSConrad Meyer
pcg_oneseq_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)728*43eccfe9SConrad Meyer static inline void pcg_oneseq_32_srandom_r(struct pcg_state_32* rng,
7299119bafbSConrad Meyer uint32_t initstate)
7309119bafbSConrad Meyer {
7319119bafbSConrad Meyer rng->state = 0U;
7329119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
7339119bafbSConrad Meyer rng->state += initstate;
7349119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
7359119bafbSConrad Meyer }
7369119bafbSConrad Meyer
pcg_mcg_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)737*43eccfe9SConrad Meyer static inline void pcg_mcg_32_srandom_r(struct pcg_state_32* rng, uint32_t initstate)
7389119bafbSConrad Meyer {
7399119bafbSConrad Meyer rng->state = initstate | 1u;
7409119bafbSConrad Meyer }
7419119bafbSConrad Meyer
pcg_unique_32_srandom_r(struct pcg_state_32 * rng,uint32_t initstate)742*43eccfe9SConrad Meyer static inline void pcg_unique_32_srandom_r(struct pcg_state_32* rng,
7439119bafbSConrad Meyer uint32_t initstate)
7449119bafbSConrad Meyer {
7459119bafbSConrad Meyer rng->state = 0U;
7469119bafbSConrad Meyer pcg_unique_32_step_r(rng);
7479119bafbSConrad Meyer rng->state += initstate;
7489119bafbSConrad Meyer pcg_unique_32_step_r(rng);
7499119bafbSConrad Meyer }
7509119bafbSConrad Meyer
pcg_setseq_32_srandom_r(struct pcg_state_setseq_32 * rng,uint32_t initstate,uint32_t initseq)751*43eccfe9SConrad Meyer static inline void pcg_setseq_32_srandom_r(struct pcg_state_setseq_32* rng,
7529119bafbSConrad Meyer uint32_t initstate, uint32_t initseq)
7539119bafbSConrad Meyer {
7549119bafbSConrad Meyer rng->state = 0U;
7559119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u;
7569119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
7579119bafbSConrad Meyer rng->state += initstate;
7589119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
7599119bafbSConrad Meyer }
7609119bafbSConrad Meyer
pcg_oneseq_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)761*43eccfe9SConrad Meyer static inline void pcg_oneseq_64_srandom_r(struct pcg_state_64* rng,
7629119bafbSConrad Meyer uint64_t initstate)
7639119bafbSConrad Meyer {
7649119bafbSConrad Meyer rng->state = 0U;
7659119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
7669119bafbSConrad Meyer rng->state += initstate;
7679119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
7689119bafbSConrad Meyer }
7699119bafbSConrad Meyer
pcg_mcg_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)770*43eccfe9SConrad Meyer static inline void pcg_mcg_64_srandom_r(struct pcg_state_64* rng, uint64_t initstate)
7719119bafbSConrad Meyer {
7729119bafbSConrad Meyer rng->state = initstate | 1u;
7739119bafbSConrad Meyer }
7749119bafbSConrad Meyer
pcg_unique_64_srandom_r(struct pcg_state_64 * rng,uint64_t initstate)775*43eccfe9SConrad Meyer static inline void pcg_unique_64_srandom_r(struct pcg_state_64* rng,
7769119bafbSConrad Meyer uint64_t initstate)
7779119bafbSConrad Meyer {
7789119bafbSConrad Meyer rng->state = 0U;
7799119bafbSConrad Meyer pcg_unique_64_step_r(rng);
7809119bafbSConrad Meyer rng->state += initstate;
7819119bafbSConrad Meyer pcg_unique_64_step_r(rng);
7829119bafbSConrad Meyer }
7839119bafbSConrad Meyer
pcg_setseq_64_srandom_r(struct pcg_state_setseq_64 * rng,uint64_t initstate,uint64_t initseq)784*43eccfe9SConrad Meyer static inline void pcg_setseq_64_srandom_r(struct pcg_state_setseq_64* rng,
7859119bafbSConrad Meyer uint64_t initstate, uint64_t initseq)
7869119bafbSConrad Meyer {
7879119bafbSConrad Meyer rng->state = 0U;
7889119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u;
7899119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
7909119bafbSConrad Meyer rng->state += initstate;
7919119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
7929119bafbSConrad Meyer }
7939119bafbSConrad Meyer
7949119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)795*43eccfe9SConrad Meyer static inline void pcg_oneseq_128_srandom_r(struct pcg_state_128* rng,
7969119bafbSConrad Meyer pcg128_t initstate)
7979119bafbSConrad Meyer {
7989119bafbSConrad Meyer rng->state = 0U;
7999119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
8009119bafbSConrad Meyer rng->state += initstate;
8019119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
8029119bafbSConrad Meyer }
8039119bafbSConrad Meyer #endif
8049119bafbSConrad Meyer
8059119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)806*43eccfe9SConrad Meyer static inline void pcg_mcg_128_srandom_r(struct pcg_state_128* rng, pcg128_t initstate)
8079119bafbSConrad Meyer {
8089119bafbSConrad Meyer rng->state = initstate | 1u;
8099119bafbSConrad Meyer }
8109119bafbSConrad Meyer #endif
8119119bafbSConrad Meyer
8129119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_srandom_r(struct pcg_state_128 * rng,pcg128_t initstate)813*43eccfe9SConrad Meyer static inline void pcg_unique_128_srandom_r(struct pcg_state_128* rng,
8149119bafbSConrad Meyer pcg128_t initstate)
8159119bafbSConrad Meyer {
8169119bafbSConrad Meyer rng->state = 0U;
8179119bafbSConrad Meyer pcg_unique_128_step_r(rng);
8189119bafbSConrad Meyer rng->state += initstate;
8199119bafbSConrad Meyer pcg_unique_128_step_r(rng);
8209119bafbSConrad Meyer }
8219119bafbSConrad Meyer #endif
8229119bafbSConrad Meyer
8239119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_setseq_128_srandom_r(struct pcg_state_setseq_128 * rng,pcg128_t initstate,pcg128_t initseq)824*43eccfe9SConrad Meyer static inline void pcg_setseq_128_srandom_r(struct pcg_state_setseq_128* rng,
8259119bafbSConrad Meyer pcg128_t initstate, pcg128_t initseq)
8269119bafbSConrad Meyer {
8279119bafbSConrad Meyer rng->state = 0U;
8289119bafbSConrad Meyer rng->inc = (initseq << 1u) | 1u;
8299119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
8309119bafbSConrad Meyer rng->state += initstate;
8319119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
8329119bafbSConrad Meyer }
8339119bafbSConrad Meyer #endif
8349119bafbSConrad Meyer
8359119bafbSConrad Meyer /* Now, finally we create each of the individual generators. We provide
8369119bafbSConrad Meyer * a random_r function that provides a random number of the appropriate
8379119bafbSConrad Meyer * type (using the full range of the type) and a boundedrand_r version
8389119bafbSConrad Meyer * that provides
8399119bafbSConrad Meyer *
8409119bafbSConrad Meyer * Implementation notes for boundedrand_r:
8419119bafbSConrad Meyer *
8429119bafbSConrad Meyer * To avoid bias, we need to make the range of the RNG a multiple of
8439119bafbSConrad Meyer * bound, which we do by dropping output less than a threshold.
8449119bafbSConrad Meyer * Let's consider a 32-bit case... A naive scheme to calculate the
8459119bafbSConrad Meyer * threshold would be to do
8469119bafbSConrad Meyer *
8479119bafbSConrad Meyer * uint32_t threshold = 0x100000000ull % bound;
8489119bafbSConrad Meyer *
8499119bafbSConrad Meyer * but 64-bit div/mod is slower than 32-bit div/mod (especially on
8509119bafbSConrad Meyer * 32-bit platforms). In essence, we do
8519119bafbSConrad Meyer *
8529119bafbSConrad Meyer * uint32_t threshold = (0x100000000ull-bound) % bound;
8539119bafbSConrad Meyer *
8549119bafbSConrad Meyer * because this version will calculate the same modulus, but the LHS
8559119bafbSConrad Meyer * value is less than 2^32.
8569119bafbSConrad Meyer *
8579119bafbSConrad Meyer * (Note that using modulo is only wise for good RNGs, poorer RNGs
8589119bafbSConrad Meyer * such as raw LCGs do better using a technique based on division.)
8599119bafbSConrad Meyer * Empricical tests show that division is preferable to modulus for
8609119bafbSConrad Meyer * reducting the range of an RNG. It's faster, and sometimes it can
8619119bafbSConrad Meyer * even be statistically prefereable.
8629119bafbSConrad Meyer */
8639119bafbSConrad Meyer
8649119bafbSConrad Meyer /* Generation functions for XSH RS */
8659119bafbSConrad Meyer
pcg_oneseq_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)866*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
8679119bafbSConrad Meyer {
8689119bafbSConrad Meyer uint16_t oldstate = rng->state;
8699119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
8709119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate);
8719119bafbSConrad Meyer }
8729119bafbSConrad Meyer
pcg_oneseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)873*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
8749119bafbSConrad Meyer uint8_t bound)
8759119bafbSConrad Meyer {
8769119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
8779119bafbSConrad Meyer for (;;) {
8789119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_xsh_rs_8_random_r(rng);
8799119bafbSConrad Meyer if (r >= threshold)
8809119bafbSConrad Meyer return r % bound;
8819119bafbSConrad Meyer }
8829119bafbSConrad Meyer }
8839119bafbSConrad Meyer
pcg_oneseq_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)884*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
8859119bafbSConrad Meyer {
8869119bafbSConrad Meyer uint32_t oldstate = rng->state;
8879119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
8889119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate);
8899119bafbSConrad Meyer }
8909119bafbSConrad Meyer
pcg_oneseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)891*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
8929119bafbSConrad Meyer uint16_t bound)
8939119bafbSConrad Meyer {
8949119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
8959119bafbSConrad Meyer for (;;) {
8969119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_xsh_rs_16_random_r(rng);
8979119bafbSConrad Meyer if (r >= threshold)
8989119bafbSConrad Meyer return r % bound;
8999119bafbSConrad Meyer }
9009119bafbSConrad Meyer }
9019119bafbSConrad Meyer
pcg_oneseq_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)902*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
9039119bafbSConrad Meyer {
9049119bafbSConrad Meyer uint64_t oldstate = rng->state;
9059119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
9069119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate);
9079119bafbSConrad Meyer }
9089119bafbSConrad Meyer
pcg_oneseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)909*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
9109119bafbSConrad Meyer uint32_t bound)
9119119bafbSConrad Meyer {
9129119bafbSConrad Meyer uint32_t threshold = -bound % bound;
9139119bafbSConrad Meyer for (;;) {
9149119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsh_rs_32_random_r(rng);
9159119bafbSConrad Meyer if (r >= threshold)
9169119bafbSConrad Meyer return r % bound;
9179119bafbSConrad Meyer }
9189119bafbSConrad Meyer }
9199119bafbSConrad Meyer
9209119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)921*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
9229119bafbSConrad Meyer {
9239119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
9249119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state);
9259119bafbSConrad Meyer }
9269119bafbSConrad Meyer #endif
9279119bafbSConrad Meyer
9289119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
929*43eccfe9SConrad Meyer static inline uint64_t
pcg_oneseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)9309119bafbSConrad Meyer pcg_oneseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
9319119bafbSConrad Meyer uint64_t bound)
9329119bafbSConrad Meyer {
9339119bafbSConrad Meyer uint64_t threshold = -bound % bound;
9349119bafbSConrad Meyer for (;;) {
9359119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsh_rs_64_random_r(rng);
9369119bafbSConrad Meyer if (r >= threshold)
9379119bafbSConrad Meyer return r % bound;
9389119bafbSConrad Meyer }
9399119bafbSConrad Meyer }
9409119bafbSConrad Meyer #endif
9419119bafbSConrad Meyer
pcg_unique_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)942*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
9439119bafbSConrad Meyer {
9449119bafbSConrad Meyer uint16_t oldstate = rng->state;
9459119bafbSConrad Meyer pcg_unique_16_step_r(rng);
9469119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate);
9479119bafbSConrad Meyer }
9489119bafbSConrad Meyer
pcg_unique_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)949*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
9509119bafbSConrad Meyer uint8_t bound)
9519119bafbSConrad Meyer {
9529119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
9539119bafbSConrad Meyer for (;;) {
9549119bafbSConrad Meyer uint8_t r = pcg_unique_16_xsh_rs_8_random_r(rng);
9559119bafbSConrad Meyer if (r >= threshold)
9569119bafbSConrad Meyer return r % bound;
9579119bafbSConrad Meyer }
9589119bafbSConrad Meyer }
9599119bafbSConrad Meyer
pcg_unique_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)960*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
9619119bafbSConrad Meyer {
9629119bafbSConrad Meyer uint32_t oldstate = rng->state;
9639119bafbSConrad Meyer pcg_unique_32_step_r(rng);
9649119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate);
9659119bafbSConrad Meyer }
9669119bafbSConrad Meyer
pcg_unique_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)967*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
9689119bafbSConrad Meyer uint16_t bound)
9699119bafbSConrad Meyer {
9709119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
9719119bafbSConrad Meyer for (;;) {
9729119bafbSConrad Meyer uint16_t r = pcg_unique_32_xsh_rs_16_random_r(rng);
9739119bafbSConrad Meyer if (r >= threshold)
9749119bafbSConrad Meyer return r % bound;
9759119bafbSConrad Meyer }
9769119bafbSConrad Meyer }
9779119bafbSConrad Meyer
pcg_unique_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)978*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
9799119bafbSConrad Meyer {
9809119bafbSConrad Meyer uint64_t oldstate = rng->state;
9819119bafbSConrad Meyer pcg_unique_64_step_r(rng);
9829119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate);
9839119bafbSConrad Meyer }
9849119bafbSConrad Meyer
pcg_unique_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)985*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
9869119bafbSConrad Meyer uint32_t bound)
9879119bafbSConrad Meyer {
9889119bafbSConrad Meyer uint32_t threshold = -bound % bound;
9899119bafbSConrad Meyer for (;;) {
9909119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsh_rs_32_random_r(rng);
9919119bafbSConrad Meyer if (r >= threshold)
9929119bafbSConrad Meyer return r % bound;
9939119bafbSConrad Meyer }
9949119bafbSConrad Meyer }
9959119bafbSConrad Meyer
9969119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)997*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
9989119bafbSConrad Meyer {
9999119bafbSConrad Meyer pcg_unique_128_step_r(rng);
10009119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state);
10019119bafbSConrad Meyer }
10029119bafbSConrad Meyer #endif
10039119bafbSConrad Meyer
10049119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1005*43eccfe9SConrad Meyer static inline uint64_t
pcg_unique_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)10069119bafbSConrad Meyer pcg_unique_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
10079119bafbSConrad Meyer uint64_t bound)
10089119bafbSConrad Meyer {
10099119bafbSConrad Meyer uint64_t threshold = -bound % bound;
10109119bafbSConrad Meyer for (;;) {
10119119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsh_rs_64_random_r(rng);
10129119bafbSConrad Meyer if (r >= threshold)
10139119bafbSConrad Meyer return r % bound;
10149119bafbSConrad Meyer }
10159119bafbSConrad Meyer }
10169119bafbSConrad Meyer #endif
10179119bafbSConrad Meyer
pcg_setseq_16_xsh_rs_8_random_r(struct pcg_state_setseq_16 * rng)1018*43eccfe9SConrad Meyer static inline uint8_t pcg_setseq_16_xsh_rs_8_random_r(struct pcg_state_setseq_16* rng)
10199119bafbSConrad Meyer {
10209119bafbSConrad Meyer uint16_t oldstate = rng->state;
10219119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
10229119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate);
10239119bafbSConrad Meyer }
10249119bafbSConrad Meyer
1025*43eccfe9SConrad Meyer static inline uint8_t
pcg_setseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)10269119bafbSConrad Meyer pcg_setseq_16_xsh_rs_8_boundedrand_r(struct pcg_state_setseq_16* rng,
10279119bafbSConrad Meyer uint8_t bound)
10289119bafbSConrad Meyer {
10299119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
10309119bafbSConrad Meyer for (;;) {
10319119bafbSConrad Meyer uint8_t r = pcg_setseq_16_xsh_rs_8_random_r(rng);
10329119bafbSConrad Meyer if (r >= threshold)
10339119bafbSConrad Meyer return r % bound;
10349119bafbSConrad Meyer }
10359119bafbSConrad Meyer }
10369119bafbSConrad Meyer
1037*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_32_xsh_rs_16_random_r(struct pcg_state_setseq_32 * rng)10389119bafbSConrad Meyer pcg_setseq_32_xsh_rs_16_random_r(struct pcg_state_setseq_32* rng)
10399119bafbSConrad Meyer {
10409119bafbSConrad Meyer uint32_t oldstate = rng->state;
10419119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
10429119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate);
10439119bafbSConrad Meyer }
10449119bafbSConrad Meyer
1045*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)10469119bafbSConrad Meyer pcg_setseq_32_xsh_rs_16_boundedrand_r(struct pcg_state_setseq_32* rng,
10479119bafbSConrad Meyer uint16_t bound)
10489119bafbSConrad Meyer {
10499119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
10509119bafbSConrad Meyer for (;;) {
10519119bafbSConrad Meyer uint16_t r = pcg_setseq_32_xsh_rs_16_random_r(rng);
10529119bafbSConrad Meyer if (r >= threshold)
10539119bafbSConrad Meyer return r % bound;
10549119bafbSConrad Meyer }
10559119bafbSConrad Meyer }
10569119bafbSConrad Meyer
1057*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsh_rs_32_random_r(struct pcg_state_setseq_64 * rng)10589119bafbSConrad Meyer pcg_setseq_64_xsh_rs_32_random_r(struct pcg_state_setseq_64* rng)
10599119bafbSConrad Meyer {
10609119bafbSConrad Meyer uint64_t oldstate = rng->state;
10619119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
10629119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate);
10639119bafbSConrad Meyer }
10649119bafbSConrad Meyer
1065*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)10669119bafbSConrad Meyer pcg_setseq_64_xsh_rs_32_boundedrand_r(struct pcg_state_setseq_64* rng,
10679119bafbSConrad Meyer uint32_t bound)
10689119bafbSConrad Meyer {
10699119bafbSConrad Meyer uint32_t threshold = -bound % bound;
10709119bafbSConrad Meyer for (;;) {
10719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsh_rs_32_random_r(rng);
10729119bafbSConrad Meyer if (r >= threshold)
10739119bafbSConrad Meyer return r % bound;
10749119bafbSConrad Meyer }
10759119bafbSConrad Meyer }
10769119bafbSConrad Meyer
10779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1078*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsh_rs_64_random_r(struct pcg_state_setseq_128 * rng)10799119bafbSConrad Meyer pcg_setseq_128_xsh_rs_64_random_r(struct pcg_state_setseq_128* rng)
10809119bafbSConrad Meyer {
10819119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
10829119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state);
10839119bafbSConrad Meyer }
10849119bafbSConrad Meyer #endif
10859119bafbSConrad Meyer
10869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1087*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)10889119bafbSConrad Meyer pcg_setseq_128_xsh_rs_64_boundedrand_r(struct pcg_state_setseq_128* rng,
10899119bafbSConrad Meyer uint64_t bound)
10909119bafbSConrad Meyer {
10919119bafbSConrad Meyer uint64_t threshold = -bound % bound;
10929119bafbSConrad Meyer for (;;) {
10939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsh_rs_64_random_r(rng);
10949119bafbSConrad Meyer if (r >= threshold)
10959119bafbSConrad Meyer return r % bound;
10969119bafbSConrad Meyer }
10979119bafbSConrad Meyer }
10989119bafbSConrad Meyer #endif
10999119bafbSConrad Meyer
pcg_mcg_16_xsh_rs_8_random_r(struct pcg_state_16 * rng)1100*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_xsh_rs_8_random_r(struct pcg_state_16* rng)
11019119bafbSConrad Meyer {
11029119bafbSConrad Meyer uint16_t oldstate = rng->state;
11039119bafbSConrad Meyer pcg_mcg_16_step_r(rng);
11049119bafbSConrad Meyer return pcg_output_xsh_rs_16_8(oldstate);
11059119bafbSConrad Meyer }
11069119bafbSConrad Meyer
pcg_mcg_16_xsh_rs_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1107*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_xsh_rs_8_boundedrand_r(struct pcg_state_16* rng,
11089119bafbSConrad Meyer uint8_t bound)
11099119bafbSConrad Meyer {
11109119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
11119119bafbSConrad Meyer for (;;) {
11129119bafbSConrad Meyer uint8_t r = pcg_mcg_16_xsh_rs_8_random_r(rng);
11139119bafbSConrad Meyer if (r >= threshold)
11149119bafbSConrad Meyer return r % bound;
11159119bafbSConrad Meyer }
11169119bafbSConrad Meyer }
11179119bafbSConrad Meyer
pcg_mcg_32_xsh_rs_16_random_r(struct pcg_state_32 * rng)1118*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_xsh_rs_16_random_r(struct pcg_state_32* rng)
11199119bafbSConrad Meyer {
11209119bafbSConrad Meyer uint32_t oldstate = rng->state;
11219119bafbSConrad Meyer pcg_mcg_32_step_r(rng);
11229119bafbSConrad Meyer return pcg_output_xsh_rs_32_16(oldstate);
11239119bafbSConrad Meyer }
11249119bafbSConrad Meyer
pcg_mcg_32_xsh_rs_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1125*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_xsh_rs_16_boundedrand_r(struct pcg_state_32* rng,
11269119bafbSConrad Meyer uint16_t bound)
11279119bafbSConrad Meyer {
11289119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
11299119bafbSConrad Meyer for (;;) {
11309119bafbSConrad Meyer uint16_t r = pcg_mcg_32_xsh_rs_16_random_r(rng);
11319119bafbSConrad Meyer if (r >= threshold)
11329119bafbSConrad Meyer return r % bound;
11339119bafbSConrad Meyer }
11349119bafbSConrad Meyer }
11359119bafbSConrad Meyer
pcg_mcg_64_xsh_rs_32_random_r(struct pcg_state_64 * rng)1136*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsh_rs_32_random_r(struct pcg_state_64* rng)
11379119bafbSConrad Meyer {
11389119bafbSConrad Meyer uint64_t oldstate = rng->state;
11399119bafbSConrad Meyer pcg_mcg_64_step_r(rng);
11409119bafbSConrad Meyer return pcg_output_xsh_rs_64_32(oldstate);
11419119bafbSConrad Meyer }
11429119bafbSConrad Meyer
pcg_mcg_64_xsh_rs_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1143*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsh_rs_32_boundedrand_r(struct pcg_state_64* rng,
11449119bafbSConrad Meyer uint32_t bound)
11459119bafbSConrad Meyer {
11469119bafbSConrad Meyer uint32_t threshold = -bound % bound;
11479119bafbSConrad Meyer for (;;) {
11489119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsh_rs_32_random_r(rng);
11499119bafbSConrad Meyer if (r >= threshold)
11509119bafbSConrad Meyer return r % bound;
11519119bafbSConrad Meyer }
11529119bafbSConrad Meyer }
11539119bafbSConrad Meyer
11549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rs_64_random_r(struct pcg_state_128 * rng)1155*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsh_rs_64_random_r(struct pcg_state_128* rng)
11569119bafbSConrad Meyer {
11579119bafbSConrad Meyer pcg_mcg_128_step_r(rng);
11589119bafbSConrad Meyer return pcg_output_xsh_rs_128_64(rng->state);
11599119bafbSConrad Meyer }
11609119bafbSConrad Meyer #endif
11619119bafbSConrad Meyer
11629119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rs_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1163*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsh_rs_64_boundedrand_r(struct pcg_state_128* rng,
11649119bafbSConrad Meyer uint64_t bound)
11659119bafbSConrad Meyer {
11669119bafbSConrad Meyer uint64_t threshold = -bound % bound;
11679119bafbSConrad Meyer for (;;) {
11689119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsh_rs_64_random_r(rng);
11699119bafbSConrad Meyer if (r >= threshold)
11709119bafbSConrad Meyer return r % bound;
11719119bafbSConrad Meyer }
11729119bafbSConrad Meyer }
11739119bafbSConrad Meyer #endif
11749119bafbSConrad Meyer
11759119bafbSConrad Meyer /* Generation functions for XSH RR */
11769119bafbSConrad Meyer
pcg_oneseq_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1177*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
11789119bafbSConrad Meyer {
11799119bafbSConrad Meyer uint16_t oldstate = rng->state;
11809119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
11819119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate);
11829119bafbSConrad Meyer }
11839119bafbSConrad Meyer
pcg_oneseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1184*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
11859119bafbSConrad Meyer uint8_t bound)
11869119bafbSConrad Meyer {
11879119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
11889119bafbSConrad Meyer for (;;) {
11899119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_xsh_rr_8_random_r(rng);
11909119bafbSConrad Meyer if (r >= threshold)
11919119bafbSConrad Meyer return r % bound;
11929119bafbSConrad Meyer }
11939119bafbSConrad Meyer }
11949119bafbSConrad Meyer
pcg_oneseq_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1195*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
11969119bafbSConrad Meyer {
11979119bafbSConrad Meyer uint32_t oldstate = rng->state;
11989119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
11999119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate);
12009119bafbSConrad Meyer }
12019119bafbSConrad Meyer
pcg_oneseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1202*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
12039119bafbSConrad Meyer uint16_t bound)
12049119bafbSConrad Meyer {
12059119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
12069119bafbSConrad Meyer for (;;) {
12079119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_xsh_rr_16_random_r(rng);
12089119bafbSConrad Meyer if (r >= threshold)
12099119bafbSConrad Meyer return r % bound;
12109119bafbSConrad Meyer }
12119119bafbSConrad Meyer }
12129119bafbSConrad Meyer
pcg_oneseq_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1213*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
12149119bafbSConrad Meyer {
12159119bafbSConrad Meyer uint64_t oldstate = rng->state;
12169119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
12179119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate);
12189119bafbSConrad Meyer }
12199119bafbSConrad Meyer
pcg_oneseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1220*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
12219119bafbSConrad Meyer uint32_t bound)
12229119bafbSConrad Meyer {
12239119bafbSConrad Meyer uint32_t threshold = -bound % bound;
12249119bafbSConrad Meyer for (;;) {
12259119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsh_rr_32_random_r(rng);
12269119bafbSConrad Meyer if (r >= threshold)
12279119bafbSConrad Meyer return r % bound;
12289119bafbSConrad Meyer }
12299119bafbSConrad Meyer }
12309119bafbSConrad Meyer
12319119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1232*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
12339119bafbSConrad Meyer {
12349119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
12359119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state);
12369119bafbSConrad Meyer }
12379119bafbSConrad Meyer #endif
12389119bafbSConrad Meyer
12399119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1240*43eccfe9SConrad Meyer static inline uint64_t
pcg_oneseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)12419119bafbSConrad Meyer pcg_oneseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
12429119bafbSConrad Meyer uint64_t bound)
12439119bafbSConrad Meyer {
12449119bafbSConrad Meyer uint64_t threshold = -bound % bound;
12459119bafbSConrad Meyer for (;;) {
12469119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsh_rr_64_random_r(rng);
12479119bafbSConrad Meyer if (r >= threshold)
12489119bafbSConrad Meyer return r % bound;
12499119bafbSConrad Meyer }
12509119bafbSConrad Meyer }
12519119bafbSConrad Meyer #endif
12529119bafbSConrad Meyer
pcg_unique_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1253*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
12549119bafbSConrad Meyer {
12559119bafbSConrad Meyer uint16_t oldstate = rng->state;
12569119bafbSConrad Meyer pcg_unique_16_step_r(rng);
12579119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate);
12589119bafbSConrad Meyer }
12599119bafbSConrad Meyer
pcg_unique_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1260*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
12619119bafbSConrad Meyer uint8_t bound)
12629119bafbSConrad Meyer {
12639119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
12649119bafbSConrad Meyer for (;;) {
12659119bafbSConrad Meyer uint8_t r = pcg_unique_16_xsh_rr_8_random_r(rng);
12669119bafbSConrad Meyer if (r >= threshold)
12679119bafbSConrad Meyer return r % bound;
12689119bafbSConrad Meyer }
12699119bafbSConrad Meyer }
12709119bafbSConrad Meyer
pcg_unique_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1271*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
12729119bafbSConrad Meyer {
12739119bafbSConrad Meyer uint32_t oldstate = rng->state;
12749119bafbSConrad Meyer pcg_unique_32_step_r(rng);
12759119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate);
12769119bafbSConrad Meyer }
12779119bafbSConrad Meyer
pcg_unique_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1278*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
12799119bafbSConrad Meyer uint16_t bound)
12809119bafbSConrad Meyer {
12819119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
12829119bafbSConrad Meyer for (;;) {
12839119bafbSConrad Meyer uint16_t r = pcg_unique_32_xsh_rr_16_random_r(rng);
12849119bafbSConrad Meyer if (r >= threshold)
12859119bafbSConrad Meyer return r % bound;
12869119bafbSConrad Meyer }
12879119bafbSConrad Meyer }
12889119bafbSConrad Meyer
pcg_unique_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1289*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
12909119bafbSConrad Meyer {
12919119bafbSConrad Meyer uint64_t oldstate = rng->state;
12929119bafbSConrad Meyer pcg_unique_64_step_r(rng);
12939119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate);
12949119bafbSConrad Meyer }
12959119bafbSConrad Meyer
pcg_unique_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1296*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
12979119bafbSConrad Meyer uint32_t bound)
12989119bafbSConrad Meyer {
12999119bafbSConrad Meyer uint32_t threshold = -bound % bound;
13009119bafbSConrad Meyer for (;;) {
13019119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsh_rr_32_random_r(rng);
13029119bafbSConrad Meyer if (r >= threshold)
13039119bafbSConrad Meyer return r % bound;
13049119bafbSConrad Meyer }
13059119bafbSConrad Meyer }
13069119bafbSConrad Meyer
13079119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1308*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
13099119bafbSConrad Meyer {
13109119bafbSConrad Meyer pcg_unique_128_step_r(rng);
13119119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state);
13129119bafbSConrad Meyer }
13139119bafbSConrad Meyer #endif
13149119bafbSConrad Meyer
13159119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1316*43eccfe9SConrad Meyer static inline uint64_t
pcg_unique_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)13179119bafbSConrad Meyer pcg_unique_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
13189119bafbSConrad Meyer uint64_t bound)
13199119bafbSConrad Meyer {
13209119bafbSConrad Meyer uint64_t threshold = -bound % bound;
13219119bafbSConrad Meyer for (;;) {
13229119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsh_rr_64_random_r(rng);
13239119bafbSConrad Meyer if (r >= threshold)
13249119bafbSConrad Meyer return r % bound;
13259119bafbSConrad Meyer }
13269119bafbSConrad Meyer }
13279119bafbSConrad Meyer #endif
13289119bafbSConrad Meyer
pcg_setseq_16_xsh_rr_8_random_r(struct pcg_state_setseq_16 * rng)1329*43eccfe9SConrad Meyer static inline uint8_t pcg_setseq_16_xsh_rr_8_random_r(struct pcg_state_setseq_16* rng)
13309119bafbSConrad Meyer {
13319119bafbSConrad Meyer uint16_t oldstate = rng->state;
13329119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
13339119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate);
13349119bafbSConrad Meyer }
13359119bafbSConrad Meyer
1336*43eccfe9SConrad Meyer static inline uint8_t
pcg_setseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)13379119bafbSConrad Meyer pcg_setseq_16_xsh_rr_8_boundedrand_r(struct pcg_state_setseq_16* rng,
13389119bafbSConrad Meyer uint8_t bound)
13399119bafbSConrad Meyer {
13409119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
13419119bafbSConrad Meyer for (;;) {
13429119bafbSConrad Meyer uint8_t r = pcg_setseq_16_xsh_rr_8_random_r(rng);
13439119bafbSConrad Meyer if (r >= threshold)
13449119bafbSConrad Meyer return r % bound;
13459119bafbSConrad Meyer }
13469119bafbSConrad Meyer }
13479119bafbSConrad Meyer
1348*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_32_xsh_rr_16_random_r(struct pcg_state_setseq_32 * rng)13499119bafbSConrad Meyer pcg_setseq_32_xsh_rr_16_random_r(struct pcg_state_setseq_32* rng)
13509119bafbSConrad Meyer {
13519119bafbSConrad Meyer uint32_t oldstate = rng->state;
13529119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
13539119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate);
13549119bafbSConrad Meyer }
13559119bafbSConrad Meyer
1356*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)13579119bafbSConrad Meyer pcg_setseq_32_xsh_rr_16_boundedrand_r(struct pcg_state_setseq_32* rng,
13589119bafbSConrad Meyer uint16_t bound)
13599119bafbSConrad Meyer {
13609119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
13619119bafbSConrad Meyer for (;;) {
13629119bafbSConrad Meyer uint16_t r = pcg_setseq_32_xsh_rr_16_random_r(rng);
13639119bafbSConrad Meyer if (r >= threshold)
13649119bafbSConrad Meyer return r % bound;
13659119bafbSConrad Meyer }
13669119bafbSConrad Meyer }
13679119bafbSConrad Meyer
1368*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsh_rr_32_random_r(struct pcg_state_setseq_64 * rng)13699119bafbSConrad Meyer pcg_setseq_64_xsh_rr_32_random_r(struct pcg_state_setseq_64* rng)
13709119bafbSConrad Meyer {
13719119bafbSConrad Meyer uint64_t oldstate = rng->state;
13729119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
13739119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate);
13749119bafbSConrad Meyer }
13759119bafbSConrad Meyer
1376*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)13779119bafbSConrad Meyer pcg_setseq_64_xsh_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng,
13789119bafbSConrad Meyer uint32_t bound)
13799119bafbSConrad Meyer {
13809119bafbSConrad Meyer uint32_t threshold = -bound % bound;
13819119bafbSConrad Meyer for (;;) {
13829119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsh_rr_32_random_r(rng);
13839119bafbSConrad Meyer if (r >= threshold)
13849119bafbSConrad Meyer return r % bound;
13859119bafbSConrad Meyer }
13869119bafbSConrad Meyer }
13879119bafbSConrad Meyer
13889119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1389*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsh_rr_64_random_r(struct pcg_state_setseq_128 * rng)13909119bafbSConrad Meyer pcg_setseq_128_xsh_rr_64_random_r(struct pcg_state_setseq_128* rng)
13919119bafbSConrad Meyer {
13929119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
13939119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state);
13949119bafbSConrad Meyer }
13959119bafbSConrad Meyer #endif
13969119bafbSConrad Meyer
13979119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1398*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)13999119bafbSConrad Meyer pcg_setseq_128_xsh_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng,
14009119bafbSConrad Meyer uint64_t bound)
14019119bafbSConrad Meyer {
14029119bafbSConrad Meyer uint64_t threshold = -bound % bound;
14039119bafbSConrad Meyer for (;;) {
14049119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsh_rr_64_random_r(rng);
14059119bafbSConrad Meyer if (r >= threshold)
14069119bafbSConrad Meyer return r % bound;
14079119bafbSConrad Meyer }
14089119bafbSConrad Meyer }
14099119bafbSConrad Meyer #endif
14109119bafbSConrad Meyer
pcg_mcg_16_xsh_rr_8_random_r(struct pcg_state_16 * rng)1411*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_xsh_rr_8_random_r(struct pcg_state_16* rng)
14129119bafbSConrad Meyer {
14139119bafbSConrad Meyer uint16_t oldstate = rng->state;
14149119bafbSConrad Meyer pcg_mcg_16_step_r(rng);
14159119bafbSConrad Meyer return pcg_output_xsh_rr_16_8(oldstate);
14169119bafbSConrad Meyer }
14179119bafbSConrad Meyer
pcg_mcg_16_xsh_rr_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1418*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_xsh_rr_8_boundedrand_r(struct pcg_state_16* rng,
14199119bafbSConrad Meyer uint8_t bound)
14209119bafbSConrad Meyer {
14219119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
14229119bafbSConrad Meyer for (;;) {
14239119bafbSConrad Meyer uint8_t r = pcg_mcg_16_xsh_rr_8_random_r(rng);
14249119bafbSConrad Meyer if (r >= threshold)
14259119bafbSConrad Meyer return r % bound;
14269119bafbSConrad Meyer }
14279119bafbSConrad Meyer }
14289119bafbSConrad Meyer
pcg_mcg_32_xsh_rr_16_random_r(struct pcg_state_32 * rng)1429*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_xsh_rr_16_random_r(struct pcg_state_32* rng)
14309119bafbSConrad Meyer {
14319119bafbSConrad Meyer uint32_t oldstate = rng->state;
14329119bafbSConrad Meyer pcg_mcg_32_step_r(rng);
14339119bafbSConrad Meyer return pcg_output_xsh_rr_32_16(oldstate);
14349119bafbSConrad Meyer }
14359119bafbSConrad Meyer
pcg_mcg_32_xsh_rr_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1436*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_xsh_rr_16_boundedrand_r(struct pcg_state_32* rng,
14379119bafbSConrad Meyer uint16_t bound)
14389119bafbSConrad Meyer {
14399119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
14409119bafbSConrad Meyer for (;;) {
14419119bafbSConrad Meyer uint16_t r = pcg_mcg_32_xsh_rr_16_random_r(rng);
14429119bafbSConrad Meyer if (r >= threshold)
14439119bafbSConrad Meyer return r % bound;
14449119bafbSConrad Meyer }
14459119bafbSConrad Meyer }
14469119bafbSConrad Meyer
pcg_mcg_64_xsh_rr_32_random_r(struct pcg_state_64 * rng)1447*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsh_rr_32_random_r(struct pcg_state_64* rng)
14489119bafbSConrad Meyer {
14499119bafbSConrad Meyer uint64_t oldstate = rng->state;
14509119bafbSConrad Meyer pcg_mcg_64_step_r(rng);
14519119bafbSConrad Meyer return pcg_output_xsh_rr_64_32(oldstate);
14529119bafbSConrad Meyer }
14539119bafbSConrad Meyer
pcg_mcg_64_xsh_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1454*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsh_rr_32_boundedrand_r(struct pcg_state_64* rng,
14559119bafbSConrad Meyer uint32_t bound)
14569119bafbSConrad Meyer {
14579119bafbSConrad Meyer uint32_t threshold = -bound % bound;
14589119bafbSConrad Meyer for (;;) {
14599119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsh_rr_32_random_r(rng);
14609119bafbSConrad Meyer if (r >= threshold)
14619119bafbSConrad Meyer return r % bound;
14629119bafbSConrad Meyer }
14639119bafbSConrad Meyer }
14649119bafbSConrad Meyer
14659119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rr_64_random_r(struct pcg_state_128 * rng)1466*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsh_rr_64_random_r(struct pcg_state_128* rng)
14679119bafbSConrad Meyer {
14689119bafbSConrad Meyer pcg_mcg_128_step_r(rng);
14699119bafbSConrad Meyer return pcg_output_xsh_rr_128_64(rng->state);
14709119bafbSConrad Meyer }
14719119bafbSConrad Meyer #endif
14729119bafbSConrad Meyer
14739119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsh_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1474*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsh_rr_64_boundedrand_r(struct pcg_state_128* rng,
14759119bafbSConrad Meyer uint64_t bound)
14769119bafbSConrad Meyer {
14779119bafbSConrad Meyer uint64_t threshold = -bound % bound;
14789119bafbSConrad Meyer for (;;) {
14799119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsh_rr_64_random_r(rng);
14809119bafbSConrad Meyer if (r >= threshold)
14819119bafbSConrad Meyer return r % bound;
14829119bafbSConrad Meyer }
14839119bafbSConrad Meyer }
14849119bafbSConrad Meyer #endif
14859119bafbSConrad Meyer
14869119bafbSConrad Meyer /* Generation functions for RXS M XS (no MCG versions because they
14879119bafbSConrad Meyer * don't make sense when you want to use the entire state)
14889119bafbSConrad Meyer */
14899119bafbSConrad Meyer
pcg_oneseq_8_rxs_m_xs_8_random_r(struct pcg_state_8 * rng)1490*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_8_rxs_m_xs_8_random_r(struct pcg_state_8* rng)
14919119bafbSConrad Meyer {
14929119bafbSConrad Meyer uint8_t oldstate = rng->state;
14939119bafbSConrad Meyer pcg_oneseq_8_step_r(rng);
14949119bafbSConrad Meyer return pcg_output_rxs_m_xs_8_8(oldstate);
14959119bafbSConrad Meyer }
14969119bafbSConrad Meyer
pcg_oneseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_8 * rng,uint8_t bound)1497*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_8* rng,
14989119bafbSConrad Meyer uint8_t bound)
14999119bafbSConrad Meyer {
15009119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
15019119bafbSConrad Meyer for (;;) {
15029119bafbSConrad Meyer uint8_t r = pcg_oneseq_8_rxs_m_xs_8_random_r(rng);
15039119bafbSConrad Meyer if (r >= threshold)
15049119bafbSConrad Meyer return r % bound;
15059119bafbSConrad Meyer }
15069119bafbSConrad Meyer }
15079119bafbSConrad Meyer
pcg_oneseq_16_rxs_m_xs_16_random_r(struct pcg_state_16 * rng)1508*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng)
15099119bafbSConrad Meyer {
15109119bafbSConrad Meyer uint16_t oldstate = rng->state;
15119119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
15129119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate);
15139119bafbSConrad Meyer }
15149119bafbSConrad Meyer
1515*43eccfe9SConrad Meyer static inline uint16_t
pcg_oneseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16 * rng,uint16_t bound)15169119bafbSConrad Meyer pcg_oneseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng,
15179119bafbSConrad Meyer uint16_t bound)
15189119bafbSConrad Meyer {
15199119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
15209119bafbSConrad Meyer for (;;) {
15219119bafbSConrad Meyer uint16_t r = pcg_oneseq_16_rxs_m_xs_16_random_r(rng);
15229119bafbSConrad Meyer if (r >= threshold)
15239119bafbSConrad Meyer return r % bound;
15249119bafbSConrad Meyer }
15259119bafbSConrad Meyer }
15269119bafbSConrad Meyer
pcg_oneseq_32_rxs_m_xs_32_random_r(struct pcg_state_32 * rng)1527*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng)
15289119bafbSConrad Meyer {
15299119bafbSConrad Meyer uint32_t oldstate = rng->state;
15309119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
15319119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate);
15329119bafbSConrad Meyer }
15339119bafbSConrad Meyer
1534*43eccfe9SConrad Meyer static inline uint32_t
pcg_oneseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32 * rng,uint32_t bound)15359119bafbSConrad Meyer pcg_oneseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng,
15369119bafbSConrad Meyer uint32_t bound)
15379119bafbSConrad Meyer {
15389119bafbSConrad Meyer uint32_t threshold = -bound % bound;
15399119bafbSConrad Meyer for (;;) {
15409119bafbSConrad Meyer uint32_t r = pcg_oneseq_32_rxs_m_xs_32_random_r(rng);
15419119bafbSConrad Meyer if (r >= threshold)
15429119bafbSConrad Meyer return r % bound;
15439119bafbSConrad Meyer }
15449119bafbSConrad Meyer }
15459119bafbSConrad Meyer
pcg_oneseq_64_rxs_m_xs_64_random_r(struct pcg_state_64 * rng)1546*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng)
15479119bafbSConrad Meyer {
15489119bafbSConrad Meyer uint64_t oldstate = rng->state;
15499119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
15509119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate);
15519119bafbSConrad Meyer }
15529119bafbSConrad Meyer
1553*43eccfe9SConrad Meyer static inline uint64_t
pcg_oneseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)15549119bafbSConrad Meyer pcg_oneseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng,
15559119bafbSConrad Meyer uint64_t bound)
15569119bafbSConrad Meyer {
15579119bafbSConrad Meyer uint64_t threshold = -bound % bound;
15589119bafbSConrad Meyer for (;;) {
15599119bafbSConrad Meyer uint64_t r = pcg_oneseq_64_rxs_m_xs_64_random_r(rng);
15609119bafbSConrad Meyer if (r >= threshold)
15619119bafbSConrad Meyer return r % bound;
15629119bafbSConrad Meyer }
15639119bafbSConrad Meyer }
15649119bafbSConrad Meyer
15659119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_xs_128_random_r(struct pcg_state_128 * rng)1566*43eccfe9SConrad Meyer static inline pcg128_t pcg_oneseq_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng)
15679119bafbSConrad Meyer {
15689119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
15699119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state);
15709119bafbSConrad Meyer }
15719119bafbSConrad Meyer #endif
15729119bafbSConrad Meyer
15739119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1574*43eccfe9SConrad Meyer static inline pcg128_t
pcg_oneseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)15759119bafbSConrad Meyer pcg_oneseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng,
15769119bafbSConrad Meyer pcg128_t bound)
15779119bafbSConrad Meyer {
15789119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
15799119bafbSConrad Meyer for (;;) {
15809119bafbSConrad Meyer pcg128_t r = pcg_oneseq_128_rxs_m_xs_128_random_r(rng);
15819119bafbSConrad Meyer if (r >= threshold)
15829119bafbSConrad Meyer return r % bound;
15839119bafbSConrad Meyer }
15849119bafbSConrad Meyer }
15859119bafbSConrad Meyer #endif
15869119bafbSConrad Meyer
pcg_unique_16_rxs_m_xs_16_random_r(struct pcg_state_16 * rng)1587*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_16_rxs_m_xs_16_random_r(struct pcg_state_16* rng)
15889119bafbSConrad Meyer {
15899119bafbSConrad Meyer uint16_t oldstate = rng->state;
15909119bafbSConrad Meyer pcg_unique_16_step_r(rng);
15919119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate);
15929119bafbSConrad Meyer }
15939119bafbSConrad Meyer
1594*43eccfe9SConrad Meyer static inline uint16_t
pcg_unique_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16 * rng,uint16_t bound)15959119bafbSConrad Meyer pcg_unique_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_16* rng,
15969119bafbSConrad Meyer uint16_t bound)
15979119bafbSConrad Meyer {
15989119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
15999119bafbSConrad Meyer for (;;) {
16009119bafbSConrad Meyer uint16_t r = pcg_unique_16_rxs_m_xs_16_random_r(rng);
16019119bafbSConrad Meyer if (r >= threshold)
16029119bafbSConrad Meyer return r % bound;
16039119bafbSConrad Meyer }
16049119bafbSConrad Meyer }
16059119bafbSConrad Meyer
pcg_unique_32_rxs_m_xs_32_random_r(struct pcg_state_32 * rng)1606*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_32_rxs_m_xs_32_random_r(struct pcg_state_32* rng)
16079119bafbSConrad Meyer {
16089119bafbSConrad Meyer uint32_t oldstate = rng->state;
16099119bafbSConrad Meyer pcg_unique_32_step_r(rng);
16109119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate);
16119119bafbSConrad Meyer }
16129119bafbSConrad Meyer
1613*43eccfe9SConrad Meyer static inline uint32_t
pcg_unique_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32 * rng,uint32_t bound)16149119bafbSConrad Meyer pcg_unique_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_32* rng,
16159119bafbSConrad Meyer uint32_t bound)
16169119bafbSConrad Meyer {
16179119bafbSConrad Meyer uint32_t threshold = -bound % bound;
16189119bafbSConrad Meyer for (;;) {
16199119bafbSConrad Meyer uint32_t r = pcg_unique_32_rxs_m_xs_32_random_r(rng);
16209119bafbSConrad Meyer if (r >= threshold)
16219119bafbSConrad Meyer return r % bound;
16229119bafbSConrad Meyer }
16239119bafbSConrad Meyer }
16249119bafbSConrad Meyer
pcg_unique_64_rxs_m_xs_64_random_r(struct pcg_state_64 * rng)1625*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_64_rxs_m_xs_64_random_r(struct pcg_state_64* rng)
16269119bafbSConrad Meyer {
16279119bafbSConrad Meyer uint64_t oldstate = rng->state;
16289119bafbSConrad Meyer pcg_unique_64_step_r(rng);
16299119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate);
16309119bafbSConrad Meyer }
16319119bafbSConrad Meyer
1632*43eccfe9SConrad Meyer static inline uint64_t
pcg_unique_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)16339119bafbSConrad Meyer pcg_unique_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_64* rng,
16349119bafbSConrad Meyer uint64_t bound)
16359119bafbSConrad Meyer {
16369119bafbSConrad Meyer uint64_t threshold = -bound % bound;
16379119bafbSConrad Meyer for (;;) {
16389119bafbSConrad Meyer uint64_t r = pcg_unique_64_rxs_m_xs_64_random_r(rng);
16399119bafbSConrad Meyer if (r >= threshold)
16409119bafbSConrad Meyer return r % bound;
16419119bafbSConrad Meyer }
16429119bafbSConrad Meyer }
16439119bafbSConrad Meyer
16449119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_xs_128_random_r(struct pcg_state_128 * rng)1645*43eccfe9SConrad Meyer static inline pcg128_t pcg_unique_128_rxs_m_xs_128_random_r(struct pcg_state_128* rng)
16469119bafbSConrad Meyer {
16479119bafbSConrad Meyer pcg_unique_128_step_r(rng);
16489119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state);
16499119bafbSConrad Meyer }
16509119bafbSConrad Meyer #endif
16519119bafbSConrad Meyer
16529119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1653*43eccfe9SConrad Meyer static inline pcg128_t
pcg_unique_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)16549119bafbSConrad Meyer pcg_unique_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_128* rng,
16559119bafbSConrad Meyer pcg128_t bound)
16569119bafbSConrad Meyer {
16579119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
16589119bafbSConrad Meyer for (;;) {
16599119bafbSConrad Meyer pcg128_t r = pcg_unique_128_rxs_m_xs_128_random_r(rng);
16609119bafbSConrad Meyer if (r >= threshold)
16619119bafbSConrad Meyer return r % bound;
16629119bafbSConrad Meyer }
16639119bafbSConrad Meyer }
16649119bafbSConrad Meyer #endif
16659119bafbSConrad Meyer
pcg_setseq_8_rxs_m_xs_8_random_r(struct pcg_state_setseq_8 * rng)1666*43eccfe9SConrad Meyer static inline uint8_t pcg_setseq_8_rxs_m_xs_8_random_r(struct pcg_state_setseq_8* rng)
16679119bafbSConrad Meyer {
16689119bafbSConrad Meyer uint8_t oldstate = rng->state;
16699119bafbSConrad Meyer pcg_setseq_8_step_r(rng);
16709119bafbSConrad Meyer return pcg_output_rxs_m_xs_8_8(oldstate);
16719119bafbSConrad Meyer }
16729119bafbSConrad Meyer
1673*43eccfe9SConrad Meyer static inline uint8_t
pcg_setseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_setseq_8 * rng,uint8_t bound)16749119bafbSConrad Meyer pcg_setseq_8_rxs_m_xs_8_boundedrand_r(struct pcg_state_setseq_8* rng,
16759119bafbSConrad Meyer uint8_t bound)
16769119bafbSConrad Meyer {
16779119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
16789119bafbSConrad Meyer for (;;) {
16799119bafbSConrad Meyer uint8_t r = pcg_setseq_8_rxs_m_xs_8_random_r(rng);
16809119bafbSConrad Meyer if (r >= threshold)
16819119bafbSConrad Meyer return r % bound;
16829119bafbSConrad Meyer }
16839119bafbSConrad Meyer }
16849119bafbSConrad Meyer
1685*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_16_rxs_m_xs_16_random_r(struct pcg_state_setseq_16 * rng)16869119bafbSConrad Meyer pcg_setseq_16_rxs_m_xs_16_random_r(struct pcg_state_setseq_16* rng)
16879119bafbSConrad Meyer {
16889119bafbSConrad Meyer uint16_t oldstate = rng->state;
16899119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
16909119bafbSConrad Meyer return pcg_output_rxs_m_xs_16_16(oldstate);
16919119bafbSConrad Meyer }
16929119bafbSConrad Meyer
1693*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_setseq_16 * rng,uint16_t bound)16949119bafbSConrad Meyer pcg_setseq_16_rxs_m_xs_16_boundedrand_r(struct pcg_state_setseq_16* rng,
16959119bafbSConrad Meyer uint16_t bound)
16969119bafbSConrad Meyer {
16979119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
16989119bafbSConrad Meyer for (;;) {
16999119bafbSConrad Meyer uint16_t r = pcg_setseq_16_rxs_m_xs_16_random_r(rng);
17009119bafbSConrad Meyer if (r >= threshold)
17019119bafbSConrad Meyer return r % bound;
17029119bafbSConrad Meyer }
17039119bafbSConrad Meyer }
17049119bafbSConrad Meyer
1705*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_32_rxs_m_xs_32_random_r(struct pcg_state_setseq_32 * rng)17069119bafbSConrad Meyer pcg_setseq_32_rxs_m_xs_32_random_r(struct pcg_state_setseq_32* rng)
17079119bafbSConrad Meyer {
17089119bafbSConrad Meyer uint32_t oldstate = rng->state;
17099119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
17109119bafbSConrad Meyer return pcg_output_rxs_m_xs_32_32(oldstate);
17119119bafbSConrad Meyer }
17129119bafbSConrad Meyer
1713*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_setseq_32 * rng,uint32_t bound)17149119bafbSConrad Meyer pcg_setseq_32_rxs_m_xs_32_boundedrand_r(struct pcg_state_setseq_32* rng,
17159119bafbSConrad Meyer uint32_t bound)
17169119bafbSConrad Meyer {
17179119bafbSConrad Meyer uint32_t threshold = -bound % bound;
17189119bafbSConrad Meyer for (;;) {
17199119bafbSConrad Meyer uint32_t r = pcg_setseq_32_rxs_m_xs_32_random_r(rng);
17209119bafbSConrad Meyer if (r >= threshold)
17219119bafbSConrad Meyer return r % bound;
17229119bafbSConrad Meyer }
17239119bafbSConrad Meyer }
17249119bafbSConrad Meyer
1725*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_64_rxs_m_xs_64_random_r(struct pcg_state_setseq_64 * rng)17269119bafbSConrad Meyer pcg_setseq_64_rxs_m_xs_64_random_r(struct pcg_state_setseq_64* rng)
17279119bafbSConrad Meyer {
17289119bafbSConrad Meyer uint64_t oldstate = rng->state;
17299119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
17309119bafbSConrad Meyer return pcg_output_rxs_m_xs_64_64(oldstate);
17319119bafbSConrad Meyer }
17329119bafbSConrad Meyer
1733*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_setseq_64 * rng,uint64_t bound)17349119bafbSConrad Meyer pcg_setseq_64_rxs_m_xs_64_boundedrand_r(struct pcg_state_setseq_64* rng,
17359119bafbSConrad Meyer uint64_t bound)
17369119bafbSConrad Meyer {
17379119bafbSConrad Meyer uint64_t threshold = -bound % bound;
17389119bafbSConrad Meyer for (;;) {
17399119bafbSConrad Meyer uint64_t r = pcg_setseq_64_rxs_m_xs_64_random_r(rng);
17409119bafbSConrad Meyer if (r >= threshold)
17419119bafbSConrad Meyer return r % bound;
17429119bafbSConrad Meyer }
17439119bafbSConrad Meyer }
17449119bafbSConrad Meyer
17459119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1746*43eccfe9SConrad Meyer static inline pcg128_t
pcg_setseq_128_rxs_m_xs_128_random_r(struct pcg_state_setseq_128 * rng)17479119bafbSConrad Meyer pcg_setseq_128_rxs_m_xs_128_random_r(struct pcg_state_setseq_128* rng)
17489119bafbSConrad Meyer {
17499119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
17509119bafbSConrad Meyer return pcg_output_rxs_m_xs_128_128(rng->state);
17519119bafbSConrad Meyer }
17529119bafbSConrad Meyer #endif
17539119bafbSConrad Meyer
17549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1755*43eccfe9SConrad Meyer static inline pcg128_t
pcg_setseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_setseq_128 * rng,pcg128_t bound)17569119bafbSConrad Meyer pcg_setseq_128_rxs_m_xs_128_boundedrand_r(struct pcg_state_setseq_128* rng,
17579119bafbSConrad Meyer pcg128_t bound)
17589119bafbSConrad Meyer {
17599119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
17609119bafbSConrad Meyer for (;;) {
17619119bafbSConrad Meyer pcg128_t r = pcg_setseq_128_rxs_m_xs_128_random_r(rng);
17629119bafbSConrad Meyer if (r >= threshold)
17639119bafbSConrad Meyer return r % bound;
17649119bafbSConrad Meyer }
17659119bafbSConrad Meyer }
17669119bafbSConrad Meyer #endif
17679119bafbSConrad Meyer
17689119bafbSConrad Meyer /* Generation functions for RXS M */
17699119bafbSConrad Meyer
pcg_oneseq_16_rxs_m_8_random_r(struct pcg_state_16 * rng)1770*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_rxs_m_8_random_r(struct pcg_state_16* rng)
17719119bafbSConrad Meyer {
17729119bafbSConrad Meyer uint16_t oldstate = rng->state;
17739119bafbSConrad Meyer pcg_oneseq_16_step_r(rng);
17749119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate);
17759119bafbSConrad Meyer }
17769119bafbSConrad Meyer
pcg_oneseq_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1777*43eccfe9SConrad Meyer static inline uint8_t pcg_oneseq_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
17789119bafbSConrad Meyer uint8_t bound)
17799119bafbSConrad Meyer {
17809119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
17819119bafbSConrad Meyer for (;;) {
17829119bafbSConrad Meyer uint8_t r = pcg_oneseq_16_rxs_m_8_random_r(rng);
17839119bafbSConrad Meyer if (r >= threshold)
17849119bafbSConrad Meyer return r % bound;
17859119bafbSConrad Meyer }
17869119bafbSConrad Meyer }
17879119bafbSConrad Meyer
pcg_oneseq_32_rxs_m_16_random_r(struct pcg_state_32 * rng)1788*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_rxs_m_16_random_r(struct pcg_state_32* rng)
17899119bafbSConrad Meyer {
17909119bafbSConrad Meyer uint32_t oldstate = rng->state;
17919119bafbSConrad Meyer pcg_oneseq_32_step_r(rng);
17929119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate);
17939119bafbSConrad Meyer }
17949119bafbSConrad Meyer
pcg_oneseq_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1795*43eccfe9SConrad Meyer static inline uint16_t pcg_oneseq_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
17969119bafbSConrad Meyer uint16_t bound)
17979119bafbSConrad Meyer {
17989119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
17999119bafbSConrad Meyer for (;;) {
18009119bafbSConrad Meyer uint16_t r = pcg_oneseq_32_rxs_m_16_random_r(rng);
18019119bafbSConrad Meyer if (r >= threshold)
18029119bafbSConrad Meyer return r % bound;
18039119bafbSConrad Meyer }
18049119bafbSConrad Meyer }
18059119bafbSConrad Meyer
pcg_oneseq_64_rxs_m_32_random_r(struct pcg_state_64 * rng)1806*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_rxs_m_32_random_r(struct pcg_state_64* rng)
18079119bafbSConrad Meyer {
18089119bafbSConrad Meyer uint64_t oldstate = rng->state;
18099119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
18109119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate);
18119119bafbSConrad Meyer }
18129119bafbSConrad Meyer
pcg_oneseq_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1813*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
18149119bafbSConrad Meyer uint32_t bound)
18159119bafbSConrad Meyer {
18169119bafbSConrad Meyer uint32_t threshold = -bound % bound;
18179119bafbSConrad Meyer for (;;) {
18189119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_rxs_m_32_random_r(rng);
18199119bafbSConrad Meyer if (r >= threshold)
18209119bafbSConrad Meyer return r % bound;
18219119bafbSConrad Meyer }
18229119bafbSConrad Meyer }
18239119bafbSConrad Meyer
18249119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_64_random_r(struct pcg_state_128 * rng)1825*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_128_rxs_m_64_random_r(struct pcg_state_128* rng)
18269119bafbSConrad Meyer {
18279119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
18289119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state);
18299119bafbSConrad Meyer }
18309119bafbSConrad Meyer #endif
18319119bafbSConrad Meyer
18329119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1833*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
18349119bafbSConrad Meyer uint64_t bound)
18359119bafbSConrad Meyer {
18369119bafbSConrad Meyer uint64_t threshold = -bound % bound;
18379119bafbSConrad Meyer for (;;) {
18389119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_rxs_m_64_random_r(rng);
18399119bafbSConrad Meyer if (r >= threshold)
18409119bafbSConrad Meyer return r % bound;
18419119bafbSConrad Meyer }
18429119bafbSConrad Meyer }
18439119bafbSConrad Meyer #endif
18449119bafbSConrad Meyer
pcg_unique_16_rxs_m_8_random_r(struct pcg_state_16 * rng)1845*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_rxs_m_8_random_r(struct pcg_state_16* rng)
18469119bafbSConrad Meyer {
18479119bafbSConrad Meyer uint16_t oldstate = rng->state;
18489119bafbSConrad Meyer pcg_unique_16_step_r(rng);
18499119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate);
18509119bafbSConrad Meyer }
18519119bafbSConrad Meyer
pcg_unique_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)1852*43eccfe9SConrad Meyer static inline uint8_t pcg_unique_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
18539119bafbSConrad Meyer uint8_t bound)
18549119bafbSConrad Meyer {
18559119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
18569119bafbSConrad Meyer for (;;) {
18579119bafbSConrad Meyer uint8_t r = pcg_unique_16_rxs_m_8_random_r(rng);
18589119bafbSConrad Meyer if (r >= threshold)
18599119bafbSConrad Meyer return r % bound;
18609119bafbSConrad Meyer }
18619119bafbSConrad Meyer }
18629119bafbSConrad Meyer
pcg_unique_32_rxs_m_16_random_r(struct pcg_state_32 * rng)1863*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_rxs_m_16_random_r(struct pcg_state_32* rng)
18649119bafbSConrad Meyer {
18659119bafbSConrad Meyer uint32_t oldstate = rng->state;
18669119bafbSConrad Meyer pcg_unique_32_step_r(rng);
18679119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate);
18689119bafbSConrad Meyer }
18699119bafbSConrad Meyer
pcg_unique_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)1870*43eccfe9SConrad Meyer static inline uint16_t pcg_unique_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
18719119bafbSConrad Meyer uint16_t bound)
18729119bafbSConrad Meyer {
18739119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
18749119bafbSConrad Meyer for (;;) {
18759119bafbSConrad Meyer uint16_t r = pcg_unique_32_rxs_m_16_random_r(rng);
18769119bafbSConrad Meyer if (r >= threshold)
18779119bafbSConrad Meyer return r % bound;
18789119bafbSConrad Meyer }
18799119bafbSConrad Meyer }
18809119bafbSConrad Meyer
pcg_unique_64_rxs_m_32_random_r(struct pcg_state_64 * rng)1881*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_rxs_m_32_random_r(struct pcg_state_64* rng)
18829119bafbSConrad Meyer {
18839119bafbSConrad Meyer uint64_t oldstate = rng->state;
18849119bafbSConrad Meyer pcg_unique_64_step_r(rng);
18859119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate);
18869119bafbSConrad Meyer }
18879119bafbSConrad Meyer
pcg_unique_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)1888*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
18899119bafbSConrad Meyer uint32_t bound)
18909119bafbSConrad Meyer {
18919119bafbSConrad Meyer uint32_t threshold = -bound % bound;
18929119bafbSConrad Meyer for (;;) {
18939119bafbSConrad Meyer uint32_t r = pcg_unique_64_rxs_m_32_random_r(rng);
18949119bafbSConrad Meyer if (r >= threshold)
18959119bafbSConrad Meyer return r % bound;
18969119bafbSConrad Meyer }
18979119bafbSConrad Meyer }
18989119bafbSConrad Meyer
18999119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_64_random_r(struct pcg_state_128 * rng)1900*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_128_rxs_m_64_random_r(struct pcg_state_128* rng)
19019119bafbSConrad Meyer {
19029119bafbSConrad Meyer pcg_unique_128_step_r(rng);
19039119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state);
19049119bafbSConrad Meyer }
19059119bafbSConrad Meyer #endif
19069119bafbSConrad Meyer
19079119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)1908*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
19099119bafbSConrad Meyer uint64_t bound)
19109119bafbSConrad Meyer {
19119119bafbSConrad Meyer uint64_t threshold = -bound % bound;
19129119bafbSConrad Meyer for (;;) {
19139119bafbSConrad Meyer uint64_t r = pcg_unique_128_rxs_m_64_random_r(rng);
19149119bafbSConrad Meyer if (r >= threshold)
19159119bafbSConrad Meyer return r % bound;
19169119bafbSConrad Meyer }
19179119bafbSConrad Meyer }
19189119bafbSConrad Meyer #endif
19199119bafbSConrad Meyer
pcg_setseq_16_rxs_m_8_random_r(struct pcg_state_setseq_16 * rng)1920*43eccfe9SConrad Meyer static inline uint8_t pcg_setseq_16_rxs_m_8_random_r(struct pcg_state_setseq_16* rng)
19219119bafbSConrad Meyer {
19229119bafbSConrad Meyer uint16_t oldstate = rng->state;
19239119bafbSConrad Meyer pcg_setseq_16_step_r(rng);
19249119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate);
19259119bafbSConrad Meyer }
19269119bafbSConrad Meyer
1927*43eccfe9SConrad Meyer static inline uint8_t
pcg_setseq_16_rxs_m_8_boundedrand_r(struct pcg_state_setseq_16 * rng,uint8_t bound)19289119bafbSConrad Meyer pcg_setseq_16_rxs_m_8_boundedrand_r(struct pcg_state_setseq_16* rng,
19299119bafbSConrad Meyer uint8_t bound)
19309119bafbSConrad Meyer {
19319119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
19329119bafbSConrad Meyer for (;;) {
19339119bafbSConrad Meyer uint8_t r = pcg_setseq_16_rxs_m_8_random_r(rng);
19349119bafbSConrad Meyer if (r >= threshold)
19359119bafbSConrad Meyer return r % bound;
19369119bafbSConrad Meyer }
19379119bafbSConrad Meyer }
19389119bafbSConrad Meyer
pcg_setseq_32_rxs_m_16_random_r(struct pcg_state_setseq_32 * rng)1939*43eccfe9SConrad Meyer static inline uint16_t pcg_setseq_32_rxs_m_16_random_r(struct pcg_state_setseq_32* rng)
19409119bafbSConrad Meyer {
19419119bafbSConrad Meyer uint32_t oldstate = rng->state;
19429119bafbSConrad Meyer pcg_setseq_32_step_r(rng);
19439119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate);
19449119bafbSConrad Meyer }
19459119bafbSConrad Meyer
1946*43eccfe9SConrad Meyer static inline uint16_t
pcg_setseq_32_rxs_m_16_boundedrand_r(struct pcg_state_setseq_32 * rng,uint16_t bound)19479119bafbSConrad Meyer pcg_setseq_32_rxs_m_16_boundedrand_r(struct pcg_state_setseq_32* rng,
19489119bafbSConrad Meyer uint16_t bound)
19499119bafbSConrad Meyer {
19509119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
19519119bafbSConrad Meyer for (;;) {
19529119bafbSConrad Meyer uint16_t r = pcg_setseq_32_rxs_m_16_random_r(rng);
19539119bafbSConrad Meyer if (r >= threshold)
19549119bafbSConrad Meyer return r % bound;
19559119bafbSConrad Meyer }
19569119bafbSConrad Meyer }
19579119bafbSConrad Meyer
pcg_setseq_64_rxs_m_32_random_r(struct pcg_state_setseq_64 * rng)1958*43eccfe9SConrad Meyer static inline uint32_t pcg_setseq_64_rxs_m_32_random_r(struct pcg_state_setseq_64* rng)
19599119bafbSConrad Meyer {
19609119bafbSConrad Meyer uint64_t oldstate = rng->state;
19619119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
19629119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate);
19639119bafbSConrad Meyer }
19649119bafbSConrad Meyer
1965*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_rxs_m_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)19669119bafbSConrad Meyer pcg_setseq_64_rxs_m_32_boundedrand_r(struct pcg_state_setseq_64* rng,
19679119bafbSConrad Meyer uint32_t bound)
19689119bafbSConrad Meyer {
19699119bafbSConrad Meyer uint32_t threshold = -bound % bound;
19709119bafbSConrad Meyer for (;;) {
19719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_rxs_m_32_random_r(rng);
19729119bafbSConrad Meyer if (r >= threshold)
19739119bafbSConrad Meyer return r % bound;
19749119bafbSConrad Meyer }
19759119bafbSConrad Meyer }
19769119bafbSConrad Meyer
19779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1978*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_rxs_m_64_random_r(struct pcg_state_setseq_128 * rng)19799119bafbSConrad Meyer pcg_setseq_128_rxs_m_64_random_r(struct pcg_state_setseq_128* rng)
19809119bafbSConrad Meyer {
19819119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
19829119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state);
19839119bafbSConrad Meyer }
19849119bafbSConrad Meyer #endif
19859119bafbSConrad Meyer
19869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
1987*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_rxs_m_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)19889119bafbSConrad Meyer pcg_setseq_128_rxs_m_64_boundedrand_r(struct pcg_state_setseq_128* rng,
19899119bafbSConrad Meyer uint64_t bound)
19909119bafbSConrad Meyer {
19919119bafbSConrad Meyer uint64_t threshold = -bound % bound;
19929119bafbSConrad Meyer for (;;) {
19939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_rxs_m_64_random_r(rng);
19949119bafbSConrad Meyer if (r >= threshold)
19959119bafbSConrad Meyer return r % bound;
19969119bafbSConrad Meyer }
19979119bafbSConrad Meyer }
19989119bafbSConrad Meyer #endif
19999119bafbSConrad Meyer
pcg_mcg_16_rxs_m_8_random_r(struct pcg_state_16 * rng)2000*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_rxs_m_8_random_r(struct pcg_state_16* rng)
20019119bafbSConrad Meyer {
20029119bafbSConrad Meyer uint16_t oldstate = rng->state;
20039119bafbSConrad Meyer pcg_mcg_16_step_r(rng);
20049119bafbSConrad Meyer return pcg_output_rxs_m_16_8(oldstate);
20059119bafbSConrad Meyer }
20069119bafbSConrad Meyer
pcg_mcg_16_rxs_m_8_boundedrand_r(struct pcg_state_16 * rng,uint8_t bound)2007*43eccfe9SConrad Meyer static inline uint8_t pcg_mcg_16_rxs_m_8_boundedrand_r(struct pcg_state_16* rng,
20089119bafbSConrad Meyer uint8_t bound)
20099119bafbSConrad Meyer {
20109119bafbSConrad Meyer uint8_t threshold = ((uint8_t)(-bound)) % bound;
20119119bafbSConrad Meyer for (;;) {
20129119bafbSConrad Meyer uint8_t r = pcg_mcg_16_rxs_m_8_random_r(rng);
20139119bafbSConrad Meyer if (r >= threshold)
20149119bafbSConrad Meyer return r % bound;
20159119bafbSConrad Meyer }
20169119bafbSConrad Meyer }
20179119bafbSConrad Meyer
pcg_mcg_32_rxs_m_16_random_r(struct pcg_state_32 * rng)2018*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_rxs_m_16_random_r(struct pcg_state_32* rng)
20199119bafbSConrad Meyer {
20209119bafbSConrad Meyer uint32_t oldstate = rng->state;
20219119bafbSConrad Meyer pcg_mcg_32_step_r(rng);
20229119bafbSConrad Meyer return pcg_output_rxs_m_32_16(oldstate);
20239119bafbSConrad Meyer }
20249119bafbSConrad Meyer
pcg_mcg_32_rxs_m_16_boundedrand_r(struct pcg_state_32 * rng,uint16_t bound)2025*43eccfe9SConrad Meyer static inline uint16_t pcg_mcg_32_rxs_m_16_boundedrand_r(struct pcg_state_32* rng,
20269119bafbSConrad Meyer uint16_t bound)
20279119bafbSConrad Meyer {
20289119bafbSConrad Meyer uint16_t threshold = ((uint16_t)(-bound)) % bound;
20299119bafbSConrad Meyer for (;;) {
20309119bafbSConrad Meyer uint16_t r = pcg_mcg_32_rxs_m_16_random_r(rng);
20319119bafbSConrad Meyer if (r >= threshold)
20329119bafbSConrad Meyer return r % bound;
20339119bafbSConrad Meyer }
20349119bafbSConrad Meyer }
20359119bafbSConrad Meyer
pcg_mcg_64_rxs_m_32_random_r(struct pcg_state_64 * rng)2036*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_rxs_m_32_random_r(struct pcg_state_64* rng)
20379119bafbSConrad Meyer {
20389119bafbSConrad Meyer uint64_t oldstate = rng->state;
20399119bafbSConrad Meyer pcg_mcg_64_step_r(rng);
20409119bafbSConrad Meyer return pcg_output_rxs_m_64_32(oldstate);
20419119bafbSConrad Meyer }
20429119bafbSConrad Meyer
pcg_mcg_64_rxs_m_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2043*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_rxs_m_32_boundedrand_r(struct pcg_state_64* rng,
20449119bafbSConrad Meyer uint32_t bound)
20459119bafbSConrad Meyer {
20469119bafbSConrad Meyer uint32_t threshold = -bound % bound;
20479119bafbSConrad Meyer for (;;) {
20489119bafbSConrad Meyer uint32_t r = pcg_mcg_64_rxs_m_32_random_r(rng);
20499119bafbSConrad Meyer if (r >= threshold)
20509119bafbSConrad Meyer return r % bound;
20519119bafbSConrad Meyer }
20529119bafbSConrad Meyer }
20539119bafbSConrad Meyer
20549119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_rxs_m_64_random_r(struct pcg_state_128 * rng)2055*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_rxs_m_64_random_r(struct pcg_state_128* rng)
20569119bafbSConrad Meyer {
20579119bafbSConrad Meyer pcg_mcg_128_step_r(rng);
20589119bafbSConrad Meyer return pcg_output_rxs_m_128_64(rng->state);
20599119bafbSConrad Meyer }
20609119bafbSConrad Meyer #endif
20619119bafbSConrad Meyer
20629119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_rxs_m_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2063*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_rxs_m_64_boundedrand_r(struct pcg_state_128* rng,
20649119bafbSConrad Meyer uint64_t bound)
20659119bafbSConrad Meyer {
20669119bafbSConrad Meyer uint64_t threshold = -bound % bound;
20679119bafbSConrad Meyer for (;;) {
20689119bafbSConrad Meyer uint64_t r = pcg_mcg_128_rxs_m_64_random_r(rng);
20699119bafbSConrad Meyer if (r >= threshold)
20709119bafbSConrad Meyer return r % bound;
20719119bafbSConrad Meyer }
20729119bafbSConrad Meyer }
20739119bafbSConrad Meyer #endif
20749119bafbSConrad Meyer
20759119bafbSConrad Meyer /* Generation functions for XSL RR (only defined for "large" types) */
20769119bafbSConrad Meyer
pcg_oneseq_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2077*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
20789119bafbSConrad Meyer {
20799119bafbSConrad Meyer uint64_t oldstate = rng->state;
20809119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
20819119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate);
20829119bafbSConrad Meyer }
20839119bafbSConrad Meyer
pcg_oneseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2084*43eccfe9SConrad Meyer static inline uint32_t pcg_oneseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
20859119bafbSConrad Meyer uint32_t bound)
20869119bafbSConrad Meyer {
20879119bafbSConrad Meyer uint32_t threshold = -bound % bound;
20889119bafbSConrad Meyer for (;;) {
20899119bafbSConrad Meyer uint32_t r = pcg_oneseq_64_xsl_rr_32_random_r(rng);
20909119bafbSConrad Meyer if (r >= threshold)
20919119bafbSConrad Meyer return r % bound;
20929119bafbSConrad Meyer }
20939119bafbSConrad Meyer }
20949119bafbSConrad Meyer
20959119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2096*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
20979119bafbSConrad Meyer {
20989119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
20999119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state);
21009119bafbSConrad Meyer }
21019119bafbSConrad Meyer #endif
21029119bafbSConrad Meyer
21039119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2104*43eccfe9SConrad Meyer static inline uint64_t
pcg_oneseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)21059119bafbSConrad Meyer pcg_oneseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
21069119bafbSConrad Meyer uint64_t bound)
21079119bafbSConrad Meyer {
21089119bafbSConrad Meyer uint64_t threshold = -bound % bound;
21099119bafbSConrad Meyer for (;;) {
21109119bafbSConrad Meyer uint64_t r = pcg_oneseq_128_xsl_rr_64_random_r(rng);
21119119bafbSConrad Meyer if (r >= threshold)
21129119bafbSConrad Meyer return r % bound;
21139119bafbSConrad Meyer }
21149119bafbSConrad Meyer }
21159119bafbSConrad Meyer #endif
21169119bafbSConrad Meyer
pcg_unique_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2117*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
21189119bafbSConrad Meyer {
21199119bafbSConrad Meyer uint64_t oldstate = rng->state;
21209119bafbSConrad Meyer pcg_unique_64_step_r(rng);
21219119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate);
21229119bafbSConrad Meyer }
21239119bafbSConrad Meyer
pcg_unique_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2124*43eccfe9SConrad Meyer static inline uint32_t pcg_unique_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
21259119bafbSConrad Meyer uint32_t bound)
21269119bafbSConrad Meyer {
21279119bafbSConrad Meyer uint32_t threshold = -bound % bound;
21289119bafbSConrad Meyer for (;;) {
21299119bafbSConrad Meyer uint32_t r = pcg_unique_64_xsl_rr_32_random_r(rng);
21309119bafbSConrad Meyer if (r >= threshold)
21319119bafbSConrad Meyer return r % bound;
21329119bafbSConrad Meyer }
21339119bafbSConrad Meyer }
21349119bafbSConrad Meyer
21359119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2136*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
21379119bafbSConrad Meyer {
21389119bafbSConrad Meyer pcg_unique_128_step_r(rng);
21399119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state);
21409119bafbSConrad Meyer }
21419119bafbSConrad Meyer #endif
21429119bafbSConrad Meyer
21439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2144*43eccfe9SConrad Meyer static inline uint64_t
pcg_unique_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)21459119bafbSConrad Meyer pcg_unique_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
21469119bafbSConrad Meyer uint64_t bound)
21479119bafbSConrad Meyer {
21489119bafbSConrad Meyer uint64_t threshold = -bound % bound;
21499119bafbSConrad Meyer for (;;) {
21509119bafbSConrad Meyer uint64_t r = pcg_unique_128_xsl_rr_64_random_r(rng);
21519119bafbSConrad Meyer if (r >= threshold)
21529119bafbSConrad Meyer return r % bound;
21539119bafbSConrad Meyer }
21549119bafbSConrad Meyer }
21559119bafbSConrad Meyer #endif
21569119bafbSConrad Meyer
2157*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsl_rr_32_random_r(struct pcg_state_setseq_64 * rng)21589119bafbSConrad Meyer pcg_setseq_64_xsl_rr_32_random_r(struct pcg_state_setseq_64* rng)
21599119bafbSConrad Meyer {
21609119bafbSConrad Meyer uint64_t oldstate = rng->state;
21619119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
21629119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate);
21639119bafbSConrad Meyer }
21649119bafbSConrad Meyer
2165*43eccfe9SConrad Meyer static inline uint32_t
pcg_setseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_setseq_64 * rng,uint32_t bound)21669119bafbSConrad Meyer pcg_setseq_64_xsl_rr_32_boundedrand_r(struct pcg_state_setseq_64* rng,
21679119bafbSConrad Meyer uint32_t bound)
21689119bafbSConrad Meyer {
21699119bafbSConrad Meyer uint32_t threshold = -bound % bound;
21709119bafbSConrad Meyer for (;;) {
21719119bafbSConrad Meyer uint32_t r = pcg_setseq_64_xsl_rr_32_random_r(rng);
21729119bafbSConrad Meyer if (r >= threshold)
21739119bafbSConrad Meyer return r % bound;
21749119bafbSConrad Meyer }
21759119bafbSConrad Meyer }
21769119bafbSConrad Meyer
21779119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2178*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsl_rr_64_random_r(struct pcg_state_setseq_128 * rng)21799119bafbSConrad Meyer pcg_setseq_128_xsl_rr_64_random_r(struct pcg_state_setseq_128* rng)
21809119bafbSConrad Meyer {
21819119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
21829119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state);
21839119bafbSConrad Meyer }
21849119bafbSConrad Meyer #endif
21859119bafbSConrad Meyer
21869119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2187*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_setseq_128 * rng,uint64_t bound)21889119bafbSConrad Meyer pcg_setseq_128_xsl_rr_64_boundedrand_r(struct pcg_state_setseq_128* rng,
21899119bafbSConrad Meyer uint64_t bound)
21909119bafbSConrad Meyer {
21919119bafbSConrad Meyer uint64_t threshold = -bound % bound;
21929119bafbSConrad Meyer for (;;) {
21939119bafbSConrad Meyer uint64_t r = pcg_setseq_128_xsl_rr_64_random_r(rng);
21949119bafbSConrad Meyer if (r >= threshold)
21959119bafbSConrad Meyer return r % bound;
21969119bafbSConrad Meyer }
21979119bafbSConrad Meyer }
21989119bafbSConrad Meyer #endif
21999119bafbSConrad Meyer
pcg_mcg_64_xsl_rr_32_random_r(struct pcg_state_64 * rng)2200*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsl_rr_32_random_r(struct pcg_state_64* rng)
22019119bafbSConrad Meyer {
22029119bafbSConrad Meyer uint64_t oldstate = rng->state;
22039119bafbSConrad Meyer pcg_mcg_64_step_r(rng);
22049119bafbSConrad Meyer return pcg_output_xsl_rr_64_32(oldstate);
22059119bafbSConrad Meyer }
22069119bafbSConrad Meyer
pcg_mcg_64_xsl_rr_32_boundedrand_r(struct pcg_state_64 * rng,uint32_t bound)2207*43eccfe9SConrad Meyer static inline uint32_t pcg_mcg_64_xsl_rr_32_boundedrand_r(struct pcg_state_64* rng,
22089119bafbSConrad Meyer uint32_t bound)
22099119bafbSConrad Meyer {
22109119bafbSConrad Meyer uint32_t threshold = -bound % bound;
22119119bafbSConrad Meyer for (;;) {
22129119bafbSConrad Meyer uint32_t r = pcg_mcg_64_xsl_rr_32_random_r(rng);
22139119bafbSConrad Meyer if (r >= threshold)
22149119bafbSConrad Meyer return r % bound;
22159119bafbSConrad Meyer }
22169119bafbSConrad Meyer }
22179119bafbSConrad Meyer
22189119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsl_rr_64_random_r(struct pcg_state_128 * rng)2219*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsl_rr_64_random_r(struct pcg_state_128* rng)
22209119bafbSConrad Meyer {
22219119bafbSConrad Meyer pcg_mcg_128_step_r(rng);
22229119bafbSConrad Meyer return pcg_output_xsl_rr_128_64(rng->state);
22239119bafbSConrad Meyer }
22249119bafbSConrad Meyer #endif
22259119bafbSConrad Meyer
22269119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_mcg_128_xsl_rr_64_boundedrand_r(struct pcg_state_128 * rng,uint64_t bound)2227*43eccfe9SConrad Meyer static inline uint64_t pcg_mcg_128_xsl_rr_64_boundedrand_r(struct pcg_state_128* rng,
22289119bafbSConrad Meyer uint64_t bound)
22299119bafbSConrad Meyer {
22309119bafbSConrad Meyer uint64_t threshold = -bound % bound;
22319119bafbSConrad Meyer for (;;) {
22329119bafbSConrad Meyer uint64_t r = pcg_mcg_128_xsl_rr_64_random_r(rng);
22339119bafbSConrad Meyer if (r >= threshold)
22349119bafbSConrad Meyer return r % bound;
22359119bafbSConrad Meyer }
22369119bafbSConrad Meyer }
22379119bafbSConrad Meyer #endif
22389119bafbSConrad Meyer
22399119bafbSConrad Meyer /* Generation functions for XSL RR RR (only defined for "large" types) */
22409119bafbSConrad Meyer
pcg_oneseq_64_xsl_rr_rr_64_random_r(struct pcg_state_64 * rng)2241*43eccfe9SConrad Meyer static inline uint64_t pcg_oneseq_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng)
22429119bafbSConrad Meyer {
22439119bafbSConrad Meyer uint64_t oldstate = rng->state;
22449119bafbSConrad Meyer pcg_oneseq_64_step_r(rng);
22459119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate);
22469119bafbSConrad Meyer }
22479119bafbSConrad Meyer
2248*43eccfe9SConrad Meyer static inline uint64_t
pcg_oneseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)22499119bafbSConrad Meyer pcg_oneseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng,
22509119bafbSConrad Meyer uint64_t bound)
22519119bafbSConrad Meyer {
22529119bafbSConrad Meyer uint64_t threshold = -bound % bound;
22539119bafbSConrad Meyer for (;;) {
22549119bafbSConrad Meyer uint64_t r = pcg_oneseq_64_xsl_rr_rr_64_random_r(rng);
22559119bafbSConrad Meyer if (r >= threshold)
22569119bafbSConrad Meyer return r % bound;
22579119bafbSConrad Meyer }
22589119bafbSConrad Meyer }
22599119bafbSConrad Meyer
22609119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_oneseq_128_xsl_rr_rr_128_random_r(struct pcg_state_128 * rng)2261*43eccfe9SConrad Meyer static inline pcg128_t pcg_oneseq_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng)
22629119bafbSConrad Meyer {
22639119bafbSConrad Meyer pcg_oneseq_128_step_r(rng);
22649119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state);
22659119bafbSConrad Meyer }
22669119bafbSConrad Meyer #endif
22679119bafbSConrad Meyer
22689119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2269*43eccfe9SConrad Meyer static inline pcg128_t
pcg_oneseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)22709119bafbSConrad Meyer pcg_oneseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng,
22719119bafbSConrad Meyer pcg128_t bound)
22729119bafbSConrad Meyer {
22739119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
22749119bafbSConrad Meyer for (;;) {
22759119bafbSConrad Meyer pcg128_t r = pcg_oneseq_128_xsl_rr_rr_128_random_r(rng);
22769119bafbSConrad Meyer if (r >= threshold)
22779119bafbSConrad Meyer return r % bound;
22789119bafbSConrad Meyer }
22799119bafbSConrad Meyer }
22809119bafbSConrad Meyer #endif
22819119bafbSConrad Meyer
pcg_unique_64_xsl_rr_rr_64_random_r(struct pcg_state_64 * rng)2282*43eccfe9SConrad Meyer static inline uint64_t pcg_unique_64_xsl_rr_rr_64_random_r(struct pcg_state_64* rng)
22839119bafbSConrad Meyer {
22849119bafbSConrad Meyer uint64_t oldstate = rng->state;
22859119bafbSConrad Meyer pcg_unique_64_step_r(rng);
22869119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate);
22879119bafbSConrad Meyer }
22889119bafbSConrad Meyer
2289*43eccfe9SConrad Meyer static inline uint64_t
pcg_unique_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64 * rng,uint64_t bound)22909119bafbSConrad Meyer pcg_unique_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_64* rng,
22919119bafbSConrad Meyer uint64_t bound)
22929119bafbSConrad Meyer {
22939119bafbSConrad Meyer uint64_t threshold = -bound % bound;
22949119bafbSConrad Meyer for (;;) {
22959119bafbSConrad Meyer uint64_t r = pcg_unique_64_xsl_rr_rr_64_random_r(rng);
22969119bafbSConrad Meyer if (r >= threshold)
22979119bafbSConrad Meyer return r % bound;
22989119bafbSConrad Meyer }
22999119bafbSConrad Meyer }
23009119bafbSConrad Meyer
23019119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
pcg_unique_128_xsl_rr_rr_128_random_r(struct pcg_state_128 * rng)2302*43eccfe9SConrad Meyer static inline pcg128_t pcg_unique_128_xsl_rr_rr_128_random_r(struct pcg_state_128* rng)
23039119bafbSConrad Meyer {
23049119bafbSConrad Meyer pcg_unique_128_step_r(rng);
23059119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state);
23069119bafbSConrad Meyer }
23079119bafbSConrad Meyer #endif
23089119bafbSConrad Meyer
23099119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2310*43eccfe9SConrad Meyer static inline pcg128_t
pcg_unique_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128 * rng,pcg128_t bound)23119119bafbSConrad Meyer pcg_unique_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_128* rng,
23129119bafbSConrad Meyer pcg128_t bound)
23139119bafbSConrad Meyer {
23149119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
23159119bafbSConrad Meyer for (;;) {
23169119bafbSConrad Meyer pcg128_t r = pcg_unique_128_xsl_rr_rr_128_random_r(rng);
23179119bafbSConrad Meyer if (r >= threshold)
23189119bafbSConrad Meyer return r % bound;
23199119bafbSConrad Meyer }
23209119bafbSConrad Meyer }
23219119bafbSConrad Meyer #endif
23229119bafbSConrad Meyer
2323*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_64_xsl_rr_rr_64_random_r(struct pcg_state_setseq_64 * rng)23249119bafbSConrad Meyer pcg_setseq_64_xsl_rr_rr_64_random_r(struct pcg_state_setseq_64* rng)
23259119bafbSConrad Meyer {
23269119bafbSConrad Meyer uint64_t oldstate = rng->state;
23279119bafbSConrad Meyer pcg_setseq_64_step_r(rng);
23289119bafbSConrad Meyer return pcg_output_xsl_rr_rr_64_64(oldstate);
23299119bafbSConrad Meyer }
23309119bafbSConrad Meyer
2331*43eccfe9SConrad Meyer static inline uint64_t
pcg_setseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_setseq_64 * rng,uint64_t bound)23329119bafbSConrad Meyer pcg_setseq_64_xsl_rr_rr_64_boundedrand_r(struct pcg_state_setseq_64* rng,
23339119bafbSConrad Meyer uint64_t bound)
23349119bafbSConrad Meyer {
23359119bafbSConrad Meyer uint64_t threshold = -bound % bound;
23369119bafbSConrad Meyer for (;;) {
23379119bafbSConrad Meyer uint64_t r = pcg_setseq_64_xsl_rr_rr_64_random_r(rng);
23389119bafbSConrad Meyer if (r >= threshold)
23399119bafbSConrad Meyer return r % bound;
23409119bafbSConrad Meyer }
23419119bafbSConrad Meyer }
23429119bafbSConrad Meyer
23439119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2344*43eccfe9SConrad Meyer static inline pcg128_t
pcg_setseq_128_xsl_rr_rr_128_random_r(struct pcg_state_setseq_128 * rng)23459119bafbSConrad Meyer pcg_setseq_128_xsl_rr_rr_128_random_r(struct pcg_state_setseq_128* rng)
23469119bafbSConrad Meyer {
23479119bafbSConrad Meyer pcg_setseq_128_step_r(rng);
23489119bafbSConrad Meyer return pcg_output_xsl_rr_rr_128_128(rng->state);
23499119bafbSConrad Meyer }
23509119bafbSConrad Meyer #endif
23519119bafbSConrad Meyer
23529119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
2353*43eccfe9SConrad Meyer static inline pcg128_t
pcg_setseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_setseq_128 * rng,pcg128_t bound)23549119bafbSConrad Meyer pcg_setseq_128_xsl_rr_rr_128_boundedrand_r(struct pcg_state_setseq_128* rng,
23559119bafbSConrad Meyer pcg128_t bound)
23569119bafbSConrad Meyer {
23579119bafbSConrad Meyer pcg128_t threshold = -bound % bound;
23589119bafbSConrad Meyer for (;;) {
23599119bafbSConrad Meyer pcg128_t r = pcg_setseq_128_xsl_rr_rr_128_random_r(rng);
23609119bafbSConrad Meyer if (r >= threshold)
23619119bafbSConrad Meyer return r % bound;
23629119bafbSConrad Meyer }
23639119bafbSConrad Meyer }
23649119bafbSConrad Meyer #endif
23659119bafbSConrad Meyer
23669119bafbSConrad Meyer /*** Typedefs */
23679119bafbSConrad Meyer typedef struct pcg_state_setseq_64 pcg32_random_t;
23689119bafbSConrad Meyer typedef struct pcg_state_64 pcg32s_random_t;
23699119bafbSConrad Meyer typedef struct pcg_state_64 pcg32u_random_t;
23709119bafbSConrad Meyer typedef struct pcg_state_64 pcg32f_random_t;
23719119bafbSConrad Meyer /*** random_r */
23729119bafbSConrad Meyer #define pcg32_random_r pcg_setseq_64_xsh_rr_32_random_r
23739119bafbSConrad Meyer #define pcg32s_random_r pcg_oneseq_64_xsh_rr_32_random_r
23749119bafbSConrad Meyer #define pcg32u_random_r pcg_unique_64_xsh_rr_32_random_r
23759119bafbSConrad Meyer #define pcg32f_random_r pcg_mcg_64_xsh_rs_32_random_r
23769119bafbSConrad Meyer /*** boundedrand_r */
23779119bafbSConrad Meyer #define pcg32_boundedrand_r pcg_setseq_64_xsh_rr_32_boundedrand_r
23789119bafbSConrad Meyer #define pcg32s_boundedrand_r pcg_oneseq_64_xsh_rr_32_boundedrand_r
23799119bafbSConrad Meyer #define pcg32u_boundedrand_r pcg_unique_64_xsh_rr_32_boundedrand_r
23809119bafbSConrad Meyer #define pcg32f_boundedrand_r pcg_mcg_64_xsh_rs_32_boundedrand_r
23819119bafbSConrad Meyer /*** srandom_r */
23829119bafbSConrad Meyer #define pcg32_srandom_r pcg_setseq_64_srandom_r
23839119bafbSConrad Meyer #define pcg32s_srandom_r pcg_oneseq_64_srandom_r
23849119bafbSConrad Meyer #define pcg32u_srandom_r pcg_unique_64_srandom_r
23859119bafbSConrad Meyer #define pcg32f_srandom_r pcg_mcg_64_srandom_r
23869119bafbSConrad Meyer /*** advance_r */
23879119bafbSConrad Meyer #define pcg32_advance_r pcg_setseq_64_advance_r
23889119bafbSConrad Meyer #define pcg32s_advance_r pcg_oneseq_64_advance_r
23899119bafbSConrad Meyer #define pcg32u_advance_r pcg_unique_64_advance_r
23909119bafbSConrad Meyer #define pcg32f_advance_r pcg_mcg_64_advance_r
23919119bafbSConrad Meyer
23929119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
23939119bafbSConrad Meyer /*** Typedefs */
23949119bafbSConrad Meyer typedef struct pcg_state_setseq_128 pcg64_random_t;
23959119bafbSConrad Meyer typedef struct pcg_state_128 pcg64s_random_t;
23969119bafbSConrad Meyer typedef struct pcg_state_128 pcg64u_random_t;
23979119bafbSConrad Meyer typedef struct pcg_state_128 pcg64f_random_t;
23989119bafbSConrad Meyer /*** random_r */
23999119bafbSConrad Meyer #define pcg64_random_r pcg_setseq_128_xsl_rr_64_random_r
24009119bafbSConrad Meyer #define pcg64s_random_r pcg_oneseq_128_xsl_rr_64_random_r
24019119bafbSConrad Meyer #define pcg64u_random_r pcg_unique_128_xsl_rr_64_random_r
24029119bafbSConrad Meyer #define pcg64f_random_r pcg_mcg_128_xsl_rr_64_random_r
24039119bafbSConrad Meyer /*** boundedrand_r */
24049119bafbSConrad Meyer #define pcg64_boundedrand_r pcg_setseq_128_xsl_rr_64_boundedrand_r
24059119bafbSConrad Meyer #define pcg64s_boundedrand_r pcg_oneseq_128_xsl_rr_64_boundedrand_r
24069119bafbSConrad Meyer #define pcg64u_boundedrand_r pcg_unique_128_xsl_rr_64_boundedrand_r
24079119bafbSConrad Meyer #define pcg64f_boundedrand_r pcg_mcg_128_xsl_rr_64_boundedrand_r
24089119bafbSConrad Meyer /*** srandom_r */
24099119bafbSConrad Meyer #define pcg64_srandom_r pcg_setseq_128_srandom_r
24109119bafbSConrad Meyer #define pcg64s_srandom_r pcg_oneseq_128_srandom_r
24119119bafbSConrad Meyer #define pcg64u_srandom_r pcg_unique_128_srandom_r
24129119bafbSConrad Meyer #define pcg64f_srandom_r pcg_mcg_128_srandom_r
24139119bafbSConrad Meyer /*** advance_r */
24149119bafbSConrad Meyer #define pcg64_advance_r pcg_setseq_128_advance_r
24159119bafbSConrad Meyer #define pcg64s_advance_r pcg_oneseq_128_advance_r
24169119bafbSConrad Meyer #define pcg64u_advance_r pcg_unique_128_advance_r
24179119bafbSConrad Meyer #define pcg64f_advance_r pcg_mcg_128_advance_r
24189119bafbSConrad Meyer #endif
24199119bafbSConrad Meyer
24209119bafbSConrad Meyer /*** Typedefs */
24219119bafbSConrad Meyer typedef struct pcg_state_8 pcg8si_random_t;
24229119bafbSConrad Meyer typedef struct pcg_state_16 pcg16si_random_t;
24239119bafbSConrad Meyer typedef struct pcg_state_32 pcg32si_random_t;
24249119bafbSConrad Meyer typedef struct pcg_state_64 pcg64si_random_t;
24259119bafbSConrad Meyer /*** random_r */
24269119bafbSConrad Meyer #define pcg8si_random_r pcg_oneseq_8_rxs_m_xs_8_random_r
24279119bafbSConrad Meyer #define pcg16si_random_r pcg_oneseq_16_rxs_m_xs_16_random_r
24289119bafbSConrad Meyer #define pcg32si_random_r pcg_oneseq_32_rxs_m_xs_32_random_r
24299119bafbSConrad Meyer #define pcg64si_random_r pcg_oneseq_64_rxs_m_xs_64_random_r
24309119bafbSConrad Meyer /*** boundedrand_r */
24319119bafbSConrad Meyer #define pcg8si_boundedrand_r pcg_oneseq_8_rxs_m_xs_8_boundedrand_r
24329119bafbSConrad Meyer #define pcg16si_boundedrand_r pcg_oneseq_16_rxs_m_xs_16_boundedrand_r
24339119bafbSConrad Meyer #define pcg32si_boundedrand_r pcg_oneseq_32_rxs_m_xs_32_boundedrand_r
24349119bafbSConrad Meyer #define pcg64si_boundedrand_r pcg_oneseq_64_rxs_m_xs_64_boundedrand_r
24359119bafbSConrad Meyer /*** srandom_r */
24369119bafbSConrad Meyer #define pcg8si_srandom_r pcg_oneseq_8_srandom_r
24379119bafbSConrad Meyer #define pcg16si_srandom_r pcg_oneseq_16_srandom_r
24389119bafbSConrad Meyer #define pcg32si_srandom_r pcg_oneseq_32_srandom_r
24399119bafbSConrad Meyer #define pcg64si_srandom_r pcg_oneseq_64_srandom_r
24409119bafbSConrad Meyer /*** advance_r */
24419119bafbSConrad Meyer #define pcg8si_advance_r pcg_oneseq_8_advance_r
24429119bafbSConrad Meyer #define pcg16si_advance_r pcg_oneseq_16_advance_r
24439119bafbSConrad Meyer #define pcg32si_advance_r pcg_oneseq_32_advance_r
24449119bafbSConrad Meyer #define pcg64si_advance_r pcg_oneseq_64_advance_r
24459119bafbSConrad Meyer
24469119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
24479119bafbSConrad Meyer typedef struct pcg_state_128 pcg128si_random_t;
24489119bafbSConrad Meyer #define pcg128si_random_r pcg_oneseq_128_rxs_m_xs_128_random_r
24499119bafbSConrad Meyer #define pcg128si_boundedrand_r pcg_oneseq_128_rxs_m_xs_128_boundedrand_r
24509119bafbSConrad Meyer #define pcg128si_srandom_r pcg_oneseq_128_srandom_r
24519119bafbSConrad Meyer #define pcg128si_advance_r pcg_oneseq_128_advance_r
24529119bafbSConrad Meyer #endif
24539119bafbSConrad Meyer
24549119bafbSConrad Meyer /*** Typedefs */
24559119bafbSConrad Meyer typedef struct pcg_state_setseq_8 pcg8i_random_t;
24569119bafbSConrad Meyer typedef struct pcg_state_setseq_16 pcg16i_random_t;
24579119bafbSConrad Meyer typedef struct pcg_state_setseq_32 pcg32i_random_t;
24589119bafbSConrad Meyer typedef struct pcg_state_setseq_64 pcg64i_random_t;
24599119bafbSConrad Meyer /*** random_r */
24609119bafbSConrad Meyer #define pcg8i_random_r pcg_setseq_8_rxs_m_xs_8_random_r
24619119bafbSConrad Meyer #define pcg16i_random_r pcg_setseq_16_rxs_m_xs_16_random_r
24629119bafbSConrad Meyer #define pcg32i_random_r pcg_setseq_32_rxs_m_xs_32_random_r
24639119bafbSConrad Meyer #define pcg64i_random_r pcg_setseq_64_rxs_m_xs_64_random_r
24649119bafbSConrad Meyer /*** boundedrand_r */
24659119bafbSConrad Meyer #define pcg8i_boundedrand_r pcg_setseq_8_rxs_m_xs_8_boundedrand_r
24669119bafbSConrad Meyer #define pcg16i_boundedrand_r pcg_setseq_16_rxs_m_xs_16_boundedrand_r
24679119bafbSConrad Meyer #define pcg32i_boundedrand_r pcg_setseq_32_rxs_m_xs_32_boundedrand_r
24689119bafbSConrad Meyer #define pcg64i_boundedrand_r pcg_setseq_64_rxs_m_xs_64_boundedrand_r
24699119bafbSConrad Meyer /*** srandom_r */
24709119bafbSConrad Meyer #define pcg8i_srandom_r pcg_setseq_8_srandom_r
24719119bafbSConrad Meyer #define pcg16i_srandom_r pcg_setseq_16_srandom_r
24729119bafbSConrad Meyer #define pcg32i_srandom_r pcg_setseq_32_srandom_r
24739119bafbSConrad Meyer #define pcg64i_srandom_r pcg_setseq_64_srandom_r
24749119bafbSConrad Meyer /*** advance_r */
24759119bafbSConrad Meyer #define pcg8i_advance_r pcg_setseq_8_advance_r
24769119bafbSConrad Meyer #define pcg16i_advance_r pcg_setseq_16_advance_r
24779119bafbSConrad Meyer #define pcg32i_advance_r pcg_setseq_32_advance_r
24789119bafbSConrad Meyer #define pcg64i_advance_r pcg_setseq_64_advance_r
24799119bafbSConrad Meyer
24809119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
24819119bafbSConrad Meyer typedef struct pcg_state_setseq_128 pcg128i_random_t;
24829119bafbSConrad Meyer #define pcg128i_random_r pcg_setseq_128_rxs_m_xs_128_random_r
24839119bafbSConrad Meyer #define pcg128i_boundedrand_r pcg_setseq_128_rxs_m_xs_128_boundedrand_r
24849119bafbSConrad Meyer #define pcg128i_srandom_r pcg_setseq_128_srandom_r
24859119bafbSConrad Meyer #define pcg128i_advance_r pcg_setseq_128_advance_r
24869119bafbSConrad Meyer #endif
24879119bafbSConrad Meyer
24889119bafbSConrad Meyer /*
24899119bafbSConrad Meyer * Static initialization constants (if you can't call srandom for some
24909119bafbSConrad Meyer * bizarre reason).
24919119bafbSConrad Meyer */
24929119bafbSConrad Meyer
24939119bafbSConrad Meyer #define PCG32_INITIALIZER PCG_STATE_SETSEQ_64_INITIALIZER
24949119bafbSConrad Meyer #define PCG32U_INITIALIZER PCG_STATE_UNIQUE_64_INITIALIZER
24959119bafbSConrad Meyer #define PCG32S_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER
24969119bafbSConrad Meyer #define PCG32F_INITIALIZER PCG_STATE_MCG_64_INITIALIZER
24979119bafbSConrad Meyer
24989119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
24999119bafbSConrad Meyer #define PCG64_INITIALIZER PCG_STATE_SETSEQ_128_INITIALIZER
25009119bafbSConrad Meyer #define PCG64U_INITIALIZER PCG_STATE_UNIQUE_128_INITIALIZER
25019119bafbSConrad Meyer #define PCG64S_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER
25029119bafbSConrad Meyer #define PCG64F_INITIALIZER PCG_STATE_MCG_128_INITIALIZER
25039119bafbSConrad Meyer #endif
25049119bafbSConrad Meyer
25059119bafbSConrad Meyer #define PCG8SI_INITIALIZER PCG_STATE_ONESEQ_8_INITIALIZER
25069119bafbSConrad Meyer #define PCG16SI_INITIALIZER PCG_STATE_ONESEQ_16_INITIALIZER
25079119bafbSConrad Meyer #define PCG32SI_INITIALIZER PCG_STATE_ONESEQ_32_INITIALIZER
25089119bafbSConrad Meyer #define PCG64SI_INITIALIZER PCG_STATE_ONESEQ_64_INITIALIZER
25099119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
25109119bafbSConrad Meyer #define PCG128SI_INITIALIZER PCG_STATE_ONESEQ_128_INITIALIZER
25119119bafbSConrad Meyer #endif
25129119bafbSConrad Meyer
25139119bafbSConrad Meyer #define PCG8I_INITIALIZER PCG_STATE_SETSEQ_8_INITIALIZER
25149119bafbSConrad Meyer #define PCG16I_INITIALIZER PCG_STATE_SETSEQ_16_INITIALIZER
25159119bafbSConrad Meyer #define PCG32I_INITIALIZER PCG_STATE_SETSEQ_32_INITIALIZER
25169119bafbSConrad Meyer #define PCG64I_INITIALIZER PCG_STATE_SETSEQ_64_INITIALIZER
25179119bafbSConrad Meyer #if PCG_HAS_128BIT_OPS
25189119bafbSConrad Meyer #define PCG128I_INITIALIZER PCG_STATE_SETSEQ_128_INITIALIZER
25199119bafbSConrad Meyer #endif
25209119bafbSConrad Meyer
25218a0edc91SConrad Meyer #ifdef __cplusplus
25229119bafbSConrad Meyer }
25239119bafbSConrad Meyer #endif
25249119bafbSConrad Meyer
25259119bafbSConrad Meyer #endif /* PCG_VARIANTS_H_INCLUDED */
25269119bafbSConrad Meyer
2527