]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Hoist Hash Table Writes Up into Each Match Found Block
authorW. Felix Handte <w@felixhandte.com>
Wed, 11 May 2022 15:27:34 +0000 (11:27 -0400)
committerW. Felix Handte <w@felixhandte.com>
Wed, 11 May 2022 15:27:34 +0000 (11:27 -0400)
Refactoring this way avoids the bad write in the case that `step > 4`, and
is a bit more straightforward. It also seems to perform better!

lib/compress/zstd_fast.c

index f2028ef358974ab0c92b3ecdeba9885b5479ac04..11c80af87fef6befe396b72c413ec89180ab6c68 100644 (file)
@@ -182,6 +182,10 @@ _start: /* Requires: ip0 */
             match0 -= mLength;
             offcode = REPCODE1_TO_OFFBASE;
             mLength += 4;
+
+            /* first write next hash table entry; we've already calculated it */
+            hashTable[hash1] = (U32)(ip1 - base);
+
             goto _match;
         }
 
@@ -195,6 +199,10 @@ _start: /* Requires: ip0 */
         /* check match at ip[0] */
         if (MEM_read32(ip0) == mval) {
             /* found a match! */
+
+            /* first write next hash table entry; we've already calculated it */
+            hashTable[hash1] = (U32)(ip1 - base);
+
             goto _offset;
         }
 
@@ -224,7 +232,9 @@ _start: /* Requires: ip0 */
         /* check match at ip[0] */
         if (MEM_read32(ip0) == mval) {
             /* found a match! */
-            if (step > 4) {
+
+            /* first write next hash table entry; we've already calculated it */
+            if (step <= 4) {
                 /* We need to avoid writing an index into the hash table >= the
                  * position at which we will pick up our searching after we've
                  * taken this match.
@@ -239,8 +249,9 @@ _start: /* Requires: ip0 */
                  * this is the only match path where this can occur. (In rep-
                  * code and the first match checks, ip1 == ip0 + 1.)
                  */
-                ip1 = base;
+                hashTable[hash1] = (U32)(ip1 - base);
             }
+
             goto _offset;
         }
 
@@ -304,9 +315,6 @@ _match: /* Requires: ip0, match0, offcode */
     ip0 += mLength;
     anchor = ip0;
 
-    /* write next hash table entry */
-    hashTable[hash1] = (U32)(ip1 - base);
-
     /* Fill table and check for immediate repcode. */
     if (ip0 <= ilimit) {
         /* Fill Table */