From 1e61e972fbbfe59a03e643e444aeb2904bfe20bf Mon Sep 17 00:00:00 2001 From: Brotli Date: Fri, 27 Jan 2023 10:16:21 +0000 Subject: [PATCH] speed up encoding by ~5 % PiperOrigin-RevId: 505061835 --- c/enc/find_match_length.h | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/c/enc/find_match_length.h b/c/enc/find_match_length.h index dee0414ab..f3de0bdb6 100644 --- a/c/enc/find_match_length.h +++ b/c/enc/find_match_length.h @@ -22,31 +22,23 @@ extern "C" { static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1, const uint8_t* s2, size_t limit) { - size_t matched = 0; - size_t limit2 = (limit >> 3) + 1; /* + 1 is for pre-decrement in while */ - while (BROTLI_PREDICT_TRUE(--limit2)) { - if (BROTLI_PREDICT_FALSE(BROTLI_UNALIGNED_LOAD64LE(s2) == - BROTLI_UNALIGNED_LOAD64LE(s1 + matched))) { - s2 += 8; - matched += 8; - } else { - uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^ - BROTLI_UNALIGNED_LOAD64LE(s1 + matched); + const uint8_t *s1_orig = s1; + for (; limit >= 8; limit -= 8) { + uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^ + BROTLI_UNALIGNED_LOAD64LE(s1); + s2 += 8; + if (x != 0) { size_t matching_bits = (size_t)BROTLI_TZCNT64(x); - matched += matching_bits >> 3; - return matched; + return (size_t)(s1 - s1_orig) + (matching_bits >> 3); } + s1 += 8; } - limit = (limit & 7) + 1; /* + 1 is for pre-decrement in while */ - while (--limit) { - if (BROTLI_PREDICT_TRUE(s1[matched] == *s2)) { - ++s2; - ++matched; - } else { - return matched; - } + while (limit && *s1 == *s2) { + limit--; + ++s2; + ++s1; } - return matched; + return (size_t)(s1 - s1_orig); } #else static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,