4 repcodes when litLen==0
This commit is contained in:
parent
3e743052cd
commit
c56e32e782
@ -1574,18 +1574,18 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx,
|
|||||||
while (ip < ilimit) {
|
while (ip < ilimit) {
|
||||||
size_t matchLength=0;
|
size_t matchLength=0;
|
||||||
size_t offset=0;
|
size_t offset=0;
|
||||||
const BYTE* start=ip+1;
|
const BYTE* start=ip;
|
||||||
|
|
||||||
/* check repCode */
|
/* check repCode */
|
||||||
for (int i=0; i<ZSTD_REP_NUM; i++)
|
for (int i=0; i<ZSTD_REP_NUM; i++)
|
||||||
if (MEM_read32(ip+1) == MEM_read32(ip+1 - rep[i])) {
|
if (MEM_read32(ip) == MEM_read32(ip - rep[i])) {
|
||||||
/* repcode : we take it */
|
/* repcode : we take it */
|
||||||
if (matchLength==0) {
|
if (matchLength==0) {
|
||||||
matchLength = ZSTD_count(ip+1+MINMATCH, ip+1+MINMATCH-rep[i], iend) + MINMATCH;
|
matchLength = ZSTD_count(ip+MINMATCH, ip+MINMATCH-rep[i], iend) + MINMATCH;
|
||||||
offset = i;
|
offset = i;
|
||||||
if (depth==0) goto _storeSequence;
|
if (depth==0) goto _storeSequence;
|
||||||
} else {
|
} else {
|
||||||
size_t mlRep = ZSTD_count(ip+1+MINMATCH, ip+1+MINMATCH-rep[i], iend) + MINMATCH;
|
size_t mlRep = ZSTD_count(ip+MINMATCH, ip+MINMATCH-rep[i], iend) + MINMATCH;
|
||||||
int gain2 = (int)(mlRep * 3 /*- ZSTD_highbit((U32)i+1)*/);
|
int gain2 = (int)(mlRep * 3 /*- ZSTD_highbit((U32)i+1)*/);
|
||||||
int gain1 = (int)(matchLength*3 - /*ZSTD_highbit((U32)offset+1)*/ + 1);
|
int gain1 = (int)(matchLength*3 - /*ZSTD_highbit((U32)offset+1)*/ + 1);
|
||||||
if (gain2 > gain1)
|
if (gain2 > gain1)
|
||||||
@ -1686,6 +1686,8 @@ _storeSequence:
|
|||||||
rep[1] = rep[0];
|
rep[1] = rep[0];
|
||||||
rep[0] = temp;
|
rep[0] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (offset<=1 && start==anchor) offset = 1-offset;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (offset >= ZSTD_REP_NUM) {
|
if (offset >= ZSTD_REP_NUM) {
|
||||||
@ -1696,20 +1698,7 @@ _storeSequence:
|
|||||||
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
|
ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH);
|
||||||
anchor = ip = start + matchLength;
|
anchor = ip = start + matchLength;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* check immediate repcode */
|
|
||||||
while ( (ip <= ilimit)
|
|
||||||
&& (MEM_read32(ip) == MEM_read32(ip - rep[1])) ) {
|
|
||||||
/* store sequence */
|
|
||||||
matchLength = ZSTD_count(ip+MINMATCH, ip+MINMATCH-rep[1], iend);
|
|
||||||
offset = rep[1];
|
|
||||||
rep[1] = rep[0];
|
|
||||||
rep[0] = offset;
|
|
||||||
ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength);
|
|
||||||
ip += matchLength+MINMATCH;
|
|
||||||
anchor = ip;
|
|
||||||
continue; /* faster when present ... (?) */
|
|
||||||
} }
|
|
||||||
|
|
||||||
/* Last Literals */
|
/* Last Literals */
|
||||||
{
|
{
|
||||||
|
@ -653,15 +653,13 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
|
offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
|
||||||
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
||||||
#if ZSTD_REP_NUM == 4
|
#if ZSTD_REP_NUM == 4
|
||||||
if (offsetCode==0) {
|
if (offsetCode==0) offset = 0;
|
||||||
if (!litLength) {
|
|
||||||
offset = seqState->prevOffset[1];
|
if (offset < ZSTD_REP_NUM) {
|
||||||
seqState->prevOffset[1] = seqState->prevOffset[0];
|
if (!litLength && offset <= 1)
|
||||||
seqState->prevOffset[0] = offset;
|
offset = 1-offset;
|
||||||
} else
|
if (offset != 0)
|
||||||
offset = seqState->prevOffset[0];
|
{
|
||||||
} else {
|
|
||||||
if (offset < ZSTD_REP_NUM) { /* offset = 1,2,3 */
|
|
||||||
size_t temp = seqState->prevOffset[offset];
|
size_t temp = seqState->prevOffset[offset];
|
||||||
if (offset != 1) {
|
if (offset != 1) {
|
||||||
if (offset == 3) seqState->prevOffset[3] = seqState->prevOffset[2];
|
if (offset == 3) seqState->prevOffset[3] = seqState->prevOffset[2];
|
||||||
@ -670,6 +668,9 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
offset = temp;
|
offset = temp;
|
||||||
seqState->prevOffset[1] = seqState->prevOffset[0];
|
seqState->prevOffset[1] = seqState->prevOffset[0];
|
||||||
seqState->prevOffset[0] = offset;
|
seqState->prevOffset[0] = offset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
offset = seqState->prevOffset[0];
|
||||||
} else {
|
} else {
|
||||||
offset -= ZSTD_REP_NUM - 1;
|
offset -= ZSTD_REP_NUM - 1;
|
||||||
#if 0
|
#if 0
|
||||||
@ -687,7 +688,6 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
seqState->prevOffset[kSlotNew] = offset;
|
seqState->prevOffset[kSlotNew] = offset;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
if (offsetCode==0) offset = litLength ? seq->offset : seqState->prevOffset[0]; /* repcode, cmove */
|
if (offsetCode==0) offset = litLength ? seq->offset : seqState->prevOffset[0]; /* repcode, cmove */
|
||||||
if (offsetCode | !litLength) seqState->prevOffset[0] = seq->offset; /* cmove */
|
if (offsetCode | !litLength) seqState->prevOffset[0] = seq->offset; /* cmove */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user