Cockatrice 2026-06-01-Development-3.1.0-beta.3
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
SFMT.h
Go to the documentation of this file.
1#pragma once
34
35#ifndef SFMTST_H
36#define SFMTST_H
37#if defined(__cplusplus)
38extern "C" {
39#endif
40
41#include <stdio.h>
42#include <assert.h>
43
44#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
45 #include <inttypes.h>
46#elif defined(_MSC_VER) || defined(__BORLANDC__)
47 typedef unsigned int uint32_t;
48 typedef unsigned __int64 uint64_t;
49 #define inline __inline
50#else
51 #include <inttypes.h>
52 #if defined(__GNUC__)
53 #define inline __inline__
54 #endif
55#endif
56
57#ifndef PRIu64
58 #if defined(_MSC_VER) || defined(__BORLANDC__)
59 #define PRIu64 "I64u"
60 #define PRIx64 "I64x"
61 #else
62 #define PRIu64 "llu"
63 #define PRIx64 "llx"
64 #endif
65#endif
66
67#include "SFMT-params.h"
68
69/*------------------------------------------
70 128-bit SIMD like data type for standard C
71 ------------------------------------------*/
72#if defined(HAVE_ALTIVEC)
73 #if !defined(__APPLE__)
74 #include <altivec.h>
75 #endif
77union W128_T {
78 vector unsigned int s;
79 uint32_t u[4];
80 uint64_t u64[2];
81};
82#elif defined(HAVE_NEON)
83 #include <arm_neon.h>
84
86union W128_T {
87 uint32_t u[4];
88 uint64_t u64[2];
89 uint32x4_t si;
90};
91//#elif defined(HAVE_SSE2)
92#elif defined(HAVE_SSE2)
93 #if defined(__AVX2__)
94 #include <immintrin.h>
95 #else
96 #include <emmintrin.h>
97 #endif
98
100union W128_T {
101 uint32_t u[4];
102 uint64_t u64[2];
103 __m128i si;
104};
105#else
107union W128_T {
108 uint32_t u[4];
109 uint64_t u64[2];
110};
111#endif
112
114typedef union W128_T w128_t;
115
119struct SFMT_T {
120#if defined(__AVX2__)
121 union {
123 __m256i state_ymm[SFMT_N/2];
124 #if defined(__AVX512VL__)
125 __m512i state_zmm[SFMT_N/4];
126 #endif
127 };
128#else
131#endif
133 int idx;
134};
135
136typedef struct SFMT_T sfmt_t;
137
138void sfmt_fill_array32(sfmt_t * sfmt, uint32_t * array, int size);
139void sfmt_fill_array64(sfmt_t * sfmt, uint64_t * array, int size);
140void sfmt_init_gen_rand(sfmt_t * sfmt, uint32_t seed);
141void sfmt_init_by_array(sfmt_t * sfmt, uint32_t * init_key, int key_length);
142const char * sfmt_get_idstring(sfmt_t * sfmt);
146
147#ifndef ONLY64
154inline static uint32_t sfmt_genrand_uint32(sfmt_t * sfmt) {
155 uint32_t r;
156 uint32_t * psfmt32 = &sfmt->state[0].u[0];
157
158 if (sfmt->idx >= SFMT_N32) {
159 sfmt_gen_rand_all(sfmt);
160 sfmt->idx = 0;
161 }
162 r = psfmt32[sfmt->idx++];
163 return r;
164}
165#endif
174inline static uint64_t sfmt_genrand_uint64(sfmt_t * sfmt) {
175#if defined(BIG_ENDIAN64) && !defined(ONLY64)
176 uint32_t * psfmt32 = &sfmt->state[0].u[0];
177 uint32_t r1, r2;
178#else
179 uint64_t r;
180#endif
181 uint64_t * psfmt64 = &sfmt->state[0].u64[0];
182 assert(sfmt->idx % 2 == 0);
183
184 if (sfmt->idx >= SFMT_N32) {
185 sfmt_gen_rand_all(sfmt);
186 sfmt->idx = 0;
187 }
188#if defined(BIG_ENDIAN64) && !defined(ONLY64)
189 r1 = psfmt32[sfmt->idx];
190 r2 = psfmt32[sfmt->idx + 1];
191 sfmt->idx += 2;
192 return ((uint64_t)r2 << 32) | r1;
193#else
194 r = psfmt64[sfmt->idx / 2];
195 sfmt->idx += 2;
196 return r;
197#endif
198}
199
200/* =================================================
201 The following real versions are due to Isaku Wada
202 ================================================= */
208inline static double sfmt_to_real1(uint32_t v)
209{
210 return v * (1.0/4294967295.0);
211 /* divided by 2^32-1 */
212}
213
219inline static double sfmt_genrand_real1(sfmt_t * sfmt)
220{
222}
223
229inline static double sfmt_to_real2(uint32_t v)
230{
231 return v * (1.0/4294967296.0);
232 /* divided by 2^32 */
233}
234
240inline static double sfmt_genrand_real2(sfmt_t * sfmt)
241{
243}
244
250inline static double sfmt_to_real3(uint32_t v)
251{
252 return (((double)v) + 0.5)*(1.0/4294967296.0);
253 /* divided by 2^32 */
254}
255
261inline static double sfmt_genrand_real3(sfmt_t * sfmt)
262{
264}
265
272inline static double sfmt_to_res53(uint64_t v)
273{
274 return (v >> 11) * (1.0/9007199254740992.0);
275}
276
282inline static double sfmt_genrand_res53(sfmt_t * sfmt)
283{
285}
286
287
288/* =================================================
289 The following function are added by Saito.
290 ================================================= */
295inline static double sfmt_to_res53_mix(uint32_t x, uint32_t y)
296{
297 return sfmt_to_res53(x | ((uint64_t)y << 32));
298}
299
306inline static double sfmt_genrand_res53_mix(sfmt_t * sfmt)
307{
308 uint32_t x, y;
309
310 x = sfmt_genrand_uint32(sfmt);
311 y = sfmt_genrand_uint32(sfmt);
312 return sfmt_to_res53_mix(x, y);
313}
314
315#if defined(__cplusplus)
316}
317#endif
318
319#endif
#define SFMT_N
Definition SFMT-params.h:19
#define SFMT_N32
Definition SFMT-params.h:22
void sfmt_fill_array32(sfmt_t *sfmt, uint32_t *array, int size)
void sfmt_gen_rand_all(sfmt_t *sfmt)
int sfmt_get_min_array_size64(sfmt_t *sfmt)
void sfmt_init_by_array(sfmt_t *sfmt, uint32_t *init_key, int key_length)
static double sfmt_to_real1(uint32_t v)
Definition SFMT.h:208
static uint32_t sfmt_genrand_uint32(sfmt_t *sfmt)
Definition SFMT.h:154
static double sfmt_genrand_real2(sfmt_t *sfmt)
Definition SFMT.h:240
static double sfmt_to_real3(uint32_t v)
Definition SFMT.h:250
int sfmt_get_min_array_size32(sfmt_t *sfmt)
static double sfmt_to_real2(uint32_t v)
Definition SFMT.h:229
void sfmt_init_gen_rand(sfmt_t *sfmt, uint32_t seed)
static double sfmt_to_res53_mix(uint32_t x, uint32_t y)
Definition SFMT.h:295
static double sfmt_genrand_res53_mix(sfmt_t *sfmt)
Definition SFMT.h:306
struct SFMT_T sfmt_t
Definition SFMT.h:136
const char * sfmt_get_idstring(sfmt_t *sfmt)
static double sfmt_genrand_real3(sfmt_t *sfmt)
Definition SFMT.h:261
static double sfmt_genrand_res53(sfmt_t *sfmt)
Definition SFMT.h:282
union W128_T w128_t
Definition SFMT.h:114
void sfmt_fill_array64(sfmt_t *sfmt, uint64_t *array, int size)
static double sfmt_to_res53(uint64_t v)
Definition SFMT.h:272
static double sfmt_genrand_real1(sfmt_t *sfmt)
Definition SFMT.h:219
static uint64_t sfmt_genrand_uint64(sfmt_t *sfmt)
Definition SFMT.h:174
Definition SFMT.h:119
w128_t state[SFMT_N]
Definition SFMT.h:130
int idx
Definition SFMT.h:133
Definition SFMT.h:107
uint32_t u[4]
Definition SFMT.h:108
uint64_t u64[2]
Definition SFMT.h:109