34__m256i inline Sigma0(
__m256i x) {
return Xor(
Or(
ShR(x, 2),
ShL(x, 30)),
Or(
ShR(x, 13),
ShL(x, 19)),
Or(
ShR(x, 22),
ShL(x, 10))); }
35__m256i inline Sigma1(
__m256i x) {
return Xor(
Or(
ShR(x, 6),
ShL(x, 26)),
Or(
ShR(x, 11),
ShL(x, 21)),
Or(
ShR(x, 25),
ShL(x, 7))); }
62void inline Write8(
unsigned char* out,
int offset,
__m256i v) {
88 __m256i w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
w14,
w15;
90 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x428a2f98ul),
w0 =
Read8(in, 0)));
91 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x71374491ul),
w1 =
Read8(in, 4)));
92 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb5c0fbcful),
w2 =
Read8(in, 8)));
93 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xe9b5dba5ul),
w3 =
Read8(in, 12)));
94 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x3956c25bul),
w4 =
Read8(in, 16)));
95 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x59f111f1ul),
w5 =
Read8(in, 20)));
96 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x923f82a4ul),
w6 =
Read8(in, 24)));
97 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xab1c5ed5ul),
w7 =
Read8(in, 28)));
98 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xd807aa98ul),
w8 =
Read8(in, 32)));
99 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x12835b01ul),
w9 =
Read8(in, 36)));
100 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x243185beul),
w10 =
Read8(in, 40)));
101 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x550c7dc3ul),
w11 =
Read8(in, 44)));
102 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x72be5d74ul),
w12 =
Read8(in, 48)));
103 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x80deb1feul),
w13 =
Read8(in, 52)));
104 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x9bdc06a7ul),
w14 =
Read8(in, 56)));
105 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc19bf174ul),
w15 =
Read8(in, 60)));
106 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xe49b69c1ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
107 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xefbe4786ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
108 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x0fc19dc6ul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
109 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x240ca1ccul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
110 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x2de92c6ful),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
111 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4a7484aaul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
112 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5cb0a9dcul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
113 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x76f988daul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
114 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x983e5152ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
115 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa831c66dul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
116 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb00327c8ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
117 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xbf597fc7ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
118 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xc6e00bf3ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
119 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd5a79147ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
120 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x06ca6351ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
121 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x14292967ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
122 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x27b70a85ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
123 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x2e1b2138ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
124 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x4d2c6dfcul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
125 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x53380d13ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
126 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x650a7354ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
127 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x766a0abbul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
128 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x81c2c92eul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
129 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x92722c85ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
130 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xa2bfe8a1ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
131 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa81a664bul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
132 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xc24b8b70ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
133 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xc76c51a3ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
134 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xd192e819ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
135 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd6990624ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
136 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xf40e3585ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
137 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x106aa070ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
138 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x19a4c116ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
139 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x1e376c08ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
140 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x2748774cul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
141 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x34b0bcb5ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
142 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x391c0cb3ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
143 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4ed8aa4aul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
144 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5b9cca4ful),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
145 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x682e6ff3ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
146 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x748f82eeul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
147 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x78a5636ful),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
148 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x84c87814ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
149 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x8cc70208ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
150 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x90befffaul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
151 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xa4506cebul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
152 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xbef9a3f7ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
153 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc67178f2ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
155 a = Add(
a,
K(0x6a09e667ul));
156 b = Add(b,
K(0xbb67ae85ul));
157 c = Add(
c,
K(0x3c6ef372ul));
158 d = Add(d,
K(0xa54ff53aul));
159 e = Add(
e,
K(0x510e527ful));
160 f = Add(
f,
K(0x9b05688cul));
161 g = Add(
g,
K(0x1f83d9abul));
162 h = Add(h,
K(0x5be0cd19ul));
267 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xe49b69c1ul),
Inc(
w0,
sigma0(
w1))));
268 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xefbe4786ul),
Inc(
w1,
K(0xa00000ul),
sigma0(
w2))));
269 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x0fc19dc6ul),
Inc(
w2,
sigma1(
w0),
sigma0(
w3))));
270 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x240ca1ccul),
Inc(
w3,
sigma1(
w1),
sigma0(
w4))));
271 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x2de92c6ful),
Inc(
w4,
sigma1(
w2),
sigma0(
w5))));
272 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4a7484aaul),
Inc(
w5,
sigma1(
w3),
sigma0(
w6))));
273 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5cb0a9dcul),
Inc(
w6,
sigma1(
w4),
K(0x100ul),
sigma0(
w7))));
274 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x76f988daul),
Inc(
w7,
sigma1(
w5),
w0,
K(0x11002000ul))));
275 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x983e5152ul),
w8 = Add(
K(0x80000000ul),
sigma1(
w6),
w1)));
276 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa831c66dul),
w9 = Add(
sigma1(
w7),
w2)));
277 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb00327c8ul),
w10 = Add(
sigma1(
w8),
w3)));
278 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xbf597fc7ul),
w11 = Add(
sigma1(
w9),
w4)));
279 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xc6e00bf3ul),
w12 = Add(
sigma1(
w10),
w5)));
280 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd5a79147ul),
w13 = Add(
sigma1(
w11),
w6)));
281 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x06ca6351ul),
w14 = Add(
sigma1(
w12),
w7,
K(0x400022ul))));
282 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x14292967ul),
w15 = Add(
K(0x100ul),
sigma1(
w13),
w8,
sigma0(
w0))));
283 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x27b70a85ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
284 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x2e1b2138ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
285 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x4d2c6dfcul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
286 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x53380d13ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
287 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x650a7354ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
288 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x766a0abbul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
289 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x81c2c92eul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
290 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x92722c85ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
291 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xa2bfe8a1ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
292 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa81a664bul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
293 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xc24b8b70ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
294 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xc76c51a3ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
295 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xd192e819ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
296 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd6990624ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
297 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xf40e3585ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
298 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x106aa070ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
299 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x19a4c116ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
300 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x1e376c08ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
301 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x2748774cul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
302 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x34b0bcb5ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
303 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x391c0cb3ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
304 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4ed8aa4aul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
305 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5b9cca4ful),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
306 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x682e6ff3ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
307 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x748f82eeul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
308 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x78a5636ful),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
309 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x84c87814ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
310 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x8cc70208ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
311 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x90befffaul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
312 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xa4506cebul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
313 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xbef9a3f7ul),
w14,
sigma1(
w12),
w7,
sigma0(
w15)));
314 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc67178f2ul),
w15,
sigma1(
w13),
w8,
sigma0(
w0)));
317 Write8(out, 0, Add(
a,
K(0x6a09e667ul)));
318 Write8(out, 4, Add(b,
K(0xbb67ae85ul)));
319 Write8(out, 8, Add(
c,
K(0x3c6ef372ul)));
320 Write8(out, 12, Add(d,
K(0xa54ff53aul)));
321 Write8(out, 16, Add(
e,
K(0x510e527ful)));
322 Write8(out, 20, Add(
f,
K(0x9b05688cul)));
323 Write8(out, 24, Add(
g,
K(0x1f83d9abul)));
324 Write8(out, 28, Add(h,
K(0x5be0cd19ul)));
void WriteLE32(B *ptr, uint32_t x)
uint32_t ReadLE32(const B *ptr)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform_8way(unsigned char *out, const unsigned char *in)
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.