Skip to content

Commit 944be09

Browse files
Fix Intel SIMD code.
1 parent d488d7c commit 944be09

File tree

1 file changed

+165
-171
lines changed

1 file changed

+165
-171
lines changed

src/SHA256_Hardware.cpp

+165-171
Original file line numberDiff line numberDiff line change
@@ -215,177 +215,171 @@ void Hasher<SHA256, HARDWARE>::TransformX86(const uint8_t* const data)
215215
STATE0 = _mm_alignr_epi8(TMP, STATE1, 8); // ABEF
216216
STATE1 = _mm_blend_epi16(STATE1, TMP, 0xF0); // CDGH
217217

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);
389383

390384
TMP = _mm_shuffle_epi32(STATE0, 0x1B); // FEBA
391385
STATE1 = _mm_shuffle_epi32(STATE1, 0xB1); // DCHG

0 commit comments

Comments
 (0)