XpressDoHuffmanPass
UINT8 *__stdcall XpressDoHuffmanPass(
_HUFFMAN_WORKSPACE *Workspace,
UINT8 *LzInputPos,
UINT8 *LzEnd,
UINT8 *HuffOutputPos,
UINT64 WriteEof){
_HUFFMAN_WORKSPACE *v7;
__int64 v8;
UINT8 *v11;
__int128 v12;
UINT8 *v13;
UINT8 *v14;
unsigned __int64 v15;
unsigned __int16 v16;
UINT8 *v17;
int v18;
int v19;
int v20;
bool v21;
__int64 v22;
unsigned __int16 v23;
_HUFFMAN_WORKSPACE *v24;
unsigned __int64 v25;
__int64 v26;
UINT8 *v27;
_HUFFMAN_WORKSPACE *v28;
unsigned __int64 v29;
unsigned __int16 v30;
unsigned __int64 v31;
__int16 v32;
unsigned __int16 v33;
unsigned __int8 v34;
UINT8 v35;
unsigned __int16 v36;
UINT8 v37;
unsigned __int64 v38;
unsigned __int16 v39;
__int16 v40;
v7 = Workspace + 7816;
v8 = 2i64;
v11 = HuffOutputPos;
do
{
v11 += 128;
v12 = *(_OWORD *)v7;
v7 += 32;
*((_OWORD *)v11 - 8) = v12;
*((_OWORD *)v11 - 7) = *((_OWORD *)v7 - 7);
*((_OWORD *)v11 - 6) = *((_OWORD *)v7 - 6);
*((_OWORD *)v11 - 5) = *((_OWORD *)v7 - 5);
*((_OWORD *)v11 - 4) = *((_OWORD *)v7 - 4);
*((_OWORD *)v11 - 3) = *((_OWORD *)v7 - 3);
*((_OWORD *)v11 - 2) = *((_OWORD *)v7 - 2);
*((_OWORD *)v11 - 1) = *((_OWORD *)v7 - 1);
--v8;
}
while( v8 );
v13 = HuffOutputPos + 256;
v14 = HuffOutputPos + 258;
v15 = 16i64;
v16 = 0;
v17 = HuffOutputPos + 260;
LABEL_4:
v18 = *(_DWORD *)LzInputPos;
LzInputPos += 4;
v19 = 2 * v18 + 1;
if( v18 >= 0 )
{
LABEL_8:
v22 = *LzInputPos++;
v23 = HIWORD(Workspace[v22]);
v24 = &Workspace[v22];
v25 = *(unsigned __int16 *)v24;
if( v15 < v25 )
{
*(_WORD *)v13 = (v16 << v15) | (v23 >> (v25 - v15));
v13 = v14;
v16 = *((_WORD *)v24 + 1);
v14 = v17;
v17 += 2;
v15 += 16i64 - (unsigned int)v25;
}
else
{
v15 -= v25;
v16 = v23 | (v16 << v25);
}
goto LABEL_7;
}
while( LzInputPos < LzEnd )
{
_mm_lfence();
v26 = *LzInputPos;
v27 = LzInputPos + 1;
v28 = &Workspace[v26];
v29 = *((unsigned __int16 *)v28 + 512);
v30 = *((_WORD *)v28 + 513);
if( v15 < v29 )
{
*(_WORD *)v13 = (v16 << v15) | (v30 >> (v29 - v15));
v13 = v14;
v32 = *((_WORD *)v28 + 513);
v14 = v17;
v17 += 2;
v31 = 16 - v29 + v15;
}
else
{
v31 = v15 - v29;
v32 = v30 | (v16 << v29);
}
if( (v26 & 0xF) == 15 )
{
v35 = *v27++;
*v17++ = v35;
if( v35 == 0xFF )
{
v36 = *(_WORD *)v27;
*v17 = *(_WORD *)v27;
v37 = v27[1];
v27 += 2;
v17[1] = v37;
v17 += 2;
if( !v36 )
{
*v17 = *v27;
v17[1] = v27[1];
v17[2] = v27[2];
v17[3] = v27[3];
v17 += 4;
v27 += 4;
}
}
}
v33 = *(_WORD *)v27;
v34 = (unsigned __int8)v26 >> 4;
if( v31 < v34 )
{
*(_WORD *)v13 = (v32 << v31) | (v33 >> (v34 - v31));
v13 = v14;
v16 = *(_WORD *)v27;
v14 = v17;
v17 += 2;
v15 = 16i64 - v34 + v31;
}
else
{
v15 = v31 - v34;
v16 = v33 | (v32 << v34);
}
LzInputPos = v27 + 2;
LABEL_7:
v20 = 2 * v19;
v21 = v19 < 0;
v19 *= 2;
if( !v21 )
goto LABEL_8;
if( !v20 )
goto LABEL_4;
}
if( (_DWORD)WriteEof )
{
v38 = *((unsigned __int16 *)Workspace + 512);
v39 = *((_WORD *)Workspace + 513);
v40 = *((_WORD *)Workspace + 512);
if( v15 >= v38 )
{
LOBYTE(v15) = v15 - v40;
v16 = v39 | (v16 << v38);
}
else
{
*(_WORD *)v13 = (v16 << v15) | (v39 >> (v38 - v15));
v13 = v14;
v16 = *((_WORD *)Workspace + 513);
v14 = v17;
v17 += 2;
LOBYTE(v15) = 16 - v40 + v15;
}
}
*(_WORD *)v13 = v16 << v15;
*(_WORD *)v14 = 0;
return v17;
}Referenced by:
RtlCompressBufferXpressHuffMax
RtlCompressBufferXpressHuffStandard