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:
parent
03e0e8a0d7
commit
ad999efd27
1 changed files with 37 additions and 15 deletions
|
@ -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) \
|
||||||
rc_normalize(); \
|
do { \
|
||||||
rc.range >>= 1; \
|
rc_normalize(); \
|
||||||
rc_bound = (rc.code - rc.range) >> 31; \
|
rc.range >>= 1; \
|
||||||
rc.code -= rc.range & (rc_bound - 1); \
|
rc.code -= rc.range; \
|
||||||
dest = ((dest) << 1) | (1 - rc_bound);\
|
rc_bound = (uint32_t)((int32_t)(rc.code) >> 31); \
|
||||||
} while (--count > 0)
|
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.range >>= 1; \
|
||||||
|
rc_bound = (rc.code - rc.range) >> 31; \
|
||||||
|
rc.code -= rc.range & (rc_bound - 1); \
|
||||||
|
dest = ((dest) << 1) | (1 - rc_bound);\
|
||||||
|
} 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) \
|
||||||
rc_normalize(); \
|
do { \
|
||||||
rc.range >>= 1; \
|
rc_normalize(); \
|
||||||
rc_bound = (rc.code - rc.range) >> 31; \
|
rc.range >>= 1; \
|
||||||
rc.code -= rc.range & (rc_bound - 1); \
|
rc.code -= rc.range; \
|
||||||
} while (--count > 0)
|
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.range >>= 1; \
|
||||||
|
rc_bound = (rc.code - rc.range) >> 31; \
|
||||||
|
rc.code -= rc.range & (rc_bound - 1); \
|
||||||
|
} while (--count > 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
///////////////////////
|
///////////////////////
|
||||||
|
|
Loading…
Reference in a new issue