aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c/enc/hash_longest_match64_inc.h33
1 files changed, 17 insertions, 16 deletions
diff --git a/c/enc/hash_longest_match64_inc.h b/c/enc/hash_longest_match64_inc.h
index ea5a831..e48fc61 100644
--- a/c/enc/hash_longest_match64_inc.h
+++ b/c/enc/hash_longest_match64_inc.h
@@ -217,8 +217,12 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
const size_t down =
(num[key] > self->block_size_) ?
(num[key] - self->block_size_) : 0u;
- for (i = num[key]; i > down;) {
+ const uint32_t first4 = BrotliUnalignedRead32(data + cur_ix_masked);
+ const size_t max_length_m4 = max_length - 4;
+ i = num[key];
+ for (; i > down;) {
size_t prev_ix = bucket[--i & self->block_mask_];
+ uint32_t current4;
const size_t backward = cur_ix - prev_ix;
if (BROTLI_PREDICT_FALSE(backward > max_backward)) {
break;
@@ -229,22 +233,19 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
continue;
}
+ current4 = BrotliUnalignedRead32(data + prev_ix);
+ if (first4 != current4) continue;
{
- const size_t len = FindMatchLengthWithLimit(&data[prev_ix],
- &data[cur_ix_masked],
- max_length);
- if (len >= 4) {
- /* Comparing for >= 3 does not change the semantics, but just saves
- for a few unnecessary binary logarithms in backward reference
- score, since we are not interested in such short matches. */
- score_t score = BackwardReferenceScore(len, backward);
- if (best_score < score) {
- best_score = score;
- best_len = len;
- out->len = best_len;
- out->distance = backward;
- out->score = best_score;
- }
+ const size_t len = FindMatchLengthWithLimit(&data[prev_ix + 4],
+ &data[cur_ix_masked + 4],
+ max_length_m4) + 4;
+ const score_t score = BackwardReferenceScore(len, backward);
+ if (best_score < score) {
+ best_score = score;
+ best_len = len;
+ out->len = best_len;
+ out->distance = backward;
+ out->score = best_score;
}
}
}