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