1
0
Fork 0
mirror of https://git.tukaani.org/xz.git synced 2024-04-04 12:36:23 +02:00

Take advantage of arithmetic right shift in range decoder.

This commit is contained in:
Lasse Collin 2008-03-22 14:39:34 +02:00
parent 03e0e8a0d7
commit ad999efd27

View file

@ -121,14 +121,26 @@ do { \
} while (0) } while (0)
#define rc_decode_direct(dest, count) \ #ifdef HAVE_ARITHMETIC_RSHIFT
do { \ # define rc_decode_direct(dest, count) \
do { \
rc_normalize(); \
rc.range >>= 1; \
rc.code -= rc.range; \
rc_bound = (uint32_t)((int32_t)(rc.code) >> 31); \
dest = (dest << 1) + (rc_bound + 1); \
rc.code += rc.range & rc_bound; \
} while (--count > 0)
#else
# define rc_decode_direct(dest, count) \
do { \
rc_normalize(); \ rc_normalize(); \
rc.range >>= 1; \ rc.range >>= 1; \
rc_bound = (rc.code - rc.range) >> 31; \ rc_bound = (rc.code - rc.range) >> 31; \
rc.code -= rc.range & (rc_bound - 1); \ rc.code -= rc.range & (rc_bound - 1); \
dest = ((dest) << 1) | (1 - rc_bound);\ dest = ((dest) << 1) | (1 - rc_bound);\
} while (--count > 0) } while (--count > 0)
#endif
// Dummy versions don't update prob or dest. // Dummy versions don't update prob or dest.
@ -143,13 +155,23 @@ do { \
} while (0) } while (0)
#define rc_decode_direct_dummy(count) \ #ifdef HAVE_ARITHMETIC_RSHIFT
do { \ # define rc_decode_direct_dummy(count) \
do { \
rc_normalize(); \
rc.range >>= 1; \
rc.code -= rc.range; \
rc.code += rc.range & ((uint32_t)((int32_t)(rc.code) >> 31)); \
} while (--count > 0)
#else
# define rc_decode_direct_dummy(count) \
do { \
rc_normalize(); \ rc_normalize(); \
rc.range >>= 1; \ rc.range >>= 1; \
rc_bound = (rc.code - rc.range) >> 31; \ rc_bound = (rc.code - rc.range) >> 31; \
rc.code -= rc.range & (rc_bound - 1); \ rc.code -= rc.range & (rc_bound - 1); \
} while (--count > 0) } while (--count > 0)
#endif
/////////////////////// ///////////////////////