1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 481ad8388SMartin Matuska // 581ad8388SMartin Matuska /// \file range_common.h 681ad8388SMartin Matuska /// \brief Common things for range encoder and decoder 781ad8388SMartin Matuska /// 881ad8388SMartin Matuska // Authors: Igor Pavlov 981ad8388SMartin Matuska // Lasse Collin 1081ad8388SMartin Matuska // 1181ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 1281ad8388SMartin Matuska 1381ad8388SMartin Matuska #ifndef LZMA_RANGE_COMMON_H 1481ad8388SMartin Matuska #define LZMA_RANGE_COMMON_H 1581ad8388SMartin Matuska 16*3b35e7eeSXin LI // Skip common.h if building price_tablegen.c. 17*3b35e7eeSXin LI #ifndef BUILDING_PRICE_TABLEGEN 1881ad8388SMartin Matuska # include "common.h" 19*3b35e7eeSXin LI #endif 2081ad8388SMartin Matuska 2181ad8388SMartin Matuska 2281ad8388SMartin Matuska /////////////// 2381ad8388SMartin Matuska // Constants // 2481ad8388SMartin Matuska /////////////// 2581ad8388SMartin Matuska 2681ad8388SMartin Matuska #define RC_SHIFT_BITS 8 2781ad8388SMartin Matuska #define RC_TOP_BITS 24 2881ad8388SMartin Matuska #define RC_TOP_VALUE (UINT32_C(1) << RC_TOP_BITS) 2981ad8388SMartin Matuska #define RC_BIT_MODEL_TOTAL_BITS 11 3081ad8388SMartin Matuska #define RC_BIT_MODEL_TOTAL (UINT32_C(1) << RC_BIT_MODEL_TOTAL_BITS) 3181ad8388SMartin Matuska #define RC_MOVE_BITS 5 3281ad8388SMartin Matuska 3381ad8388SMartin Matuska 3481ad8388SMartin Matuska //////////// 3581ad8388SMartin Matuska // Macros // 3681ad8388SMartin Matuska //////////// 3781ad8388SMartin Matuska 3881ad8388SMartin Matuska // Resets the probability so that both 0 and 1 have probability of 50 % 3981ad8388SMartin Matuska #define bit_reset(prob) \ 4081ad8388SMartin Matuska prob = RC_BIT_MODEL_TOTAL >> 1 4181ad8388SMartin Matuska 4281ad8388SMartin Matuska // This does the same for a complete bit tree. 4381ad8388SMartin Matuska // (A tree represented as an array.) 4481ad8388SMartin Matuska #define bittree_reset(probs, bit_levels) \ 4581ad8388SMartin Matuska for (uint32_t bt_i = 0; bt_i < (1 << (bit_levels)); ++bt_i) \ 4681ad8388SMartin Matuska bit_reset((probs)[bt_i]) 4781ad8388SMartin Matuska 4881ad8388SMartin Matuska 4981ad8388SMartin Matuska ////////////////////// 5081ad8388SMartin Matuska // Type definitions // 5181ad8388SMartin Matuska ////////////////////// 5281ad8388SMartin Matuska 5381ad8388SMartin Matuska /// \brief Type of probabilities used with range coder 5481ad8388SMartin Matuska /// 5581ad8388SMartin Matuska /// This needs to be at least 12-bit integer, so uint16_t is a logical choice. 5681ad8388SMartin Matuska /// However, on some architecture and compiler combinations, a bigger type 5781ad8388SMartin Matuska /// may give better speed, because the probability variables are accessed 5881ad8388SMartin Matuska /// a lot. On the other hand, bigger probability type increases cache 5981ad8388SMartin Matuska /// footprint, since there are 2 to 14 thousand probability variables in 6081ad8388SMartin Matuska /// LZMA (assuming the limit of lc + lp <= 4; with lc + lp <= 12 there 6181ad8388SMartin Matuska /// would be about 1.5 million variables). 6281ad8388SMartin Matuska /// 6381ad8388SMartin Matuska /// With malicious files, the initialization speed of the LZMA decoder can 6481ad8388SMartin Matuska /// become important. In that case, smaller probability variables mean that 6581ad8388SMartin Matuska /// there is less bytes to write to RAM, which makes initialization faster. 6681ad8388SMartin Matuska /// With big probability type, the initialization can become so slow that it 6781ad8388SMartin Matuska /// can be a problem e.g. for email servers doing virus scanning. 6881ad8388SMartin Matuska /// 6981ad8388SMartin Matuska /// I will be sticking to uint16_t unless some specific architectures 7081ad8388SMartin Matuska /// are *much* faster (20-50 %) with uint32_t. 71*3b35e7eeSXin LI /// 72*3b35e7eeSXin LI /// Update in 2024: The branchless C and x86-64 assembly was written so that 73*3b35e7eeSXin LI /// probability is assumed to be uint16_t. (In contrast, LZMA SDK 23.01 74*3b35e7eeSXin LI /// assembly supports both types.) 7581ad8388SMartin Matuska typedef uint16_t probability; 7681ad8388SMartin Matuska 7781ad8388SMartin Matuska #endif 78