4 repcodes when litLen==0

This commit is contained in:
inikep 2016-03-17 19:53:38 +01:00
parent 3e743052cd
commit c56e32e782
2 changed files with 33 additions and 44 deletions

View File

@ -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 */
{ {

View File

@ -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 */