]> granicus.if.org Git - xz/commitdiff
Take advantage of arithmetic right shift in range decoder.
authorLasse Collin <lasse.collin@tukaani.org>
Sat, 22 Mar 2008 12:39:34 +0000 (14:39 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Sat, 22 Mar 2008 12:39:34 +0000 (14:39 +0200)
src/liblzma/rangecoder/range_decoder.h

index f3dcc84ed0eb140def0026415322383ec999df2f..a6a92b0b792eb32af6b74821d99622e87239a617 100644 (file)
@@ -121,14 +121,26 @@ do { \
 } while (0)
 
 
-#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)
+#ifdef HAVE_ARITHMETIC_RSHIFT
+#      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.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.
@@ -143,13 +155,23 @@ do { \
 } while (0)
 
 
-#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)
+#ifdef HAVE_ARITHMETIC_RSHIFT
+#      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.range >>= 1; \
+               rc_bound = (rc.code - rc.range) >> 31; \
+               rc.code -= rc.range & (rc_bound - 1); \
+       } while (--count > 0)
+#endif
 
 
 ///////////////////////