aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2008-03-24 16:38:40 +0200
committerLasse Collin <lasse.collin@tukaani.org>2008-03-24 16:38:40 +0200
commit641998c3e1ecc8b598fe0eb051fab8b9535c291b (patch)
tree7a0cee9b393131475cca96848d0f72fc62153460
parentTake advantage of arithmetic right shift in range decoder. (diff)
downloadxz-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.
-rw-r--r--configure.ac1
-rw-r--r--m4/ax_c_arithmetic_rshift.m436
-rw-r--r--src/liblzma/rangecoder/range_decoder.h53
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)
///////////////////////