aboutsummaryrefslogtreecommitdiff
path: root/c
diff options
context:
space:
mode:
authorBrotli <no-reply@google.com>2023-01-27 10:16:21 +0000
committerEvgenii Kliuchnikov <eustas.ru@gmail.com>2023-01-30 09:10:14 +0000
commit1e61e972fbbfe59a03e643e444aeb2904bfe20bf (patch)
tree5c34c9bb8890ba87f201928fe76b2b8aac13858f /c
parent36533a866ed1ca4b75cf049f4521e4ec5fe24727 (diff)
downloadbrotli-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.h34
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,