SymCryptParallelSha256AppendBlocks_xmm

__m128i *__fastcall SymCryptParallelSha256AppendBlocks_xmm(__m128i **a1, INT64 a2, UINT64 a3, __m128i *a4){
  __m128i v4; 
  __m128i v5; 
  __m128i v6; 
  __m128i v7; 
  __m128i v8; 
  __m128i v9; 
  __m128i v10; 
  __m128i v11; 
  __m128i v12; 
  __m128i v13; 
  __m128i v14; 
  __m128i v15; 
  __m128i v16; 
  __m128i v17; 
  __m128i v18; 
  __m128i v19; 
  __m128i v20; 
  UINT64 v21; 
  __m128i *v22; 
  __int64 v23; 
  __m128i v24; 
  __m128i v25; 
  __m128i v26; 
  __m128i v27; 
  __m128i v28; 
  __m128i v29; 
  __m128i v30; 
  __m128i v31; 
  __m128i v32; 
  __m128i v33; 
  __m128i v34; 
  __m128i v35; 
  __m128i *v36; 
  __m128i v37; 
  __int64 v38; 
  __m128i v39; 
  __m128i v40; 
  __m128i v41; 
  __m128i v42; 
  __m128i v43; 
  unsigned int *v44; 
  __m128i v45; 
  __m128i *v46; 
  __m128i v47; 
  __m128i v48; 
  __m128i v49; 
  __m128i v50; 
  __m128i v51; 
  __m128i v52; 
  __m128i v53; 
  __m128i v54; 
  __m128i v55; 
  __m128i v56; 
  __m128i v57; 
  __m128i v58; 
  __m128i v59; 
  __m128i v60; 
  __m128i v61; 
  __m128i v62; 
  __m128i v63; 
  __m128i v64; 
  __m128i v65; 
  __m128i v66; 
  __m128i v67; 
  __m128i v68; 
  __m128i v69; 
  __m128i v70; 
  __m128i v71; 
  __m128i v72; 
  __m128i v73; 
  __m128i v74; 
  __m128i v75; 
  __m128i v76; 
  __m128i v77; 
  __m128i v78; 
  __m128i v79; 
  __m128i v80; 
  __m128i v81; 
  __m128i v82; 
  __m128i *result; 

  v4 = _mm_loadu_si128(*a1);
  v5 = _mm_loadu_si128(a1[1]);
  v6 = _mm_unpacklo_epi32(v4, v5);
  v7 = _mm_unpackhi_epi32(v4, v5);
  v8 = _mm_loadu_si128(a1[2]);
  v9 = _mm_loadu_si128(a1[3]);
  v10 = _mm_unpacklo_epi32(v8, v9);
  a4[11] = _mm_unpacklo_epi64(v6, v10);
  v11 = _mm_unpackhi_epi32(v8, v9);
  a4[9] = _mm_unpacklo_epi64(v7, v11);
  a4[10] = _mm_unpackhi_epi64(v6, v10);
  v12 = _mm_unpackhi_epi64(v7, v11);
  a4[8] = v12;
  v13 = _mm_loadu_si128(*a1 + 1);
  v14 = _mm_loadu_si128(a1[1] + 1);
  v15 = _mm_unpacklo_epi32(v13, v14);
  v16 = _mm_unpackhi_epi32(v13, v14);
  v17 = _mm_loadu_si128(a1[2] + 1);
  v18 = _mm_loadu_si128(a1[3] + 1);
  v19 = _mm_unpacklo_epi32(v17, v18);
  a4[7] = _mm_unpacklo_epi64(v15, v19);
  v20 = _mm_unpackhi_epi32(v17, v18);
  a4[5] = _mm_unpacklo_epi64(v16, v20);
  a4[6] = _mm_unpackhi_epi64(v15, v19);
  a4[4] = _mm_unpackhi_epi64(v16, v20);
  *a4 = v12;
  a4[1] = _mm_loadu_si128(a4 + 9);
  a4[2] = _mm_loadu_si128(a4 + 10);
  a4[3] = _mm_loadu_si128(a4 + 11);
  if( a3 >= 0x40 )
  {
    v21 = a3 >> 6;
    do
    {
      v22 = a4 + 14;
      v23 = 4i64;
      do
      {
        v24 = _mm_loadu_si128((const __m128i *)*(_QWORD *)a2);
        *(_QWORD *)a2 += 16i64;
        v25 = _mm_shuffle_epi8(v24, (__m128i)_xmm);
        v26 = _mm_loadu_si128((const __m128i *)*(_QWORD *)(a2 + 8));
        *(_QWORD *)(a2 + 8) += 16i64;
        v27 = _mm_shuffle_epi8(v26, (__m128i)_xmm);
        v28 = _mm_unpacklo_epi32(v25, v27);
        v29 = _mm_shuffle_epi8(_mm_loadu_si128((const __m128i *)*(_QWORD *)(a2 + 16)), (__m128i)_xmm);
        *(_QWORD *)(a2 + 16) += 16i64;
        v30 = _mm_unpackhi_epi32(v25, v27);
        v31 = _mm_loadu_si128((const __m128i *)*(_QWORD *)(a2 + 24));
        *(_QWORD *)(a2 + 24) += 16i64;
        v32 = _mm_shuffle_epi8(v31, (__m128i)_xmm);
        v33 = _mm_unpacklo_epi32(v29, v32);
        v34 = _mm_unpackhi_epi32(v29, v32);
        v22[-2] = _mm_unpacklo_epi64(v28, v33);
        *v22 = _mm_unpacklo_epi64(v30, v34);
        v22[-1] = _mm_unpackhi_epi64(v28, v33);
        v22[1] = _mm_unpackhi_epi64(v30, v34);
        v22 += 4;
        --v23;
      }
      while( v23 );
      v35 = _mm_loadu_si128(a4 + 27);
      v36 = a4 + 21;
      v37 = _mm_loadu_si128(a4 + 26);
      v38 = 24i64;
      v39 = _mm_loadu_si128(a4 + 12);
      do
      {
        v40 = _mm_loadu_si128(v36 - 8);
        v41 = _mm_add_epi32(
                _mm_xor_si128(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(_mm_srli_epi32(v37, 0x11u), _mm_slli_epi32(v37, 0xFu)),
                      _mm_slli_epi32(v37, 0xDu)),
                    _mm_srli_epi32(v37, 0x13u)),
                  _mm_srli_epi32(v37, 0xAu)),
                v39);
        v39 = _mm_loadu_si128(v36 - 7);
        v42 = _mm_add_epi32(v41, *v36);
        v36 += 2;
        v37 = _mm_add_epi32(
                v42,
                _mm_xor_si128(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(_mm_slli_epi32(v40, 0x19u), _mm_srli_epi32(v40, 7u)),
                      _mm_slli_epi32(v40, 0xEu)),
                    _mm_srli_epi32(v40, 0x12u)),
                  _mm_srli_epi32(v40, 3u)));
        v36[5] = v37;
        v35 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_add_epi32(
                    _mm_xor_si128(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(_mm_srli_epi32(v35, 0x11u), _mm_slli_epi32(v35, 0xFu)),
                          _mm_slli_epi32(v35, 0xDu)),
                        _mm_srli_epi32(v35, 0x13u)),
                      _mm_srli_epi32(v35, 0xAu)),
                    v40),
                  v36[-1]),
                _mm_xor_si128(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(_mm_slli_epi32(v39, 0x19u), _mm_srli_epi32(v39, 7u)),
                      _mm_slli_epi32(v39, 0xEu)),
                    _mm_srli_epi32(v39, 0x12u)),
                  _mm_srli_epi32(v39, 3u)));
        v36[6] = v35;
        --v38;
      }
      while( v38 );
      v43 = _mm_loadu_si128(a4 + 11);
      v44 = (unsigned int *)&SymCryptSha256K + 2;
      v45 = _mm_loadu_si128(a4 + 10);
      v46 = a4 + 4;
      v47 = _mm_loadu_si128(a4 + 9);
      v48 = _mm_loadu_si128(a4 + 8);
      v49 = _mm_loadu_si128(a4 + 4);
      do
      {
        v50 = _mm_loadu_si128(v46 + 3);
        v51 = _mm_loadu_si128(v46 + 2);
        v52 = _mm_loadu_si128(v46 + 1);
        v53 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_add_epi32(
                    _mm_add_epi32(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(
                            _mm_xor_si128(
                              _mm_xor_si128(_mm_slli_epi32(v50, 0x1Au), _mm_srli_epi32(v50, 6u)),
                              _mm_slli_epi32(v50, 0x15u)),
                            _mm_srli_epi32(v50, 0xBu)),
                          _mm_slli_epi32(v50, 7u)),
                        _mm_srli_epi32(v50, 0x19u)),
                      v46[8]),
                    v49),
                  _mm_xor_si128(_mm_and_si128(_mm_xor_si128(v51, v52), v50), v52)),
                _mm_shuffle_epi32(_mm_cvtsi32_si128(*(v44 - 2)), 0));
        v49 = _mm_add_epi32(v53, v48);
        v46[4] = v49;
        v48 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(_mm_slli_epi32(v43, 0x1Eu), _mm_srli_epi32(v43, 2u)),
                          _mm_slli_epi32(v43, 0x13u)),
                        _mm_srli_epi32(v43, 0xDu)),
                      _mm_slli_epi32(v43, 0xAu)),
                    _mm_srli_epi32(v43, 0x16u)),
                  v53),
                _mm_or_si128(_mm_and_si128(_mm_or_si128(v45, v43), v47), _mm_and_si128(v45, v43)));
        v54 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_add_epi32(
                    _mm_add_epi32(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(
                            _mm_xor_si128(
                              _mm_xor_si128(_mm_slli_epi32(v49, 0x1Au), _mm_srli_epi32(v49, 6u)),
                              _mm_slli_epi32(v49, 0x15u)),
                            _mm_srli_epi32(v49, 0xBu)),
                          _mm_slli_epi32(v49, 7u)),
                        _mm_srli_epi32(v49, 0x19u)),
                      v46[9]),
                    v52),
                  _mm_xor_si128(_mm_and_si128(_mm_xor_si128(v51, v50), v49), v51)),
                _mm_shuffle_epi32(_mm_cvtsi32_si128(*(v44 - 1)), 0));
        v55 = _mm_add_epi32(v54, v47);
        v46[5] = v55;
        v47 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(_mm_slli_epi32(v48, 0x1Eu), _mm_srli_epi32(v48, 2u)),
                          _mm_slli_epi32(v48, 0x13u)),
                        _mm_srli_epi32(v48, 0xDu)),
                      _mm_slli_epi32(v48, 0xAu)),
                    _mm_srli_epi32(v48, 0x16u)),
                  v54),
                _mm_or_si128(_mm_and_si128(_mm_or_si128(v48, v43), v45), _mm_and_si128(v48, v43)));
        v56 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_add_epi32(
                    _mm_add_epi32(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(
                            _mm_xor_si128(
                              _mm_xor_si128(_mm_slli_epi32(v55, 0x1Au), _mm_srli_epi32(v55, 6u)),
                              _mm_slli_epi32(v55, 0x15u)),
                            _mm_srli_epi32(v55, 0xBu)),
                          _mm_slli_epi32(v55, 7u)),
                        _mm_srli_epi32(v55, 0x19u)),
                      v46[10]),
                    v51),
                  _mm_xor_si128(_mm_and_si128(_mm_xor_si128(v49, v50), v55), v50)),
                _mm_shuffle_epi32(_mm_cvtsi32_si128(*v44), 0));
        v57 = _mm_add_epi32(v56, v45);
        v46[6] = v57;
        v46 += 4;
        v45 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(_mm_slli_epi32(v47, 0x1Eu), _mm_srli_epi32(v47, 2u)),
                          _mm_slli_epi32(v47, 0x13u)),
                        _mm_srli_epi32(v47, 0xDu)),
                      _mm_slli_epi32(v47, 0xAu)),
                    _mm_srli_epi32(v47, 0x16u)),
                  v56),
                _mm_or_si128(_mm_and_si128(_mm_or_si128(v48, v47), v43), _mm_and_si128(v48, v47)));
        v58 = _mm_shuffle_epi32(_mm_cvtsi32_si128(v44[1]), 0);
        v44 += 4;
        v59 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_add_epi32(
                    _mm_add_epi32(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(
                            _mm_xor_si128(
                              _mm_xor_si128(_mm_slli_epi32(v57, 0x1Au), _mm_srli_epi32(v57, 6u)),
                              _mm_slli_epi32(v57, 0x15u)),
                            _mm_srli_epi32(v57, 0xBu)),
                          _mm_slli_epi32(v57, 7u)),
                        _mm_srli_epi32(v57, 0x19u)),
                      v46[7]),
                    v50),
                  _mm_xor_si128(_mm_and_si128(_mm_xor_si128(v49, v55), v57), v49)),
                v58);
        v46[3] = _mm_add_epi32(v59, v43);
        v43 = _mm_add_epi32(
                _mm_add_epi32(
                  _mm_xor_si128(
                    _mm_xor_si128(
                      _mm_xor_si128(
                        _mm_xor_si128(
                          _mm_xor_si128(_mm_slli_epi32(v45, 0x1Eu), _mm_srli_epi32(v45, 2u)),
                          _mm_slli_epi32(v45, 0x13u)),
                        _mm_srli_epi32(v45, 0xDu)),
                      _mm_slli_epi32(v45, 0xAu)),
                    _mm_srli_epi32(v45, 0x16u)),
                  v59),
                _mm_or_si128(_mm_and_si128(_mm_or_si128(v47, v45), v48), _mm_and_si128(v47, v45)));
      }
      while( (__int64)v44 < (__int64)&_xmm + 8 );
      v60 = _mm_add_epi32(_mm_loadu_si128(a4 + 3), v43);
      a4[11] = v60;
      v61 = _mm_add_epi32(v45, a4[2]);
      a4[3] = v60;
      a4[10] = v61;
      v62 = _mm_loadu_si128(a4 + 1);
      a4[2] = v61;
      v63 = _mm_add_epi32(v62, v47);
      a4[9] = v63;
      v64 = _mm_add_epi32(v48, *a4);
      a4[1] = v63;
      a4[8] = v64;
      *a4 = v64;
      v65 = _mm_loadu_si128(a4 + 6);
      a4[7] = _mm_add_epi32(_mm_loadu_si128(a4 + 71), a4[7]);
      a4[6] = _mm_add_epi32(v65, a4[70]);
      v66 = _mm_loadu_si128(a4 + 4);
      a4[5] = _mm_add_epi32(_mm_loadu_si128(a4 + 69), a4[5]);
      a4[4] = _mm_add_epi32(v66, a4[68]);
      --v21;
    }
    while( v21 );
  }
  v67 = _mm_loadu_si128(a4 + 10);
  v68 = _mm_loadu_si128(a4 + 9);
  v69 = _mm_loadu_si128(a4 + 11);
  v70 = _mm_unpackhi_epi32(v69, v67);
  v71 = _mm_unpacklo_epi32(v69, v67);
  v72 = _mm_loadu_si128(a4 + 8);
  v73 = _mm_unpacklo_epi32(v68, v72);
  v74 = _mm_unpackhi_epi32(v68, v72);
  **a1 = _mm_unpacklo_epi64(v71, v73);
  *a1[1] = _mm_unpackhi_epi64(v71, v73);
  *a1[2] = _mm_unpacklo_epi64(v70, v74);
  *a1[3] = _mm_unpackhi_epi64(v70, v74);
  v75 = _mm_loadu_si128(a4 + 6);
  v76 = _mm_loadu_si128(a4 + 7);
  v77 = _mm_loadu_si128(a4 + 5);
  v78 = _mm_unpacklo_epi32(v76, v75);
  v79 = _mm_unpackhi_epi32(v76, v75);
  v80 = _mm_loadu_si128(a4 + 4);
  v81 = _mm_unpacklo_epi32(v77, v80);
  v82 = _mm_unpackhi_epi32(v77, v80);
  (*a1)[1] = _mm_unpacklo_epi64(v78, v81);
  a1[1][1] = _mm_unpackhi_epi64(v78, v81);
  a1[2][1] = _mm_unpacklo_epi64(v79, v82);
  result = a1[3];
  result[1] = _mm_unpackhi_epi64(v79, v82);
  return result;
}

Referenced by:

SymCryptParallelSha256Append