SymCryptSha256AppendBlocks_shani
UINT64 __fastcall SymCryptSha256AppendBlocks_shani(__m128i *a1, const __m128i *a2, UINT64 a3, UINT64 *a4){
UINT64 result;
__m128i v6;
__m128i v7;
__m128i v9;
UINT64 v10;
__m128i v13;
__m128i v14;
__m128i v17;
__m128i v88;
__m128i v89;
void *retaddr;
result = (UINT64)&retaddr;
v6 = _mm_loadu_si128(a1);
v7 = _mm_loadu_si128(a1 + 1);
_XMM11 = _mm_shuffle_epi32(_mm_unpacklo_epi64(v6, v7), 27);
v9 = _mm_shuffle_epi32(_mm_unpackhi_epi64(v6, v7), 27);
if( a3 >= 0x40 )
{
v10 = a3 >> 6;
result = -64i64 * (a3 >> 6);
a3 += result;
do
{
_XMM1 = _mm_shuffle_epi8(_mm_loadu_si128(a2), (__m128i)_xmm);
_XMM3 = _mm_shuffle_epi8(_mm_loadu_si128(a2 + 1), (__m128i)_xmm);
v13 = _mm_loadu_si128(a2 + 2);
v14 = _mm_loadu_si128(a2 + 3);
a2 += 4;
_XMM4 = _mm_shuffle_epi8(v13, (__m128i)_xmm);
_XMM5 = _mm_shuffle_epi8(v14, (__m128i)_xmm);
v17 = _XMM11;
__asm { sha256msg1 xmm1, xmm3 }
_XMM9 = v9;
__asm { sha256rnds2 xmm9, xmm11, xmm0 }
_XMM7 = _mm_add_epi32(_mm_alignr_epi8(_XMM5, _XMM4, 4), _XMM1);
__asm
{
sha256rnds2 xmm11, xmm9, xmm0
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm3, xmm4
sha256msg2 xmm7, xmm5
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
}
_XMM2 = _mm_add_epi32(_mm_alignr_epi8(_XMM7, _XMM5, 4), _XMM3);
__asm
{
sha256msg2 xmm2, xmm7
sha256rnds2 xmm9, xmm11, xmm0
}
_XMM1 = _XMM2;
__asm
{
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm4, xmm5
}
_XMM3 = _mm_add_epi32(_mm_alignr_epi8(_XMM2, _XMM7, 4), _XMM4);
__asm
{
sha256msg2 xmm3, xmm2
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm5, xmm7
}
_XMM8 = _mm_add_epi32(_mm_alignr_epi8(_XMM3, _XMM2, 4), _XMM5);
__asm
{
sha256msg2 xmm8, xmm3
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm7, xmm2
}
_XMM6 = _mm_add_epi32(_mm_alignr_epi8(_XMM8, _XMM3, 4), _XMM7);
__asm
{
sha256msg2 xmm6, xmm8
sha256msg1 xmm1, xmm3
sha256msg1 xmm3, xmm8
}
_XMM5 = _mm_add_epi32(_mm_alignr_epi8(_XMM6, _XMM8, 4), _XMM1);
__asm
{
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg2 xmm5, xmm6
}
_XMM4 = _mm_add_epi32(_mm_alignr_epi8(_XMM5, _XMM6, 4), _XMM3);
__asm
{
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg2 xmm4, xmm5
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm8, xmm6
}
_XMM7 = _mm_add_epi32(_mm_alignr_epi8(_XMM4, _XMM5, 4), _XMM8);
__asm
{
sha256msg2 xmm7, xmm4
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm6, xmm5
}
_XMM3 = _mm_add_epi32(_mm_alignr_epi8(_XMM7, _XMM4, 4), _XMM6);
__asm
{
sha256msg2 xmm3, xmm7
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm5, xmm4
}
_XMM2 = _mm_add_epi32(_mm_alignr_epi8(_XMM3, _XMM7, 4), _XMM5);
__asm
{
sha256msg1 xmm4, xmm7
sha256msg2 xmm2, xmm3
}
_XMM1 = _mm_add_epi32(_mm_alignr_epi8(_XMM2, _XMM3, 4), _XMM4);
__asm
{
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg2 xmm1, xmm2
sha256rnds2 xmm9, xmm11, xmm0
sha256rnds2 xmm11, xmm9, xmm0
sha256msg1 xmm7, xmm3
}
_XMM7 = _mm_add_epi32(_XMM7, _mm_alignr_epi8(_XMM1, _XMM2, 4));
__asm
{
sha256msg2 xmm7, xmm1
sha256rnds2 xmm9, xmm11, xmm0
}
v9 = _mm_add_epi32(v9, _XMM9);
__asm { sha256rnds2 xmm11, xmm9, xmm0 }
_XMM11 = _mm_add_epi32(_XMM11, v17);
--v10;
}
while( v10 );
}
v88 = _mm_shuffle_epi32(_XMM11, 27);
v89 = _mm_shuffle_epi32(v9, 27);
*a1 = _mm_unpacklo_epi64(v88, v89);
a1[1] = _mm_unpackhi_epi64(v88, v89);
*a4 = a3;
return result;
}Referenced by:
SymCryptSha256AppendBlocks