]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
ZSTD_fast: Don't Search Dict Context When Mismatch Was Found
authorW. Felix Handte <w@felixhandte.com>
Fri, 14 Sep 2018 22:23:35 +0000 (15:23 -0700)
committerW. Felix Handte <w@felixhandte.com>
Fri, 14 Sep 2018 22:23:35 +0000 (15:23 -0700)
lib/compress/zstd_fast.c

index 37a715167c62732fcbf5f4215322bafe89c45ec1..7d7efb46581e0a842d861bb29c2b947c82973255 100644 (file)
@@ -124,8 +124,7 @@ size_t ZSTD_compressBlock_fast_generic(
             mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
             ip++;
             ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
-        } else if ( (matchIndex <= prefixStartIndex)
-                 || (MEM_read32(match) != MEM_read32(ip)) ) {
+        } else if ( (matchIndex <= prefixStartIndex) ) {
             if (dictMode == ZSTD_dictMatchState) {
                 U32 const dictMatchIndex = dictHashTable[h];
                 const BYTE* dictMatch = dictBase + dictMatchIndex;
@@ -151,6 +150,11 @@ size_t ZSTD_compressBlock_fast_generic(
                 ip += ((ip-anchor) >> kSearchStrength) + stepSize;
                 continue;
             }
+        } else if (MEM_read32(match) != MEM_read32(ip)) {
+            /* it's not a match, and we're not going to check the dictionary */
+            assert(stepSize >= 1);
+            ip += ((ip-anchor) >> kSearchStrength) + stepSize;
+            continue;
         } else {
             /* found a regular match */
             U32 const offset = (U32)(ip-match);