From c56e32e782701b618ece4df44645f53b84c9d135 Mon Sep 17 00:00:00 2001 From: inikep Date: Thu, 17 Mar 2016 19:53:38 +0100 Subject: [PATCH] 4 repcodes when litLen==0 --- lib/zstd_compress.c | 27 +++++++---------------- lib/zstd_decompress.c | 50 +++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index d8294575..6f74d1d3 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -1574,18 +1574,18 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx, while (ip < ilimit) { size_t matchLength=0; size_t offset=0; - const BYTE* start=ip+1; + const BYTE* start=ip; /* check repCode */ for (int i=0; i gain1) @@ -1686,6 +1686,8 @@ _storeSequence: rep[1] = rep[0]; rep[0] = temp; } + + if (offset<=1 && start==anchor) offset = 1-offset; } #else if (offset >= ZSTD_REP_NUM) { @@ -1696,20 +1698,7 @@ _storeSequence: ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, matchLength-MINMATCH); 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 */ { diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index a8d0375e..6e0e39b7 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -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); if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream)); #if ZSTD_REP_NUM == 4 - if (offsetCode==0) { - if (!litLength) { - offset = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; - } else - offset = seqState->prevOffset[0]; - } else { - if (offset < ZSTD_REP_NUM) { /* offset = 1,2,3 */ + if (offsetCode==0) offset = 0; + + if (offset < ZSTD_REP_NUM) { + if (!litLength && offset <= 1) + offset = 1-offset; + if (offset != 0) + { size_t temp = seqState->prevOffset[offset]; if (offset != 1) { if (offset == 3) seqState->prevOffset[3] = seqState->prevOffset[2]; @@ -670,23 +668,25 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls) offset = temp; seqState->prevOffset[1] = seqState->prevOffset[0]; seqState->prevOffset[0] = offset; - } else { - offset -= ZSTD_REP_NUM - 1; -#if 0 - seqState->prevOffset[3] = seqState->prevOffset[2]; - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; -#else - if (kSlotNew < 3) - seqState->prevOffset[3] = seqState->prevOffset[2]; - if (kSlotNew < 2) - seqState->prevOffset[2] = seqState->prevOffset[1]; - if (kSlotNew < 1) - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[kSlotNew] = offset; -#endif } + else + offset = seqState->prevOffset[0]; + } else { + offset -= ZSTD_REP_NUM - 1; +#if 0 + seqState->prevOffset[3] = seqState->prevOffset[2]; + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; +#else + if (kSlotNew < 3) + seqState->prevOffset[3] = seqState->prevOffset[2]; + if (kSlotNew < 2) + seqState->prevOffset[2] = seqState->prevOffset[1]; + if (kSlotNew < 1) + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[kSlotNew] = offset; +#endif } #else if (offsetCode==0) offset = litLength ? seq->offset : seqState->prevOffset[0]; /* repcode, cmove */