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