]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Introduce, implement, and call ZSTD_ldm_countBackwardsMatch_2segments()
authorsenhuang42 <senhuang96@fb.com>
Mon, 12 Oct 2020 20:17:39 +0000 (16:17 -0400)
committersenhuang42 <senhuang96@fb.com>
Wed, 14 Oct 2020 16:58:06 +0000 (12:58 -0400)
lib/compress/zstd_ldm.c

index cc338e697c7a552026207af9b5897782adfb72a5..d45adc045a5af546381351f60a5575fb6f12a958 100644 (file)
@@ -154,6 +154,26 @@ static size_t ZSTD_ldm_countBackwardsMatch(
     return matchLength;
 }
 
+/** ZSTD_ldm_countBackwardsMatch_2segments() :
+ *  Returns the number of bytes that match backwards from pMatch,
+ *  even with the backwards match spanning 2 different segments.
+ *
+ *  On reaching `pMatchBase`, start counting from mEnd */
+static size_t ZSTD_ldm_countBackwardsMatch_2segments(
+            const BYTE* pIn, const BYTE* pAnchor,
+            const BYTE* pMatch, const BYTE* pMatchBase, const BYTE* mEnd)
+{
+    const BYTE* const vBegin = MAX(pIn - (pMatch - pMatchBase), pAnchor);
+    size_t const matchLength = ZSTD_ldm_countBackwardsMatch(pIn, vBegin, pMatch, pMatchBase);
+    if (pMatch - matchLength != pMatchBase) {
+        return matchLength;
+    }
+    DEBUGLOG(7, "ZSTD_ldm_countBackwardsMatch_2segments: found a 2-parts backwards match (current length==%zu)", matchLength);
+    DEBUGLOG(7, "distance from pMatch to start = %zi", pMatch - pMatchBase);
+    DEBUGLOG(7, "final backwards match length = %zu", matchLength + ZSTD_ldm_countBackwardsMatch(pIn - matchLength, pAnchor, mEnd, pMatchBase));
+    return matchLength + ZSTD_ldm_countBackwardsMatch(pIn - matchLength, pAnchor, mEnd, pMatchBase);
+}
+
 /** ZSTD_ldm_fillFastTables() :
  *
  *  Fills the relevant tables for the ZSTD_fast and ZSTD_dfast strategies.
@@ -329,8 +349,8 @@ static size_t ZSTD_ldm_generateSequences_internal(
                         continue;
                     }
                     curBackwardMatchLength =
-                        ZSTD_ldm_countBackwardsMatch(ip, anchor, pMatch,
-                                                     lowMatchPtr);
+                        ZSTD_ldm_countBackwardsMatch_2segments(ip, anchor, pMatch,
+                                                               lowMatchPtr, dictEnd);
                     curTotalMatchLength = curForwardMatchLength +
                                           curBackwardMatchLength;
                 } else { /* !extDict */