diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2008-03-24 16:38:40 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2008-03-24 16:38:40 +0200 |
commit | 641998c3e1ecc8b598fe0eb051fab8b9535c291b (patch) | |
tree | 7a0cee9b393131475cca96848d0f72fc62153460 | |
parent | Take advantage of arithmetic right shift in range decoder. (diff) | |
download | xz-641998c3e1ecc8b598fe0eb051fab8b9535c291b.tar.xz |
Replaced the range decoder optimization that used arithmetic
right shift with as fast version that doesn't need
arithmetic right shift. Removed the related check from
configure.ac.
Diffstat (limited to '')
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | m4/ax_c_arithmetic_rshift.m4 | 36 | ||||
-rw-r--r-- | src/liblzma/rangecoder/range_decoder.h | 53 |
3 files changed, 16 insertions, 74 deletions
diff --git a/configure.ac b/configure.ac index 472a7d16..dbafd73c 100644 --- a/configure.ac +++ b/configure.ac @@ -407,7 +407,6 @@ AC_CHECK_HEADERS([assert.h errno.h byteswap.h sys/param.h sys/sysctl.h], AC_C_INLINE AC_C_RESTRICT -AX_C_ARITHMETIC_RSHIFT AC_HEADER_STDBOOL diff --git a/m4/ax_c_arithmetic_rshift.m4 b/m4/ax_c_arithmetic_rshift.m4 deleted file mode 100644 index 3c183445..00000000 --- a/m4/ax_c_arithmetic_rshift.m4 +++ /dev/null @@ -1,36 +0,0 @@ -##### http://autoconf-archive.cryp.to/ax_c_arithmetic_rshift.html -# -# SYNOPSIS -# -# AX_C_ARITHMETIC_RSHIFT -# -# DESCRIPTION -# -# Checks if the right shift operation is arithmetic. -# -# This macro uses compile-time detection and so is cross-compile -# ready. -# -# LAST MODIFICATION -# -# 2006-12-12 -# -# COPYLEFT -# -# Copyright (c) 2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp> -# -# Copying and distribution of this file, with or without -# modification, are permitted in any medium without royalty provided -# the copyright notice and this notice are preserved. - -AC_DEFUN([AX_C_ARITHMETIC_RSHIFT], [ - AC_CACHE_CHECK([whether right shift operation is arithmetic], - [ax_cv_c_arithmetic_rshift], - [AC_COMPILE_IFELSE([[int dummy[((-1 >> 1) < 0) ? 1 : -1];]], - [ax_cv_c_arithmetic_rshift=yes], - [ax_cv_c_arithmetic_rshift=no])]) - if test "x$ax_cv_c_arithmetic_rshift" = xyes; then - AC_DEFINE([HAVE_ARITHMETIC_RSHIFT], [1], - [Define to 1 if the right shift operation is arithmetic.]) - fi -]) diff --git a/src/liblzma/rangecoder/range_decoder.h b/src/liblzma/rangecoder/range_decoder.h index a6a92b0b..62162448 100644 --- a/src/liblzma/rangecoder/range_decoder.h +++ b/src/liblzma/rangecoder/range_decoder.h @@ -121,26 +121,15 @@ do { \ } while (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 +#define rc_decode_direct(dest, count) \ +do { \ + rc_normalize(); \ + rc.range >>= 1; \ + rc.code -= rc.range; \ + rc_bound = UINT32_C(0) - (rc.code >> 31); \ + rc.code += rc.range & rc_bound; \ + dest = (dest << 1) + (rc_bound + 1); \ +} while (--count > 0) // Dummy versions don't update prob or dest. @@ -155,23 +144,13 @@ do { \ } while (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 +#define rc_decode_direct_dummy(count) \ +do { \ + rc_normalize(); \ + rc.range >>= 1; \ + rc.code -= rc.range; \ + rc.code += rc.range & (UINT32_C(0) - (rc.code >> 31)); \ +} while (--count > 0) /////////////////////// |