From: Yann Collet Date: Mon, 27 Jul 2015 18:34:27 +0000 (+0100) Subject: Updated fse (faster huff0 32-bits decoding) X-Git-Tag: v0.1.0~2^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb8296f55c23ccb411964f7e79d33243905e02a0;p=thirdparty%2Fzstd.git Updated fse (faster huff0 32-bits decoding) --- diff --git a/lib/fse.c b/lib/fse.c index 5390e9cdc..b6215b736 100644 --- a/lib/fse.c +++ b/lib/fse.c @@ -1656,10 +1656,13 @@ size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSr /********************************************************* * Huff0 : Huffman block compression *********************************************************/ -#define HUF_ABSOLUTEMAX_TABLELOG 16 -#define HUF_MAX_TABLELOG 13 -#define HUF_DEFAULT_TABLELOG 12 #define HUF_MAX_SYMBOL_VALUE 255 +#define HUF_DEFAULT_TABLELOG 12 /* used by default, when not specified */ +#define HUF_MAX_TABLELOG 12 /* max possible tableLog; for allocation purpose; can be modified */ +#define HUF_ABSOLUTEMAX_TABLELOG 16 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code is unsupported */ +#if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG) +# error "HUF_MAX_TABLELOG is too large !" +#endif typedef struct HUF_CElt_s { U16 val; @@ -2192,26 +2195,33 @@ static size_t HUF_decompress_usingDTable( for ( ; (reloadStatus12)) FSE_reloadDStream(&Dstream) + +#define HUF_DECODE_SYMBOL_2(n, Dstream) \ HUF_decodeSymbol(op+n, &Dstream, dt, dtLog); \ if (FSE_32bits()) FSE_reloadDStream(&Dstream) - HUF_DECODE_SYMBOL( 0, bitD1); - HUF_DECODE_SYMBOL( 1, bitD2); - HUF_DECODE_SYMBOL( 2, bitD3); - HUF_DECODE_SYMBOL( 3, bitD4); - HUF_DECODE_SYMBOL( 4, bitD1); - HUF_DECODE_SYMBOL( 5, bitD2); - HUF_DECODE_SYMBOL( 6, bitD3); - HUF_DECODE_SYMBOL( 7, bitD4); - HUF_DECODE_SYMBOL( 8, bitD1); - HUF_DECODE_SYMBOL( 9, bitD2); - HUF_DECODE_SYMBOL(10, bitD3); - HUF_DECODE_SYMBOL(11, bitD4); - HUF_DECODE_SYMBOL(12, bitD1); - HUF_DECODE_SYMBOL(13, bitD2); - HUF_DECODE_SYMBOL(14, bitD3); - HUF_DECODE_SYMBOL(15, bitD4); + HUF_DECODE_SYMBOL_1( 0, bitD1); + HUF_DECODE_SYMBOL_1( 1, bitD2); + HUF_DECODE_SYMBOL_1( 2, bitD3); + HUF_DECODE_SYMBOL_1( 3, bitD4); + HUF_DECODE_SYMBOL_2( 4, bitD1); + HUF_DECODE_SYMBOL_2( 5, bitD2); + HUF_DECODE_SYMBOL_2( 6, bitD3); + HUF_DECODE_SYMBOL_2( 7, bitD4); + HUF_DECODE_SYMBOL_1( 8, bitD1); + HUF_DECODE_SYMBOL_1( 9, bitD2); + HUF_DECODE_SYMBOL_1(10, bitD3); + HUF_DECODE_SYMBOL_1(11, bitD4); + HUF_DECODE_SYMBOL_0(12, bitD1); + HUF_DECODE_SYMBOL_0(13, bitD2); + HUF_DECODE_SYMBOL_0(14, bitD3); + HUF_DECODE_SYMBOL_0(15, bitD4); } if (reloadStatus!=FSE_DStream_completed) /* not complete : some bitStream might be 0 (unfinished) */ @@ -2227,7 +2237,7 @@ static size_t HUF_decompress_usingDTable( bitTail.start = start1; for ( ; (FSE_reloadDStream(&bitTail) < FSE_DStream_completed) && (op