mirror of
https://git.tukaani.org/xz.git
synced 2024-04-04 12:36:23 +02:00
liblzma: LZMA decoder: Optimize loop comparison.
But now it needs one more local variable.
This commit is contained in:
parent
88276f9f2c
commit
5e04706b91
2 changed files with 11 additions and 4 deletions
|
@ -261,7 +261,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr,
|
||||||
const size_t dict_start = dict.pos;
|
const size_t dict_start = dict.pos;
|
||||||
|
|
||||||
// Range decoder
|
// Range decoder
|
||||||
rc_to_local(coder->rc, *in_pos);
|
rc_to_local(coder->rc, *in_pos, LZMA_IN_REQUIRED);
|
||||||
|
|
||||||
// State
|
// State
|
||||||
uint32_t state = coder->state;
|
uint32_t state = coder->state;
|
||||||
|
@ -340,8 +340,7 @@ lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr,
|
||||||
|
|
||||||
// If there is not enough room for another LZMA symbol
|
// If there is not enough room for another LZMA symbol
|
||||||
// go to Resumable mode.
|
// go to Resumable mode.
|
||||||
if (unlikely(rc_in_end - rc_in_ptr < LZMA_IN_REQUIRED
|
if (unlikely(!rc_is_fast_allowed() || dict.pos == dict.limit))
|
||||||
|| dict.pos == dict.limit))
|
|
||||||
goto slow;
|
goto slow;
|
||||||
|
|
||||||
// Decode the first bit from the next LZMA symbol.
|
// Decode the first bit from the next LZMA symbol.
|
||||||
|
|
|
@ -61,13 +61,21 @@ rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in,
|
||||||
/// Makes local copies of range decoder and *in_pos variables. Doing this
|
/// Makes local copies of range decoder and *in_pos variables. Doing this
|
||||||
/// improves speed significantly. The range decoder macros expect also
|
/// improves speed significantly. The range decoder macros expect also
|
||||||
/// variables 'in' and 'in_size' to be defined.
|
/// variables 'in' and 'in_size' to be defined.
|
||||||
#define rc_to_local(range_decoder, in_pos) \
|
#define rc_to_local(range_decoder, in_pos, fast_mode_in_required) \
|
||||||
lzma_range_decoder rc = range_decoder; \
|
lzma_range_decoder rc = range_decoder; \
|
||||||
const uint8_t *rc_in_ptr = in + (in_pos); \
|
const uint8_t *rc_in_ptr = in + (in_pos); \
|
||||||
const uint8_t *rc_in_end = in + in_size; \
|
const uint8_t *rc_in_end = in + in_size; \
|
||||||
|
const uint8_t *rc_in_fast_end \
|
||||||
|
= (rc_in_end - rc_in_ptr) <= (fast_mode_in_required) \
|
||||||
|
? rc_in_ptr \
|
||||||
|
: rc_in_end - (fast_mode_in_required); \
|
||||||
uint32_t rc_bound
|
uint32_t rc_bound
|
||||||
|
|
||||||
|
|
||||||
|
/// Evaluates to true if there is enough input remaining to use fast mode.
|
||||||
|
#define rc_is_fast_allowed() (rc_in_ptr < rc_in_fast_end)
|
||||||
|
|
||||||
|
|
||||||
/// Stores the local copes back to the range decoder structure.
|
/// Stores the local copes back to the range decoder structure.
|
||||||
#define rc_from_local(range_decoder, in_pos) \
|
#define rc_from_local(range_decoder, in_pos) \
|
||||||
do { \
|
do { \
|
||||||
|
|
Loading…
Reference in a new issue