@@ -215,177 +215,171 @@ void Hasher<SHA256, HARDWARE>::TransformX86(const uint8_t* const data)
215
215
STATE0 = _mm_alignr_epi8 (TMP, STATE1, 8 ); // ABEF
216
216
STATE1 = _mm_blend_epi16 (STATE1, TMP, 0xF0 ); // CDGH
217
217
218
- // while (size >= 64)
219
- {
220
- // Save current state
221
- ABEF_SAVE = STATE0;
222
- CDGH_SAVE = STATE1;
223
-
224
- // Load data
225
- MSG = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(preparedData + 0 ));
226
- MSG1 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(preparedData + 16 ));
227
- MSG2 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(preparedData + 32 ));
228
- MSG3 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(preparedData + 48 ));
229
-
230
- // Rounds 0-3
231
- // MSG = _mm_loadu_si128((const __m128i*) (data+0));
232
- MSG0 = _mm_shuffle_epi8 (MSG, MASK);
233
- MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0xE9B5DBA5B5C0FBCFULL , 0x71374491428A2F98ULL ));
234
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
235
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
236
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
237
-
238
- // Rounds 4-7
239
- // MSG1 = _mm_loadu_si128((const __m128i*) (data+16));
240
- MSG1 = _mm_shuffle_epi8 (MSG1, MASK);
241
- MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0xAB1C5ED5923F82A4ULL , 0x59F111F13956C25BULL ));
242
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
243
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
244
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
245
- MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
246
-
247
- // Rounds 8-11
248
- // MSG2 = _mm_loadu_si128((const __m128i*) (data+32));
249
- MSG2 = _mm_shuffle_epi8 (MSG2, MASK);
250
- MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0x550C7DC3243185BEULL , 0x12835B01D807AA98ULL ));
251
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
252
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
253
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
254
- MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
255
-
256
- // Rounds 12-15
257
- // MSG3 = _mm_loadu_si128((const __m128i*) (data+48));
258
- MSG3 = _mm_shuffle_epi8 (MSG3, MASK);
259
- MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0xC19BF1749BDC06A7ULL , 0x80DEB1FE72BE5D74ULL ));
260
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
261
- TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
262
- MSG0 = _mm_add_epi32 (MSG0, TMP);
263
- MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
264
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
265
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
266
- MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
267
-
268
- // Rounds 16-19
269
- MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x240CA1CC0FC19DC6ULL , 0xEFBE4786E49B69C1ULL ));
270
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
271
- TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
272
- MSG1 = _mm_add_epi32 (MSG1, TMP);
273
- MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
274
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
275
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
276
- MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
277
-
278
- // Rounds 20-23
279
- MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x76F988DA5CB0A9DCULL , 0x4A7484AA2DE92C6FULL ));
280
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
281
- TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
282
- MSG2 = _mm_add_epi32 (MSG2, TMP);
283
- MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
284
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
285
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
286
- MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
287
-
288
- // Rounds 24-27
289
- MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0xBF597FC7B00327C8ULL , 0xA831C66D983E5152ULL ));
290
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
291
- TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
292
- MSG3 = _mm_add_epi32 (MSG3, TMP);
293
- MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
294
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
295
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
296
- MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
297
-
298
- // Rounds 28-31
299
- MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0x1429296706CA6351ULL , 0xD5A79147C6E00BF3ULL ));
300
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
301
- TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
302
- MSG0 = _mm_add_epi32 (MSG0, TMP);
303
- MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
304
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
305
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
306
- MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
307
-
308
- // Rounds 32-35
309
- MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x53380D134D2C6DFCULL , 0x2E1B213827B70A85ULL ));
310
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
311
- TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
312
- MSG1 = _mm_add_epi32 (MSG1, TMP);
313
- MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
314
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
315
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
316
- MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
317
-
318
- // Rounds 36-39
319
- MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x92722C8581C2C92EULL , 0x766A0ABB650A7354ULL ));
320
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
321
- TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
322
- MSG2 = _mm_add_epi32 (MSG2, TMP);
323
- MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
324
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
325
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
326
- MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
327
-
328
- // Rounds 40-43
329
- MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0xC76C51A3C24B8B70ULL , 0xA81A664BA2BFE8A1ULL ));
330
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
331
- TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
332
- MSG3 = _mm_add_epi32 (MSG3, TMP);
333
- MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
334
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
335
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
336
- MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
337
-
338
- // Rounds 44-47
339
- MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0x106AA070F40E3585ULL , 0xD6990624D192E819ULL ));
340
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
341
- TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
342
- MSG0 = _mm_add_epi32 (MSG0, TMP);
343
- MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
344
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
345
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
346
- MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
347
-
348
- // Rounds 48-51
349
- MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x34B0BCB52748774CULL , 0x1E376C0819A4C116ULL ));
350
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
351
- TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
352
- MSG1 = _mm_add_epi32 (MSG1, TMP);
353
- MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
354
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
355
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
356
- MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
357
-
358
- // Rounds 52-55
359
- MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x682E6FF35B9CCA4FULL , 0x4ED8AA4A391C0CB3ULL ));
360
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
361
- TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
362
- MSG2 = _mm_add_epi32 (MSG2, TMP);
363
- MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
364
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
365
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
366
-
367
- // Rounds 56-59
368
- MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0x8CC7020884C87814ULL , 0x78A5636F748F82EEULL ));
369
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
370
- TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
371
- MSG3 = _mm_add_epi32 (MSG3, TMP);
372
- MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
373
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
374
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
375
-
376
- // Rounds 60-63
377
- MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0xC67178F2BEF9A3F7ULL , 0xA4506CEB90BEFFFAULL ));
378
- STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
379
- MSG = _mm_shuffle_epi32 (MSG, 0x0E );
380
- STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
381
-
382
- // Combine states
383
- STATE0 = _mm_add_epi32 (STATE0, ABEF_SAVE);
384
- STATE1 = _mm_add_epi32 (STATE1, CDGH_SAVE);
385
-
386
- // preparedData += 64;
387
- // size -= 64;
388
- }
218
+ // Save current state
219
+ ABEF_SAVE = STATE0;
220
+ CDGH_SAVE = STATE1;
221
+
222
+ // Load data
223
+ MSG = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + 0 ));
224
+ MSG1 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + 16 ));
225
+ MSG2 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + 32 ));
226
+ MSG3 = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + 48 ));
227
+
228
+ // Rounds 0-3
229
+ // MSG = _mm_loadu_si128((const __m128i*) (data+0));
230
+ MSG0 = _mm_shuffle_epi8 (MSG, MASK);
231
+ MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0xE9B5DBA5B5C0FBCFULL , 0x71374491428A2F98ULL ));
232
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
233
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
234
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
235
+
236
+ // Rounds 4-7
237
+ // MSG1 = _mm_loadu_si128((const __m128i*) (data+16));
238
+ MSG1 = _mm_shuffle_epi8 (MSG1, MASK);
239
+ MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0xAB1C5ED5923F82A4ULL , 0x59F111F13956C25BULL ));
240
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
241
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
242
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
243
+ MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
244
+
245
+ // Rounds 8-11
246
+ // MSG2 = _mm_loadu_si128((const __m128i*) (data+32));
247
+ MSG2 = _mm_shuffle_epi8 (MSG2, MASK);
248
+ MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0x550C7DC3243185BEULL , 0x12835B01D807AA98ULL ));
249
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
250
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
251
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
252
+ MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
253
+
254
+ // Rounds 12-15
255
+ // MSG3 = _mm_loadu_si128((const __m128i*) (data+48));
256
+ MSG3 = _mm_shuffle_epi8 (MSG3, MASK);
257
+ MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0xC19BF1749BDC06A7ULL , 0x80DEB1FE72BE5D74ULL ));
258
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
259
+ TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
260
+ MSG0 = _mm_add_epi32 (MSG0, TMP);
261
+ MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
262
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
263
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
264
+ MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
265
+
266
+ // Rounds 16-19
267
+ MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x240CA1CC0FC19DC6ULL , 0xEFBE4786E49B69C1ULL ));
268
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
269
+ TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
270
+ MSG1 = _mm_add_epi32 (MSG1, TMP);
271
+ MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
272
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
273
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
274
+ MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
275
+
276
+ // Rounds 20-23
277
+ MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x76F988DA5CB0A9DCULL , 0x4A7484AA2DE92C6FULL ));
278
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
279
+ TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
280
+ MSG2 = _mm_add_epi32 (MSG2, TMP);
281
+ MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
282
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
283
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
284
+ MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
285
+
286
+ // Rounds 24-27
287
+ MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0xBF597FC7B00327C8ULL , 0xA831C66D983E5152ULL ));
288
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
289
+ TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
290
+ MSG3 = _mm_add_epi32 (MSG3, TMP);
291
+ MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
292
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
293
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
294
+ MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
295
+
296
+ // Rounds 28-31
297
+ MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0x1429296706CA6351ULL , 0xD5A79147C6E00BF3ULL ));
298
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
299
+ TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
300
+ MSG0 = _mm_add_epi32 (MSG0, TMP);
301
+ MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
302
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
303
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
304
+ MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
305
+
306
+ // Rounds 32-35
307
+ MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x53380D134D2C6DFCULL , 0x2E1B213827B70A85ULL ));
308
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
309
+ TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
310
+ MSG1 = _mm_add_epi32 (MSG1, TMP);
311
+ MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
312
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
313
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
314
+ MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
315
+
316
+ // Rounds 36-39
317
+ MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x92722C8581C2C92EULL , 0x766A0ABB650A7354ULL ));
318
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
319
+ TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
320
+ MSG2 = _mm_add_epi32 (MSG2, TMP);
321
+ MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
322
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
323
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
324
+ MSG0 = _mm_sha256msg1_epu32 (MSG0, MSG1);
325
+
326
+ // Rounds 40-43
327
+ MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0xC76C51A3C24B8B70ULL , 0xA81A664BA2BFE8A1ULL ));
328
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
329
+ TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
330
+ MSG3 = _mm_add_epi32 (MSG3, TMP);
331
+ MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
332
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
333
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
334
+ MSG1 = _mm_sha256msg1_epu32 (MSG1, MSG2);
335
+
336
+ // Rounds 44-47
337
+ MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0x106AA070F40E3585ULL , 0xD6990624D192E819ULL ));
338
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
339
+ TMP = _mm_alignr_epi8 (MSG3, MSG2, 4 );
340
+ MSG0 = _mm_add_epi32 (MSG0, TMP);
341
+ MSG0 = _mm_sha256msg2_epu32 (MSG0, MSG3);
342
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
343
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
344
+ MSG2 = _mm_sha256msg1_epu32 (MSG2, MSG3);
345
+
346
+ // Rounds 48-51
347
+ MSG = _mm_add_epi32 (MSG0, _mm_set_epi64x (0x34B0BCB52748774CULL , 0x1E376C0819A4C116ULL ));
348
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
349
+ TMP = _mm_alignr_epi8 (MSG0, MSG3, 4 );
350
+ MSG1 = _mm_add_epi32 (MSG1, TMP);
351
+ MSG1 = _mm_sha256msg2_epu32 (MSG1, MSG0);
352
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
353
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
354
+ MSG3 = _mm_sha256msg1_epu32 (MSG3, MSG0);
355
+
356
+ // Rounds 52-55
357
+ MSG = _mm_add_epi32 (MSG1, _mm_set_epi64x (0x682E6FF35B9CCA4FULL , 0x4ED8AA4A391C0CB3ULL ));
358
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
359
+ TMP = _mm_alignr_epi8 (MSG1, MSG0, 4 );
360
+ MSG2 = _mm_add_epi32 (MSG2, TMP);
361
+ MSG2 = _mm_sha256msg2_epu32 (MSG2, MSG1);
362
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
363
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
364
+
365
+ // Rounds 56-59
366
+ MSG = _mm_add_epi32 (MSG2, _mm_set_epi64x (0x8CC7020884C87814ULL , 0x78A5636F748F82EEULL ));
367
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
368
+ TMP = _mm_alignr_epi8 (MSG2, MSG1, 4 );
369
+ MSG3 = _mm_add_epi32 (MSG3, TMP);
370
+ MSG3 = _mm_sha256msg2_epu32 (MSG3, MSG2);
371
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
372
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
373
+
374
+ // Rounds 60-63
375
+ MSG = _mm_add_epi32 (MSG3, _mm_set_epi64x (0xC67178F2BEF9A3F7ULL , 0xA4506CEB90BEFFFAULL ));
376
+ STATE1 = _mm_sha256rnds2_epu32 (STATE1, STATE0, MSG);
377
+ MSG = _mm_shuffle_epi32 (MSG, 0x0E );
378
+ STATE0 = _mm_sha256rnds2_epu32 (STATE0, STATE1, MSG);
379
+
380
+ // Combine states
381
+ STATE0 = _mm_add_epi32 (STATE0, ABEF_SAVE);
382
+ STATE1 = _mm_add_epi32 (STATE1, CDGH_SAVE);
389
383
390
384
TMP = _mm_shuffle_epi32 (STATE0, 0x1B ); // FEBA
391
385
STATE1 = _mm_shuffle_epi32 (STATE1, 0xB1 ); // DCHG
0 commit comments