12#define HashLongestMatchQuickly HASHER()
14#define BUCKET_SIZE (1 << BUCKET_BITS)
15#define BUCKET_MASK (BUCKET_SIZE - 1)
16#define BUCKET_SWEEP (1 << BUCKET_SWEEP_BITS)
17#define BUCKET_SWEEP_MASK ((BUCKET_SWEEP - 1) << 3)
25static uint32_t
FN(HashBytes)(
const uint8_t*
data) {
26 const uint64_t
h = ((BROTLI_UNALIGNED_LOAD64LE(
data) << (64 - 8 *
HASH_LEN)) *
46static void FN(Initialize)(
49 self->common = common;
52 self->buckets_ = (uint32_t*)common->extra;
55static void FN(Prepare)(
60 size_t partial_prepare_threshold =
BUCKET_SIZE >> 5;
61 if (one_shot && input_size <= partial_prepare_threshold) {
63 for (
i = 0;
i < input_size; ++
i) {
64 const uint32_t key =
FN(HashBytes)(&
data[
i]);
98 const uint32_t key =
FN(HashBytes)(&
data[ix & mask]);
100 self->buckets_[key] = (uint32_t)ix;
104 self->buckets_[(key + off) &
BUCKET_MASK] = (uint32_t)ix;
111 const size_t ix_start,
const size_t ix_end) {
113 for (
i = ix_start;
i < ix_end; ++
i) {
114 FN(Store)(self,
data, mask,
i);
120 size_t num_bytes,
size_t position,
121 const uint8_t* ringbuffer,
size_t ringbuffer_mask) {
122 if (num_bytes >=
FN(HashTypeLength)() - 1 && position >= 3) {
126 FN(Store)(self, ringbuffer, ringbuffer_mask, position - 3);
127 FN(Store)(self, ringbuffer, ringbuffer_mask, position - 2);
128 FN(Store)(self, ringbuffer, ringbuffer_mask, position - 1);
151 const size_t ring_buffer_mask,
const int*
BROTLI_RESTRICT distance_cache,
152 const size_t cur_ix,
const size_t max_length,
const size_t max_backward,
153 const size_t dictionary_distance,
const size_t max_distance,
156 const size_t best_len_in =
out->len;
157 const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
158 int compare_char =
data[cur_ix_masked + best_len_in];
159 size_t key =
FN(HashBytes)(&
data[cur_ix_masked]);
163 size_t best_len = best_len_in;
164 size_t cached_backward = (size_t)distance_cache[0];
165 size_t prev_ix = cur_ix - cached_backward;
166 out->len_code_delta = 0;
167 if (prev_ix < cur_ix) {
168 prev_ix &= (uint32_t)ring_buffer_mask;
169 if (compare_char ==
data[prev_ix + best_len]) {
170 const size_t len = FindMatchLengthWithLimit(
171 &
data[prev_ix], &
data[cur_ix_masked], max_length);
173 const score_t score = BackwardReferenceScoreUsingLastDistance(
len);
174 if (best_score < score) {
176 out->distance = cached_backward;
179 buckets[key] = (uint32_t)cur_ix;
184 compare_char =
data[cur_ix_masked +
len];
194 prev_ix = buckets[key];
195 buckets[key] = (uint32_t)cur_ix;
196 backward = cur_ix - prev_ix;
197 prev_ix &= (uint32_t)ring_buffer_mask;
198 if (compare_char !=
data[prev_ix + best_len_in]) {
204 len = FindMatchLengthWithLimit(&
data[prev_ix],
205 &
data[cur_ix_masked],
208 const score_t score = BackwardReferenceScore(
len, backward);
209 if (best_score < score) {
211 out->distance = backward;
226 prev_ix = buckets[keys[
i]];
227 backward = cur_ix - prev_ix;
228 prev_ix &= (uint32_t)ring_buffer_mask;
229 if (compare_char !=
data[prev_ix + best_len]) {
235 len = FindMatchLengthWithLimit(&
data[prev_ix],
236 &
data[cur_ix_masked],
239 const score_t score = BackwardReferenceScore(
len, backward);
240 if (best_score < score) {
243 compare_char =
data[cur_ix_masked +
len];
246 out->distance = backward;
253 self->common, &
data[cur_ix_masked], max_length, dictionary_distance,
257 buckets[key_out] = (uint32_t)cur_ix;
261#undef BUCKET_SWEEP_MASK
266#undef HashLongestMatchQuickly
static const void * data
Definition XzCrc64.c:50
#define FN(X)
Definition backward_references.c:51
#define HASH_LEN
Definition hash.h:250
#define score_t
Definition hash.h:43
#define USE_DICTIONARY
Definition hash.h:251
#define BUCKET_BITS
Definition hash.h:232
#define BUCKET_SWEEP_MASK
Definition hash_longest_match_quickly_inc.h:17
#define BUCKET_SIZE
Definition hash_longest_match_quickly_inc.h:14
#define BUCKET_SWEEP
Definition hash_longest_match_quickly_inc.h:16
#define BUCKET_MASK
Definition hash_longest_match_quickly_inc.h:15
#define HashLongestMatchQuickly
Definition hash_longest_match_quickly_inc.h:12
Definition encoder_dict.h:20
Definition hash_longest_match_quickly_inc.h:37
uint32_t * buckets_
Definition hash_longest_match_quickly_inc.h:43
HasherCommon * common
Definition hash_longest_match_quickly_inc.h:39
Definition poolTests.c:28
Definition zstd_decompress.c:306
#define BROTLI_TRUE
Definition types.h:51
#define BROTLI_BOOL
Definition types.h:49
#define h(i)
Definition sha256.c:48
const lzma_allocator const uint8_t size_t uint8_t * out
Definition block.h:528
lzma_index ** i
Definition index.h:629
static uint32_t const uint8_t uint32_t len
Definition memcmplen.h:44
struct dictionary_s dictionary