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) \ 30 a-=e; f^=h>>9; h+=a; \ 31 b-=f; g^=a<<9; a+=b; \ 32 c-=g; h^=b>>23; b+=c; \ 33 d-=h; a^=c<<15; c+=d; \ 34 e-=a; b^=d>>14; d+=e; \ 35 f-=b; c^=e<<20; e+=f; \ 36 g-=c; d^=f>>17; f+=g; \ 37 h-=d; e^=g<<14; g+=h; \ 44 ub8 a,b,x,y,*m,*m2,*r,*mend;
47 a = rng->
aa; b = rng->
bb + (++rng->
cc);
48 for (m = rng->
mm, mend = m2 = m+(
RANDSIZ/2); m<mend; )
50 rngstep(~(a^(a<<21)), a, b, rng->
mm, m, m2, r, x);
51 rngstep( a^(a>>5) , a, b, rng->
mm, m, m2, r, x);
52 rngstep( a^(a<<12) , a, b, rng->
mm, m, m2, r, x);
53 rngstep( a^(a>>33) , a, b, rng->
mm, m, m2, r, x);
55 for (m2 = rng->
mm; m2<mend; )
57 rngstep(~(a^(a<<21)), a, b, rng->
mm, m, m2, r, x);
58 rngstep( a^(a>>5) , a, b, rng->
mm, m, m2, r, x);
59 rngstep( a^(a<<12) , a, b, rng->
mm, m, m2, r, x);
60 rngstep( a^(a>>33) , a, b, rng->
mm, m, m2, r, x);
62 rng->
bb = b; rng->
aa = a;
77 a=b=c=d=e=f=g=h=0x9e3779b97f4a7c13LL;
94 a+=r[
i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3];
95 e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7];
97 m[
i ]=a; m[i+1]=b; m[i+2]=
c; m[i+3]=d;
98 m[i+4]=
e; m[i+5]=f; m[i+6]=
g; m[i+7]=h;
104 a+=m[
i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3];
105 e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7];
106 mix(a,b,c,d,e,f,g,h);
107 m[
i ]=a; m[i+1]=b; m[i+2]=
c; m[i+3]=d;
108 m[i+4]=
e; m[i+5]=f; m[i+6]=
g; m[i+7]=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)