| 3273 | #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES |
| 3274 | #define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p) |
| 3275 | static MZ_FORCEINLINE void |
| 3276 | tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, |
| 3277 | mz_uint max_match_len, mz_uint *pMatch_dist, |
| 3278 | mz_uint *pMatch_len) { |
| 3279 | mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, |
| 3280 | match_len = *pMatch_len, probe_pos = pos, next_probe_pos, |
| 3281 | probe_len; |
| 3282 | mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; |
| 3283 | const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q; |
| 3284 | mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), |
| 3285 | s01 = TDEFL_READ_UNALIGNED_WORD(s); |
| 3286 | MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); |
| 3287 | if (max_match_len <= match_len) |
| 3288 | return; |
| 3289 | for (;;) { |
| 3290 | for (;;) { |
| 3291 | if (--num_probes_left == 0) |
| 3292 | return; |
| 3293 | #define TDEFL_PROBE \ |
| 3294 | next_probe_pos = d->m_next[probe_pos]; \ |
| 3295 | if ((!next_probe_pos) || \ |
| 3296 | ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) \ |
| 3297 | return; \ |
| 3298 | probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ |
| 3299 | if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) \ |
| 3300 | break; |
| 3301 | TDEFL_PROBE; |
| 3302 | TDEFL_PROBE; |
| 3303 | TDEFL_PROBE; |
| 3304 | } |
| 3305 | if (!dist) |
| 3306 | break; |
| 3307 | q = (const mz_uint16 *)(d->m_dict + probe_pos); |
| 3308 | if (TDEFL_READ_UNALIGNED_WORD(q) != s01) |
| 3309 | continue; |
| 3310 | p = s; |
| 3311 | probe_len = 32; |
| 3312 | do { |
| 3313 | } while ( |
| 3314 | (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && |
| 3315 | (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && |
| 3316 | (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && |
| 3317 | (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && |
| 3318 | (--probe_len > 0)); |
| 3319 | if (!probe_len) { |
| 3320 | *pMatch_dist = dist; |
| 3321 | *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); |
| 3322 | break; |
| 3323 | } else if ((probe_len = ((mz_uint)(p - s) * 2) + |
| 3324 | (mz_uint)(*(const mz_uint8 *)p == |
| 3325 | *(const mz_uint8 *)q)) > match_len) { |
| 3326 | *pMatch_dist = dist; |
| 3327 | if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == |
| 3328 | max_match_len) |
| 3329 | break; |
| 3330 | c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); |
| 3331 | } |
| 3332 | } |
no outgoing calls
no test coverage detected