diff options
author | Brotli <no-reply@google.com> | 2023-01-27 10:16:21 +0000 |
---|---|---|
committer | Evgenii Kliuchnikov <eustas.ru@gmail.com> | 2023-01-30 09:10:14 +0000 |
commit | 1e61e972fbbfe59a03e643e444aeb2904bfe20bf (patch) | |
tree | 5c34c9bb8890ba87f201928fe76b2b8aac13858f /c | |
parent | 36533a866ed1ca4b75cf049f4521e4ec5fe24727 (diff) | |
download | brotli-1e61e972fbbfe59a03e643e444aeb2904bfe20bf.zip brotli-1e61e972fbbfe59a03e643e444aeb2904bfe20bf.tar.gz brotli-1e61e972fbbfe59a03e643e444aeb2904bfe20bf.tar.bz2 |
speed up encoding by ~5 %
PiperOrigin-RevId: 505061835
Diffstat (limited to 'c')
-rw-r--r-- | c/enc/find_match_length.h | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/c/enc/find_match_length.h b/c/enc/find_match_length.h index dee0414..f3de0bd 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, |