XpressBuildHuffmanDecodingTable

__int64 __fastcall XpressBuildHuffmanDecodingTable(__m128i *a1, __int64 a2){
  __int16 v2; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  __m128i v7; 
  unsigned __int8 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int16 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int16 *v14; 
  __int16 v15; 
  bool v16; 
  __int64 v17; 
  __int16 v18; 
  unsigned __int64 v19; 
  bool v20; 
  __int16 *v21; 
  int v22; 
  unsigned __int16 *v23; 
  __int64 v24; 
  __int64 i; 
  int v26; 
  unsigned __int64 v27; 
  __int64 v29; 
  __int16 *v30; 
  __int64 v31; 
  __int16 *v32; 
  char *v33; 
  __int64 v34; 
  __int16 *v35; 
  __int16 *v36; 
  __int64 v37; 
  __int16 *v38; 
  __int64 v39; 
  __int16 *v40; 
  __int64 v41; 
  __int16 *v42; 
  __int64 v43; 
  __int16 *j; 
  __m128i *v45; 
  __int64 k; 

  v2 = 0;
  v5 = 0i64;
  v6 = 0i64;
  v7 = _mm_shuffle_epi32(_mm_cvtsi32_si128(0x2000200u), 0);
  a1[64] = v7;
  a1[65] = v7;
  do
  {
    v8 = *(_BYTE *)(v5 + a2);
    v9 = v8 & 0xF;
    if( (v8 & 0xF) != 0 )
    {
      a1->m128i_i16[2 * v5] = a1[64].m128i_i16[v9];
      a1[64].m128i_i16[v9] = 2 * v6;
      v8 = *(_BYTE *)(v5 + a2);
    }
    v10 = (unsigned __int64)v8 >> 4;
    if( v10 )
    {
      a1->m128i_i16[2 * v5 + 1] = a1[64].m128i_i16[v10];
      a1[64].m128i_i16[v10] = 2 * v6 + 1;
    }
    v5 = v6 + 1;
    v6 = v5;
  }
  while( v5 < 0x100 );
  v11 = -1024;
  v12 = 1024i64;
  v13 = 15i64;
  v14 = &a1[65].m128i_u16[7];
  v15 = -1023;
  while( 1 )
  {
    v16 = v15 == v11;
    if( v15 < v11 )
    {
      v36 = &a1[194].m128i_i16[v12];
      v12 -= (unsigned __int16)(((unsigned __int16)(v11 - v15 - 1) >> 1) + 1);
      do
      {
        *v36-- = v15;
        v15 += 2;
        v16 = v15 == v11;
      }
      while( v15 < v11 );
    }
    if( v16 )
      return 3221226050i64;
    v15 = v11 + 1;
    v17 = *v14;
    if( v17 != 512 )
    {
      v33 = &a1[194].m128i_i8[2 * v12];
      do
      {
        v33 -= 2;
        --v12;
        *((_WORD *)v33 + 1) = v13 + 16 * v17;
        v17 = a1->m128i_u16[v17];
      }
      while( v17 != 512 );
    }
    --v13;
    v18 = -(__int16)v12;
    --v14;
    v11 = -(__int16)v12;
    if( v13 <= 0xA )
    {
      v19 = 1023i64;
      v20 = v15 == v18;
      if( v15 < v18 )
      {
        v21 = &a1[193].m128i_i16[7];
        v19 = 1023i64 - (unsigned __int16)(((unsigned __int16)(v18 - v15 - 1) >> 1) + 1);
        do
        {
          *v21-- = v15;
          v15 += 2;
          v20 = v15 == v11;
        }
        while( v15 < v11 );
      }
      if( !v20 )
      {
        v22 = 0;
        v23 = &a1[65].m128i_u16[2];
        v24 = 10i64;
        do
        {
          for( i = *v23; i != 512; --v19 )
          {
            v2 = v24 + 16 * i;
            if( v22 )
              return 3221226050i64;
            v26 = 10 - v24;
            if( (v19 + 1) << (10 - (unsigned __int8)v24) > 0x400 )
              return 3221226050i64;
            v27 = v19 << v26;
            switch( v26 )
            {
              case 0:
                goto LABEL_22;
              case 1:
                goto LABEL_21;
              case 2:
                goto LABEL_30;
              case 3:
                a1[66].m128i_i16[v27 + 7] = v2;
                a1[66].m128i_i16[v27 + 6] = v2;
                a1[66].m128i_i16[v27 + 5] = v2;
                a1[66].m128i_i16[v27 + 4] = v2;
LABEL_30:
                a1[66].m128i_i16[v27 + 3] = v2;
                a1[66].m128i_i16[v27 + 2] = v2;
LABEL_21:
                a1[66].m128i_i16[v27 + 1] = v2;
LABEL_22:
                a1[66].m128i_i16[v27] = v2;
                break;
              case 4:
                v29 = 4i64;
                v30 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v30 - 1) = v2;
                  *v30 = v2;
                  v30[1] = v2;
                  v30[2] = v2;
                  v30 += 4;
                  --v29;
                }
                while( v29 );
                break;
              case 5:
                v31 = 8i64;
                v32 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v32 - 1) = v2;
                  *v32 = v2;
                  v32[1] = v2;
                  v32[2] = v2;
                  v32 += 4;
                  --v31;
                }
                while( v31 );
                break;
              case 6:
                v34 = 16i64;
                v35 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v35 - 1) = v2;
                  *v35 = v2;
                  v35[1] = v2;
                  v35[2] = v2;
                  v35 += 4;
                  --v34;
                }
                while( v34 );
                break;
              case 7:
                v37 = 32i64;
                v38 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v38 - 1) = v2;
                  *v38 = v2;
                  v38[1] = v2;
                  v38[2] = v2;
                  v38 += 4;
                  --v37;
                }
                while( v37 );
                break;
              case 8:
                v39 = 64i64;
                v40 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v40 - 1) = v2;
                  *v40 = v2;
                  v40[1] = v2;
                  v40[2] = v2;
                  v40 += 4;
                  --v39;
                }
                while( v39 );
                break;
              case 9:
                v41 = 128i64;
                v42 = &a1[66].m128i_i16[v27 + 1];
                do
                {
                  *(v42 - 1) = v2;
                  *v42 = v2;
                  v42[1] = v2;
                  v42[2] = v2;
                  v42 += 4;
                  --v41;
                }
                while( v41 );
                break;
              default:
                __fastfail(0x25u);
            }
            if( !v19 )
              v22 = 1;
            i = a1->m128i_u16[i];
          }
          v19 >>= 1;
          --v23;
          --v24;
        }
        while( v24 );
        if( v22 )
          return 0i64;
        v43 = 2i64;
        for( j = &a1[64].m128i_i16[2]; *j == 512; ++j )
        {
          if( (unsigned __int64)++v43 > 0xF )
          {
            if( a1[64].m128i_i16[1] == 512 )
              return 3221226050i64;
            v45 = a1 + 66;
            for( k = 512i64; k; --k )
            {
              v45->m128i_i16[0] = v2;
              v45 = (__m128i *)((char *)v45 + 2);
            }
            return 0i64;
          }
        }
      }
      return 3221226050i64;
    }
  }
}

Referenced by:

RtlDecompressBufferXpressHuff
RtlDecompressBufferXpressHuffProgress