Cockatrice
2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Toggle main menu visibility
Loading...
Searching...
No Matches
SFMT-common.h
Go to the documentation of this file.
1
#pragma once
21
#ifndef SFMT_COMMON_H
22
#define SFMT_COMMON_H
23
24
#if defined(__cplusplus)
25
extern
"C"
{
26
#endif
27
28
#include "
SFMT.h
"
29
30
inline
static
void
do_recursion
(
w128_t
* r,
w128_t
* a,
w128_t
* b,
31
w128_t
* c,
w128_t
* d);
32
33
inline
static
void
rshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift);
34
inline
static
void
lshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift);
35
44
#ifdef ONLY64
45
inline
static
void
rshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift) {
46
uint64_t th, tl, oh, ol;
47
48
th = ((uint64_t)in->
u
[2] << 32) | ((uint64_t)in->
u
[3]);
49
tl = ((uint64_t)in->
u
[0] << 32) | ((uint64_t)in->
u
[1]);
50
51
oh = th >> (shift * 8);
52
ol = tl >> (shift * 8);
53
ol |= th << (64 - shift * 8);
54
out->
u
[0] = (uint32_t)(ol >> 32);
55
out->
u
[1] = (uint32_t)ol;
56
out->
u
[2] = (uint32_t)(oh >> 32);
57
out->
u
[3] = (uint32_t)oh;
58
}
59
#else
60
inline
static
void
rshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift)
61
{
62
uint64_t th, tl, oh, ol;
63
64
th = ((uint64_t)in->
u
[3] << 32) | ((uint64_t)in->
u
[2]);
65
tl = ((uint64_t)in->
u
[1] << 32) | ((uint64_t)in->
u
[0]);
66
67
oh = th >> (shift * 8);
68
ol = tl >> (shift * 8);
69
ol |= th << (64 - shift * 8);
70
out->
u
[1] = (uint32_t)(ol >> 32);
71
out->
u
[0] = (uint32_t)ol;
72
out->
u
[3] = (uint32_t)(oh >> 32);
73
out->
u
[2] = (uint32_t)oh;
74
}
75
#endif
84
#ifdef ONLY64
85
inline
static
void
lshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift) {
86
uint64_t th, tl, oh, ol;
87
88
th = ((uint64_t)in->
u
[2] << 32) | ((uint64_t)in->
u
[3]);
89
tl = ((uint64_t)in->
u
[0] << 32) | ((uint64_t)in->
u
[1]);
90
91
oh = th << (shift * 8);
92
ol = tl << (shift * 8);
93
oh |= tl >> (64 - shift * 8);
94
out->
u
[0] = (uint32_t)(ol >> 32);
95
out->
u
[1] = (uint32_t)ol;
96
out->
u
[2] = (uint32_t)(oh >> 32);
97
out->
u
[3] = (uint32_t)oh;
98
}
99
#else
100
inline
static
void
lshift128
(
w128_t
*out,
w128_t
const
*in,
int
shift)
101
{
102
uint64_t th, tl, oh, ol;
103
104
th = ((uint64_t)in->
u
[3] << 32) | ((uint64_t)in->
u
[2]);
105
tl = ((uint64_t)in->
u
[1] << 32) | ((uint64_t)in->
u
[0]);
106
107
oh = th << (shift * 8);
108
ol = tl << (shift * 8);
109
oh |= tl >> (64 - shift * 8);
110
out->
u
[1] = (uint32_t)(ol >> 32);
111
out->
u
[0] = (uint32_t)ol;
112
out->
u
[3] = (uint32_t)(oh >> 32);
113
out->
u
[2] = (uint32_t)oh;
114
}
115
#endif
124
#ifdef ONLY64
125
inline
static
void
do_recursion
(
w128_t
*r,
w128_t
*a,
w128_t
*b,
w128_t
*c,
126
w128_t
*d) {
127
w128_t
x;
128
w128_t
y;
129
130
lshift128
(&x, a,
SFMT_SL2
);
131
rshift128
(&y, c,
SFMT_SR2
);
132
r->
u
[0] = a->
u
[0] ^ x.
u
[0] ^ ((b->
u
[0] >>
SFMT_SR1
) &
SFMT_MSK2
) ^ y.
u
[0]
133
^ (d->
u
[0] <<
SFMT_SL1
);
134
r->
u
[1] = a->
u
[1] ^ x.
u
[1] ^ ((b->
u
[1] >>
SFMT_SR1
) &
SFMT_MSK1
) ^ y.
u
[1]
135
^ (d->
u
[1] <<
SFMT_SL1
);
136
r->
u
[2] = a->
u
[2] ^ x.
u
[2] ^ ((b->
u
[2] >>
SFMT_SR1
) &
SFMT_MSK4
) ^ y.
u
[2]
137
^ (d->
u
[2] <<
SFMT_SL1
);
138
r->
u
[3] = a->
u
[3] ^ x.
u
[3] ^ ((b->
u
[3] >>
SFMT_SR1
) &
SFMT_MSK3
) ^ y.
u
[3]
139
^ (d->
u
[3] <<
SFMT_SL1
);
140
}
141
#else
142
inline
static
void
do_recursion
(
w128_t
*r,
w128_t
*a,
w128_t
*b,
143
w128_t
*c,
w128_t
*d)
144
{
145
w128_t
x;
146
w128_t
y;
147
148
lshift128
(&x, a,
SFMT_SL2
);
149
rshift128
(&y, c,
SFMT_SR2
);
150
r->
u
[0] = a->
u
[0] ^ x.
u
[0] ^ ((b->
u
[0] >>
SFMT_SR1
) &
SFMT_MSK1
)
151
^ y.
u
[0] ^ (d->
u
[0] <<
SFMT_SL1
);
152
r->
u
[1] = a->
u
[1] ^ x.
u
[1] ^ ((b->
u
[1] >>
SFMT_SR1
) &
SFMT_MSK2
)
153
^ y.
u
[1] ^ (d->
u
[1] <<
SFMT_SL1
);
154
r->
u
[2] = a->
u
[2] ^ x.
u
[2] ^ ((b->
u
[2] >>
SFMT_SR1
) &
SFMT_MSK3
)
155
^ y.
u
[2] ^ (d->
u
[2] <<
SFMT_SL1
);
156
r->
u
[3] = a->
u
[3] ^ x.
u
[3] ^ ((b->
u
[3] >>
SFMT_SR1
) &
SFMT_MSK4
)
157
^ y.
u
[3] ^ (d->
u
[3] <<
SFMT_SL1
);
158
}
159
#endif
160
#if defined(__cplusplus)
161
}
162
#endif
163
164
#endif
// SFMT_COMMON_H
lshift128
static void lshift128(w128_t *out, w128_t const *in, int shift)
Definition
SFMT-common.h:100
do_recursion
static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c, w128_t *d)
Definition
SFMT-common.h:142
rshift128
static void rshift128(w128_t *out, w128_t const *in, int shift)
Definition
SFMT-common.h:60
SFMT_SR1
#define SFMT_SR1
Definition
SFMT-params19937.h:8
SFMT_SL1
#define SFMT_SL1
Definition
SFMT-params19937.h:6
SFMT_SR2
#define SFMT_SR2
Definition
SFMT-params19937.h:9
SFMT_SL2
#define SFMT_SL2
Definition
SFMT-params19937.h:7
SFMT_MSK3
#define SFMT_MSK3
Definition
SFMT-params19937.h:12
SFMT_MSK4
#define SFMT_MSK4
Definition
SFMT-params19937.h:13
SFMT_MSK2
#define SFMT_MSK2
Definition
SFMT-params19937.h:11
SFMT_MSK1
#define SFMT_MSK1
Definition
SFMT-params19937.h:10
SFMT.h
SIMD oriented Fast Mersenne Twister(SFMT) pseudorandom number generator using C structure.
w128_t
union W128_T w128_t
Definition
SFMT.h:114
W128_T::u
uint32_t u[4]
Definition
SFMT.h:108
libcockatrice_rng
libcockatrice
rng
sfmt
SFMT-common.h
Generated by
1.18.0