xref: /freebsd/contrib/xz/src/liblzma/rangecoder/range_common.h (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
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