MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / threefry

Function threefry

src/backend/cpu/kernel/random_engine_threefry.hpp:71–156  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

69}
70
71static inline void threefry(uint k[2], uint c[2], uint X[2]) {
72 uint ks[3];
73
74 ks[2] = SKEIN_KS_PARITY;
75 ks[0] = k[0];
76 X[0] = c[0];
77 ks[2] ^= k[0];
78 ks[1] = k[1];
79 X[1] = c[1];
80 ks[2] ^= k[1];
81
82 X[0] += ks[0];
83 X[1] += ks[1];
84
85 X[0] += X[1];
86 X[1] = rotL(X[1], R0);
87 X[1] ^= X[0];
88 X[0] += X[1];
89 X[1] = rotL(X[1], R1);
90 X[1] ^= X[0];
91 X[0] += X[1];
92 X[1] = rotL(X[1], R2);
93 X[1] ^= X[0];
94 X[0] += X[1];
95 X[1] = rotL(X[1], R3);
96 X[1] ^= X[0];
97
98 /* InjectKey(r=1) */
99 X[0] += ks[1];
100 X[1] += ks[2];
101 X[1] += 1; /* X[2-1] += r */
102
103 X[0] += X[1];
104 X[1] = rotL(X[1], R4);
105 X[1] ^= X[0];
106 X[0] += X[1];
107 X[1] = rotL(X[1], R5);
108 X[1] ^= X[0];
109 X[0] += X[1];
110 X[1] = rotL(X[1], R6);
111 X[1] ^= X[0];
112 X[0] += X[1];
113 X[1] = rotL(X[1], R7);
114 X[1] ^= X[0];
115
116 /* InjectKey(r=2) */
117 X[0] += ks[2];
118 X[1] += ks[0];
119 X[1] += 2;
120
121 X[0] += X[1];
122 X[1] = rotL(X[1], R0);
123 X[1] ^= X[0];
124 X[0] += X[1];
125 X[1] = rotL(X[1], R1);
126 X[1] ^= X[0];
127 X[0] += X[1];
128 X[1] = rotL(X[1], R2);

Callers 2

threefryUniformFunction · 0.70
threefryNormalFunction · 0.70

Calls 1

rotLFunction · 0.70

Tested by

no test coverage detected