]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
4 repcodes when litLen==0
authorinikep <inikep@gmail.com>
Thu, 17 Mar 2016 18:53:38 +0000 (19:53 +0100)
committerinikep <inikep@gmail.com>
Thu, 17 Mar 2016 18:53:38 +0000 (19:53 +0100)
lib/zstd_compress.c
lib/zstd_decompress.c

index d8294575024d3d9cc629f21253b1e7d2fef2b85e..6f74d1d3cf88539ca8b142995401624db9dd7a2a 100644 (file)
@@ -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<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 */
             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;
                 if (depth==0) goto _storeSequence;
-            } else {                   
-                size_t mlRep = ZSTD_count(ip+1+MINMATCH, ip+1+MINMATCH-rep[i], iend) + MINMATCH;
+            } else {
+                size_t mlRep = ZSTD_count(ip+MINMATCH, ip+MINMATCH-rep[i], iend) + MINMATCH;
                 int gain2 = (int)(mlRep * 3 /*- ZSTD_highbit((U32)i+1)*/);
                 int gain1 = (int)(matchLength*3 - /*ZSTD_highbit((U32)offset+1)*/ + 1);
                 if (gain2 > 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 */
     {
index a8d0375e149a7b1543839a55db1f7f9b6db4aabe..6e0e39b78f3881ddea375120a689a46f97281b2c 100644 (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);
         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;
+            }
+            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];
-                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;
+            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 */