1 #include <../../nrnconf.h>
18 #define ind(mm, x) (*(ub8*) ((ub1*) (mm) + ((x) & ((RANDSIZ - 1) << 3))))
20 #define rngstep(mix, a, b, mm, m, m2, r, x) \
23 a = (mix) + *(m2++); \
24 *(m++) = y = ind(mm, x) + a + b; \
25 *(r++) = b = ind(mm, y >> RANDSIZL) + x; \
28 #define mix(a, b, c, d, e, f, g, h) \
58 ub8 a, b, x, y, *m, *m2, *r, *mend;
63 b = rng->
bb + (++rng->
cc);
64 for (m = rng->
mm, mend = m2 = m + (
RANDSIZ / 2); m < mend;) {
65 rngstep(~(a ^ (a << 21)), a, b, rng->
mm, m, m2, r, x);
66 rngstep(a ^ (a >> 5), a, b, rng->
mm, m, m2, r, x);
67 rngstep(a ^ (a << 12), a, b, rng->
mm, m, m2, r, x);
68 rngstep(a ^ (a >> 33), a, b, rng->
mm, m, m2, r, x);
70 for (m2 = rng->
mm; m2 < mend;) {
71 rngstep(~(a ^ (a << 21)), a, b, rng->
mm, m, m2, r, x);
72 rngstep(a ^ (a >> 5), a, b, rng->
mm, m, m2, r, x);
73 rngstep(a ^ (a << 12), a, b, rng->
mm, m, m2, r, x);
74 rngstep(a ^ (a >> 33), a, b, rng->
mm, m, m2, r, x);
83 ub8 a, b,
c, d,
e, f,
g, h;
90 a = b =
c = d =
e = f =
g = h = 0x9e3779b97f4a7c13LL;
100 for (
i = 0;
i < 4; ++
i)
102 mix(a, b,
c, d,
e, f,
g, h);
116 mix(a, b,
c, d,
e, f,
g, h);
137 mix(a, b,
c, d,
e, f,
g, h);
void isaac64_generate(struct isaac64_state *rng)
void isaac64_init(struct isaac64_state *rng, ub4 seed)
#define rngstep(mix, a, b, mm, m, m2, r, x)
#define mix(a, b, c, d, e, f, g, h)