/* Load the probability entry corresponding to the current state. */
prob_entry = &probs[*state_p];
+ /* Update the state early. We'll still need to OR the state with 1
+ * later if the decoded bit is a 1. */
+ *state_p = (*state_p << 1) & (num_states - 1);
+
+ /* Get the probability (out of LZMS_PROBABILITY_DENOMINATOR) that the
+ * next bit is 0. */
+ prob = lzms_get_probability(prob_entry);
+
/* Normalize if needed. */
- if (rd->range <= 0xffff) {
+ if (!(rd->range & 0xFFFF0000)) {
rd->range <<= 16;
rd->code <<= 16;
if (likely(rd->next != rd->end))
rd->code |= le16_to_cpu(*rd->next++);
}
- /* Get the probability (out of LZMS_PROBABILITY_DENOMINATOR) that the
- * next bit is 0. */
- prob = lzms_get_probability(prob_entry);
-
/* Based on the probability, calculate the bound between the 0-bit
* region and the 1-bit region of the range. */
bound = (rd->range >> LZMS_PROBABILITY_BITS) * prob;
rd->range = bound;
/* Update the state and probability entry based on the decoded bit. */
- *state_p = ((*state_p << 1) | 0) & (num_states - 1);
lzms_update_probability_entry(prob_entry, 0);
return 0;
} else {
rd->code -= bound;
/* Update the state and probability entry based on the decoded bit. */
- *state_p = ((*state_p << 1) | 1) & (num_states - 1);
lzms_update_probability_entry(prob_entry, 1);
+ *state_p |= 1;
return 1;
}
}
if (pending_lz_offset != 0 &&
out_next != lz_offset_still_pending)
{
- BUILD_BUG_ON(LZMS_NUM_LZ_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_LZ_REPS == 3);
recent_lz_offsets[3] = recent_lz_offsets[2];
recent_lz_offsets[2] = recent_lz_offsets[1];
recent_lz_offsets[1] = recent_lz_offsets[0];
pending_lz_offset = 0;
}
- BUILD_BUG_ON(LZMS_NUM_LZ_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_LZ_REPS == 3);
if (!lzms_decode_bit(&rd, &lz_rep_states[0],
LZMS_NUM_LZ_REP_PROBS,
d->probs.lz_rep[0]))
}
if (pending_lz_offset != 0) {
- BUILD_BUG_ON(LZMS_NUM_LZ_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_LZ_REPS == 3);
recent_lz_offsets[3] = recent_lz_offsets[2];
recent_lz_offsets[2] = recent_lz_offsets[1];
recent_lz_offsets[1] = recent_lz_offsets[0];
if (pending_delta_pair != 0 &&
out_next != delta_pair_still_pending)
{
- BUILD_BUG_ON(LZMS_NUM_DELTA_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_DELTA_REPS == 3);
recent_delta_pairs[3] = recent_delta_pairs[2];
recent_delta_pairs[2] = recent_delta_pairs[1];
recent_delta_pairs[1] = recent_delta_pairs[0];
pending_delta_pair = 0;
}
- BUILD_BUG_ON(LZMS_NUM_DELTA_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_DELTA_REPS == 3);
if (!lzms_decode_bit(&rd, &delta_rep_states[0],
LZMS_NUM_DELTA_REP_PROBS,
d->probs.delta_rep[0]))
}
if (pending_delta_pair != 0) {
- BUILD_BUG_ON(LZMS_NUM_DELTA_REPS != 3);
+ STATIC_ASSERT(LZMS_NUM_DELTA_REPS == 3);
recent_delta_pairs[3] = recent_delta_pairs[2];
recent_delta_pairs[2] = recent_delta_pairs[1];
recent_delta_pairs[1] = recent_delta_pairs[0];