mirror of
https://github.com/facebook/zstd.git
synced 2025-12-10 00:06:51 -05:00
Merge pull request #1420 from felixhandte/zstd-decompress-minimal
Various Macros to Allow Building Extremely Minimal Decoder Library
This commit is contained in:
commit
e4ae24c229
@ -63,6 +63,15 @@ matrix:
|
|||||||
- make clang38install
|
- make clang38install
|
||||||
- CC=clang-3.8 make clean msan-test-zstd
|
- CC=clang-3.8 make clean msan-test-zstd
|
||||||
|
|
||||||
|
- name: Trusty (Minimal Decompressor Macros)
|
||||||
|
script:
|
||||||
|
- make clean
|
||||||
|
- make check -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT"
|
||||||
|
- make clean
|
||||||
|
- make check -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG"
|
||||||
|
- make clean
|
||||||
|
- make check -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS"
|
||||||
|
|
||||||
- name: Trusty (CMake)
|
- name: Trusty (CMake)
|
||||||
script:
|
script:
|
||||||
- make cmakebuild
|
- make cmakebuild
|
||||||
|
|||||||
30
lib/Makefile
30
lib/Makefile
@ -50,6 +50,12 @@ ZSTD_LIB_COMPRESSION ?= 1
|
|||||||
ZSTD_LIB_DECOMPRESSION ?= 1
|
ZSTD_LIB_DECOMPRESSION ?= 1
|
||||||
ZSTD_LIB_DICTBUILDER ?= 1
|
ZSTD_LIB_DICTBUILDER ?= 1
|
||||||
ZSTD_LIB_DEPRECATED ?= 1
|
ZSTD_LIB_DEPRECATED ?= 1
|
||||||
|
HUF_FORCE_DECOMPRESS_X1 ?= 0
|
||||||
|
HUF_FORCE_DECOMPRESS_X2 ?= 0
|
||||||
|
ZSTD_FORCE_DECOMPRESS_SHORT ?= 0
|
||||||
|
ZSTD_FORCE_DECOMPRESS_LONG ?= 0
|
||||||
|
ZSTD_NO_INLINE ?= 0
|
||||||
|
ZSTD_STRIP_ERROR_STRINGS ?= 0
|
||||||
|
|
||||||
ifeq ($(ZSTD_LIB_COMPRESSION), 0)
|
ifeq ($(ZSTD_LIB_COMPRESSION), 0)
|
||||||
ZSTD_LIB_DICTBUILDER = 0
|
ZSTD_LIB_DICTBUILDER = 0
|
||||||
@ -77,6 +83,30 @@ ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
|
|||||||
ZSTD_FILES += $(ZDICT_FILES)
|
ZSTD_FILES += $(ZDICT_FILES)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
|
||||||
|
CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
|
||||||
|
CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
|
||||||
|
CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
|
||||||
|
CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(ZSTD_NO_INLINE), 0)
|
||||||
|
CFLAGS += -DZSTD_NO_INLINE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
|
||||||
|
CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(ZSTD_LEGACY_SUPPORT), 0)
|
ifneq ($(ZSTD_LEGACY_SUPPORT), 0)
|
||||||
ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
|
ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
|
||||||
ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
|
ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
|
||||||
|
|||||||
@ -66,6 +66,24 @@ It's possible to compile only a limited set of features.
|
|||||||
and `ZSTD_LIB_DEPRECATED` as 0 to forgo compilation of the corresponding features. This will
|
and `ZSTD_LIB_DEPRECATED` as 0 to forgo compilation of the corresponding features. This will
|
||||||
also disable compilation of all dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable
|
also disable compilation of all dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable
|
||||||
dictBuilder).
|
dictBuilder).
|
||||||
|
- There are some additional macros that can be used to minify the decoder.
|
||||||
|
|
||||||
|
Zstandard often has more than one implementation of a piece of functionality,
|
||||||
|
where each implementation optimizes for different scenarios. For example, the
|
||||||
|
Huffman decoder has complementary implementations that decode the stream one
|
||||||
|
symbol at a time or two symbols at a time. Zstd normally includes both (and
|
||||||
|
dispatches between them at runtime), but by defining `HUF_FORCE_DECOMPRESS_X1`
|
||||||
|
or `HUF_FORCE_DECOMPRESS_X2`, you can force the use of one or the other, avoiding
|
||||||
|
compilation of the other. Similarly, `ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT`
|
||||||
|
and `ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG` force the compilation and use of
|
||||||
|
only one or the other of two decompression implementations. The smallest
|
||||||
|
binary is achieved by using `HUF_FORCE_DECOMPRESS_X1` and
|
||||||
|
`ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT`.
|
||||||
|
|
||||||
|
For squeezing the last ounce of size out, you can also define
|
||||||
|
`ZSTD_NO_INLINE`, which disables inlining, and `ZSTD_STRIP_ERROR_STRINGS`,
|
||||||
|
which removes the error messages that are otherwise returned by
|
||||||
|
`ZSTD_getErrorName`.
|
||||||
|
|
||||||
|
|
||||||
#### Multithreading support
|
#### Multithreading support
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
* Compiler specifics
|
* Compiler specifics
|
||||||
*********************************************************/
|
*********************************************************/
|
||||||
/* force inlining */
|
/* force inlining */
|
||||||
|
|
||||||
|
#if !defined(ZSTD_NO_INLINE)
|
||||||
#if defined (__GNUC__) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
#if defined (__GNUC__) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
||||||
# define INLINE_KEYWORD inline
|
# define INLINE_KEYWORD inline
|
||||||
#else
|
#else
|
||||||
@ -29,6 +31,13 @@
|
|||||||
# define FORCE_INLINE_ATTR
|
# define FORCE_INLINE_ATTR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define INLINE_KEYWORD
|
||||||
|
#define FORCE_INLINE_ATTR
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant
|
* FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant
|
||||||
* parameters. They must be inlined for the compiler to elimininate the constant
|
* parameters. They must be inlined for the compiler to elimininate the constant
|
||||||
|
|||||||
@ -14,6 +14,10 @@
|
|||||||
|
|
||||||
const char* ERR_getErrorString(ERR_enum code)
|
const char* ERR_getErrorString(ERR_enum code)
|
||||||
{
|
{
|
||||||
|
#ifdef ZSTD_STRIP_ERROR_STRINGS
|
||||||
|
(void)code;
|
||||||
|
return "Error strings stripped";
|
||||||
|
#else
|
||||||
static const char* const notErrorCode = "Unspecified error code";
|
static const char* const notErrorCode = "Unspecified error code";
|
||||||
switch( code )
|
switch( code )
|
||||||
{
|
{
|
||||||
@ -46,4 +50,5 @@ const char* ERR_getErrorString(ERR_enum code)
|
|||||||
case PREFIX(maxCode):
|
case PREFIX(maxCode):
|
||||||
default: return notErrorCode;
|
default: return notErrorCode;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@ -173,15 +173,19 @@ typedef U32 HUF_DTable;
|
|||||||
* Advanced decompression functions
|
* Advanced decompression functions
|
||||||
******************************************/
|
******************************************/
|
||||||
size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< decodes RLE and uncompressed */
|
size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< decodes RLE and uncompressed */
|
||||||
size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< considers RLE and uncompressed as errors */
|
size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< considers RLE and uncompressed as errors */
|
||||||
size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< considers RLE and uncompressed as errors */
|
size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< considers RLE and uncompressed as errors */
|
||||||
size_t HUF_decompress4X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
size_t HUF_decompress4X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
||||||
size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
|
size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
||||||
size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
|
size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ****************************************
|
/* ****************************************
|
||||||
@ -277,14 +281,22 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize);
|
|||||||
#define HUF_DECOMPRESS_WORKSPACE_SIZE (2 << 10)
|
#define HUF_DECOMPRESS_WORKSPACE_SIZE (2 << 10)
|
||||||
#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
|
#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
|
||||||
|
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_readDTableX1 (HUF_DTable* DTable, const void* src, size_t srcSize);
|
size_t HUF_readDTableX1 (HUF_DTable* DTable, const void* src, size_t srcSize);
|
||||||
size_t HUF_readDTableX1_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
|
size_t HUF_readDTableX1_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
|
||||||
|
#endif
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_readDTableX2 (HUF_DTable* DTable, const void* src, size_t srcSize);
|
size_t HUF_readDTableX2 (HUF_DTable* DTable, const void* src, size_t srcSize);
|
||||||
size_t HUF_readDTableX2_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
|
size_t HUF_readDTableX2_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_decompress4X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
size_t HUF_decompress4X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
||||||
|
#endif
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ====================== */
|
/* ====================== */
|
||||||
@ -306,24 +318,36 @@ size_t HUF_compress1X_repeat(void* dst, size_t dstSize,
|
|||||||
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
||||||
|
|
||||||
size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */
|
size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t HUF_decompress1X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
|
size_t HUF_decompress1X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
|
||||||
size_t HUF_decompress1X_DCtx_wksp (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
|
size_t HUF_decompress1X_DCtx_wksp (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_decompress1X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
size_t HUF_decompress1X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
|
||||||
size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
|
size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
|
||||||
|
#endif
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
|
||||||
size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
|
size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); /**< automatic selection of sing or double symbol decoder, based on DTable */
|
size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); /**< automatic selection of sing or double symbol decoder, based on DTable */
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_decompress1X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
size_t HUF_decompress1X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
||||||
|
#endif
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* BMI2 variants.
|
/* BMI2 variants.
|
||||||
* If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0.
|
* If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0.
|
||||||
*/
|
*/
|
||||||
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
|
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
|
size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
|
||||||
|
#endif
|
||||||
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
|
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
|
||||||
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
|
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,19 @@
|
|||||||
#include "huf.h"
|
#include "huf.h"
|
||||||
#include "error_private.h"
|
#include "error_private.h"
|
||||||
|
|
||||||
|
/* **************************************************************
|
||||||
|
* Macros
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
/* These two optional macros force the use one way or another of the two
|
||||||
|
* Huffman decompression implementations. You can't force in both directions
|
||||||
|
* at the same time.
|
||||||
|
*/
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1) && \
|
||||||
|
defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
#error "Cannot force the use of the X1 and X2 decoders at the same time!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* **************************************************************
|
/* **************************************************************
|
||||||
* Error Management
|
* Error Management
|
||||||
@ -58,6 +71,51 @@
|
|||||||
#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************************************
|
||||||
|
* BMI2 Variant Wrappers
|
||||||
|
****************************************************************/
|
||||||
|
#if DYNAMIC_BMI2
|
||||||
|
|
||||||
|
#define HUF_DGEN(fn) \
|
||||||
|
\
|
||||||
|
static size_t fn##_default( \
|
||||||
|
void* dst, size_t dstSize, \
|
||||||
|
const void* cSrc, size_t cSrcSize, \
|
||||||
|
const HUF_DTable* DTable) \
|
||||||
|
{ \
|
||||||
|
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \
|
||||||
|
void* dst, size_t dstSize, \
|
||||||
|
const void* cSrc, size_t cSrcSize, \
|
||||||
|
const HUF_DTable* DTable) \
|
||||||
|
{ \
|
||||||
|
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
|
||||||
|
size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
|
||||||
|
{ \
|
||||||
|
if (bmi2) { \
|
||||||
|
return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \
|
||||||
|
} \
|
||||||
|
return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define HUF_DGEN(fn) \
|
||||||
|
static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
|
||||||
|
size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
|
||||||
|
{ \
|
||||||
|
(void)bmi2; \
|
||||||
|
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*-***************************/
|
/*-***************************/
|
||||||
/* generic DTableDesc */
|
/* generic DTableDesc */
|
||||||
/*-***************************/
|
/*-***************************/
|
||||||
@ -71,6 +129,8 @@ static DTableDesc HUF_getDTableDesc(const HUF_DTable* table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
|
|
||||||
/*-***************************/
|
/*-***************************/
|
||||||
/* single-symbol decoding */
|
/* single-symbol decoding */
|
||||||
/*-***************************/
|
/*-***************************/
|
||||||
@ -307,46 +367,6 @@ typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize,
|
|||||||
const void *cSrc,
|
const void *cSrc,
|
||||||
size_t cSrcSize,
|
size_t cSrcSize,
|
||||||
const HUF_DTable *DTable);
|
const HUF_DTable *DTable);
|
||||||
#if DYNAMIC_BMI2
|
|
||||||
|
|
||||||
#define HUF_DGEN(fn) \
|
|
||||||
\
|
|
||||||
static size_t fn##_default( \
|
|
||||||
void* dst, size_t dstSize, \
|
|
||||||
const void* cSrc, size_t cSrcSize, \
|
|
||||||
const HUF_DTable* DTable) \
|
|
||||||
{ \
|
|
||||||
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \
|
|
||||||
void* dst, size_t dstSize, \
|
|
||||||
const void* cSrc, size_t cSrcSize, \
|
|
||||||
const HUF_DTable* DTable) \
|
|
||||||
{ \
|
|
||||||
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
|
|
||||||
size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
|
|
||||||
{ \
|
|
||||||
if (bmi2) { \
|
|
||||||
return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \
|
|
||||||
} \
|
|
||||||
return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define HUF_DGEN(fn) \
|
|
||||||
static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
|
|
||||||
size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
|
|
||||||
{ \
|
|
||||||
(void)bmi2; \
|
|
||||||
return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
HUF_DGEN(HUF_decompress1X1_usingDTable_internal)
|
HUF_DGEN(HUF_decompress1X1_usingDTable_internal)
|
||||||
HUF_DGEN(HUF_decompress4X1_usingDTable_internal)
|
HUF_DGEN(HUF_decompress4X1_usingDTable_internal)
|
||||||
@ -437,6 +457,10 @@ size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|||||||
return HUF_decompress4X1_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
|
return HUF_decompress4X1_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* HUF_FORCE_DECOMPRESS_X2 */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
||||||
|
|
||||||
/* *************************/
|
/* *************************/
|
||||||
/* double-symbols decoding */
|
/* double-symbols decoding */
|
||||||
@ -911,6 +935,8 @@ size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|||||||
return HUF_decompress4X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
|
return HUF_decompress4X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* HUF_FORCE_DECOMPRESS_X1 */
|
||||||
|
|
||||||
|
|
||||||
/* ***********************************/
|
/* ***********************************/
|
||||||
/* Universal decompression selectors */
|
/* Universal decompression selectors */
|
||||||
@ -921,8 +947,18 @@ size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize,
|
|||||||
const HUF_DTable* DTable)
|
const HUF_DTable* DTable)
|
||||||
{
|
{
|
||||||
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 0);
|
||||||
|
return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 1);
|
||||||
|
return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#else
|
||||||
return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
|
return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
|
||||||
HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize,
|
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize,
|
||||||
@ -930,11 +966,22 @@ size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize,
|
|||||||
const HUF_DTable* DTable)
|
const HUF_DTable* DTable)
|
||||||
{
|
{
|
||||||
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 0);
|
||||||
|
return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 1);
|
||||||
|
return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#else
|
||||||
return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
|
return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
|
||||||
HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
|
typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
|
||||||
static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
|
static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
|
||||||
{
|
{
|
||||||
@ -956,6 +1003,7 @@ static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, qu
|
|||||||
{{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */
|
{{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */
|
||||||
{{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */
|
{{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/** HUF_selectDecoder() :
|
/** HUF_selectDecoder() :
|
||||||
* Tells which decoder is likely to decode faster,
|
* Tells which decoder is likely to decode faster,
|
||||||
@ -966,6 +1014,15 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize)
|
|||||||
{
|
{
|
||||||
assert(dstSize > 0);
|
assert(dstSize > 0);
|
||||||
assert(dstSize <= 128*1024);
|
assert(dstSize <= 128*1024);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)dstSize;
|
||||||
|
(void)cSrcSize;
|
||||||
|
return 0;
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)dstSize;
|
||||||
|
(void)cSrcSize;
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
/* decoder timing evaluation */
|
/* decoder timing evaluation */
|
||||||
{ U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */
|
{ U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */
|
||||||
U32 const D256 = (U32)(dstSize >> 8);
|
U32 const D256 = (U32)(dstSize >> 8);
|
||||||
@ -973,14 +1030,18 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize)
|
|||||||
U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256);
|
U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256);
|
||||||
DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, to reduce cache eviction */
|
DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, to reduce cache eviction */
|
||||||
return DTime1 < DTime0;
|
return DTime1 < DTime0;
|
||||||
} }
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
|
typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
|
||||||
|
|
||||||
size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
|
size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
|
||||||
{
|
{
|
||||||
|
#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
static const decompressionAlgo decompress[2] = { HUF_decompress4X1, HUF_decompress4X2 };
|
static const decompressionAlgo decompress[2] = { HUF_decompress4X1, HUF_decompress4X2 };
|
||||||
|
#endif
|
||||||
|
|
||||||
/* validation checks */
|
/* validation checks */
|
||||||
if (dstSize == 0) return ERROR(dstSize_tooSmall);
|
if (dstSize == 0) return ERROR(dstSize_tooSmall);
|
||||||
@ -989,7 +1050,17 @@ size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcS
|
|||||||
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
||||||
|
|
||||||
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 0);
|
||||||
|
return HUF_decompress4X1(dst, dstSize, cSrc, cSrcSize);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 1);
|
||||||
|
return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize);
|
||||||
|
#else
|
||||||
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1002,8 +1073,18 @@ size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const
|
|||||||
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
||||||
|
|
||||||
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 0);
|
||||||
|
return HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 1);
|
||||||
|
return HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize);
|
||||||
|
#else
|
||||||
return algoNb ? HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) :
|
return algoNb ? HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) :
|
||||||
HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) ;
|
HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) ;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1025,8 +1106,19 @@ size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst,
|
|||||||
if (cSrcSize == 0) return ERROR(corruption_detected);
|
if (cSrcSize == 0) return ERROR(corruption_detected);
|
||||||
|
|
||||||
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
||||||
return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize):
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 0);
|
||||||
|
return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 1);
|
||||||
|
return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
|
||||||
|
#else
|
||||||
|
return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
||||||
|
cSrcSize, workSpace, wkspSize):
|
||||||
HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
|
HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1041,10 +1133,22 @@ size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
|
|||||||
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
|
||||||
|
|
||||||
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 0);
|
||||||
|
return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
||||||
|
cSrcSize, workSpace, wkspSize);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 1);
|
||||||
|
return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
||||||
|
cSrcSize, workSpace, wkspSize);
|
||||||
|
#else
|
||||||
return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
||||||
cSrcSize, workSpace, wkspSize):
|
cSrcSize, workSpace, wkspSize):
|
||||||
HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc,
|
||||||
cSrcSize, workSpace, wkspSize);
|
cSrcSize, workSpace, wkspSize);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,10 +1164,21 @@ size_t HUF_decompress1X_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize,
|
|||||||
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
|
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
|
||||||
{
|
{
|
||||||
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 0);
|
||||||
|
return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 1);
|
||||||
|
return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#else
|
||||||
return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
|
return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
|
||||||
HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||||
size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
|
size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*) cSrc;
|
const BYTE* ip = (const BYTE*) cSrc;
|
||||||
@ -1075,12 +1190,23 @@ size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstS
|
|||||||
|
|
||||||
return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
|
return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
|
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
|
||||||
{
|
{
|
||||||
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
DTableDesc const dtd = HUF_getDTableDesc(DTable);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 0);
|
||||||
|
return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)dtd;
|
||||||
|
assert(dtd.tableType == 1);
|
||||||
|
return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#else
|
||||||
return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
|
return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
|
||||||
HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
|
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
|
||||||
@ -1090,7 +1216,17 @@ size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t ds
|
|||||||
if (cSrcSize == 0) return ERROR(corruption_detected);
|
if (cSrcSize == 0) return ERROR(corruption_detected);
|
||||||
|
|
||||||
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X1)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 0);
|
||||||
|
return HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
|
||||||
|
#elif defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
(void)algoNb;
|
||||||
|
assert(algoNb == 1);
|
||||||
|
return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
|
||||||
|
#else
|
||||||
return algoNb ? HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2) :
|
return algoNb ? HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2) :
|
||||||
HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
|
HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -954,9 +954,16 @@ ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
|
|||||||
ZSTD_STATIC_ASSERT(sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable) >= HUF_DECOMPRESS_WORKSPACE_SIZE);
|
ZSTD_STATIC_ASSERT(sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable) >= HUF_DECOMPRESS_WORKSPACE_SIZE);
|
||||||
{ void* const workspace = &entropy->LLTable; /* use fse tables as temporary workspace; implies fse tables are grouped together */
|
{ void* const workspace = &entropy->LLTable; /* use fse tables as temporary workspace; implies fse tables are grouped together */
|
||||||
size_t const workspaceSize = sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable);
|
size_t const workspaceSize = sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable);
|
||||||
|
#ifdef HUF_FORCE_DECOMPRESS_X1
|
||||||
|
/* in minimal huffman, we always use X1 variants */
|
||||||
|
size_t const hSize = HUF_readDTableX1_wksp(entropy->hufTable,
|
||||||
|
dictPtr, dictEnd - dictPtr,
|
||||||
|
workspace, workspaceSize);
|
||||||
|
#else
|
||||||
size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable,
|
size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable,
|
||||||
dictPtr, dictEnd - dictPtr,
|
dictPtr, dictEnd - dictPtr,
|
||||||
workspace, workspaceSize);
|
workspace, workspaceSize);
|
||||||
|
#endif
|
||||||
if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
|
if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
|
||||||
dictPtr += hSize;
|
dictPtr += hSize;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,18 @@
|
|||||||
#include "zstd_ddict.h" /* ZSTD_DDictDictContent */
|
#include "zstd_ddict.h" /* ZSTD_DDictDictContent */
|
||||||
#include "zstd_decompress_block.h"
|
#include "zstd_decompress_block.h"
|
||||||
|
|
||||||
|
/*_*******************************************************
|
||||||
|
* Macros
|
||||||
|
**********************************************************/
|
||||||
|
|
||||||
|
/* These two optional macros force the use one way or another of the two
|
||||||
|
* ZSTD_decompressSequences implementations. You can't force in both directions
|
||||||
|
* at the same time.
|
||||||
|
*/
|
||||||
|
#if defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
|
||||||
|
defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
|
||||||
|
#error "Cannot force the use of the short and the long ZSTD_decompressSequences variants!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*_*******************************************************
|
/*_*******************************************************
|
||||||
@ -83,6 +95,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|||||||
U32 singleStream=0;
|
U32 singleStream=0;
|
||||||
U32 const lhlCode = (istart[0] >> 2) & 3;
|
U32 const lhlCode = (istart[0] >> 2) & 3;
|
||||||
U32 const lhc = MEM_readLE32(istart);
|
U32 const lhc = MEM_readLE32(istart);
|
||||||
|
size_t hufSuccess;
|
||||||
switch(lhlCode)
|
switch(lhlCode)
|
||||||
{
|
{
|
||||||
case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
|
case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
|
||||||
@ -113,16 +126,38 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
|
|||||||
PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable));
|
PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HUF_isError((litEncType==set_repeat) ?
|
if (litEncType==set_repeat) {
|
||||||
( singleStream ?
|
if (singleStream) {
|
||||||
HUF_decompress1X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) :
|
hufSuccess = HUF_decompress1X_usingDTable_bmi2(
|
||||||
HUF_decompress4X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) ) :
|
dctx->litBuffer, litSize, istart+lhSize, litCSize,
|
||||||
( singleStream ?
|
dctx->HUFptr, dctx->bmi2);
|
||||||
HUF_decompress1X1_DCtx_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
|
} else {
|
||||||
dctx->workspace, sizeof(dctx->workspace), dctx->bmi2) :
|
hufSuccess = HUF_decompress4X_usingDTable_bmi2(
|
||||||
HUF_decompress4X_hufOnly_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
|
dctx->litBuffer, litSize, istart+lhSize, litCSize,
|
||||||
dctx->workspace, sizeof(dctx->workspace), dctx->bmi2))))
|
dctx->HUFptr, dctx->bmi2);
|
||||||
return ERROR(corruption_detected);
|
}
|
||||||
|
} else {
|
||||||
|
if (singleStream) {
|
||||||
|
#if defined(HUF_FORCE_DECOMPRESS_X2)
|
||||||
|
hufSuccess = HUF_decompress1X_DCtx_wksp(
|
||||||
|
dctx->entropy.hufTable, dctx->litBuffer, litSize,
|
||||||
|
istart+lhSize, litCSize, dctx->workspace,
|
||||||
|
sizeof(dctx->workspace));
|
||||||
|
#else
|
||||||
|
hufSuccess = HUF_decompress1X1_DCtx_wksp_bmi2(
|
||||||
|
dctx->entropy.hufTable, dctx->litBuffer, litSize,
|
||||||
|
istart+lhSize, litCSize, dctx->workspace,
|
||||||
|
sizeof(dctx->workspace), dctx->bmi2);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
hufSuccess = HUF_decompress4X_hufOnly_wksp_bmi2(
|
||||||
|
dctx->entropy.hufTable, dctx->litBuffer, litSize,
|
||||||
|
istart+lhSize, litCSize, dctx->workspace,
|
||||||
|
sizeof(dctx->workspace), dctx->bmi2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HUF_isError(hufSuccess)) return ERROR(corruption_detected);
|
||||||
|
|
||||||
dctx->litPtr = dctx->litBuffer;
|
dctx->litPtr = dctx->litBuffer;
|
||||||
dctx->litSize = litSize;
|
dctx->litSize = litSize;
|
||||||
@ -775,6 +810,7 @@ ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
|
|||||||
|
|
||||||
typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
|
typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
|
||||||
FORCE_INLINE_TEMPLATE seq_t
|
FORCE_INLINE_TEMPLATE seq_t
|
||||||
ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
|
ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
|
||||||
{
|
{
|
||||||
@ -914,9 +950,11 @@ ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
|
|||||||
{
|
{
|
||||||
return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
|
||||||
FORCE_INLINE_TEMPLATE seq_t
|
FORCE_INLINE_TEMPLATE seq_t
|
||||||
ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
|
ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
|
||||||
{
|
{
|
||||||
@ -1081,11 +1119,13 @@ ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
|
|||||||
{
|
{
|
||||||
return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if DYNAMIC_BMI2
|
#if DYNAMIC_BMI2
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
|
||||||
static TARGET_ATTRIBUTE("bmi2") size_t
|
static TARGET_ATTRIBUTE("bmi2") size_t
|
||||||
ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
|
ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
|
||||||
void* dst, size_t maxDstSize,
|
void* dst, size_t maxDstSize,
|
||||||
@ -1094,7 +1134,9 @@ ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
|
|||||||
{
|
{
|
||||||
return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
|
||||||
static TARGET_ATTRIBUTE("bmi2") size_t
|
static TARGET_ATTRIBUTE("bmi2") size_t
|
||||||
ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
|
ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
|
||||||
void* dst, size_t maxDstSize,
|
void* dst, size_t maxDstSize,
|
||||||
@ -1103,8 +1145,9 @@ ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
|
|||||||
{
|
{
|
||||||
return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
|
||||||
|
|
||||||
#endif
|
#endif /* DYNAMIC_BMI2 */
|
||||||
|
|
||||||
typedef size_t (*ZSTD_decompressSequences_t)(
|
typedef size_t (*ZSTD_decompressSequences_t)(
|
||||||
ZSTD_DCtx* dctx,
|
ZSTD_DCtx* dctx,
|
||||||
@ -1112,6 +1155,7 @@ typedef size_t (*ZSTD_decompressSequences_t)(
|
|||||||
const void* seqStart, size_t seqSize, int nbSeq,
|
const void* seqStart, size_t seqSize, int nbSeq,
|
||||||
const ZSTD_longOffset_e isLongOffset);
|
const ZSTD_longOffset_e isLongOffset);
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
|
||||||
static size_t
|
static size_t
|
||||||
ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
|
ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
|
||||||
const void* seqStart, size_t seqSize, int nbSeq,
|
const void* seqStart, size_t seqSize, int nbSeq,
|
||||||
@ -1125,8 +1169,10 @@ ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
|
|||||||
#endif
|
#endif
|
||||||
return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
|
||||||
/* ZSTD_decompressSequencesLong() :
|
/* ZSTD_decompressSequencesLong() :
|
||||||
* decompression function triggered when a minimum share of offsets is considered "long",
|
* decompression function triggered when a minimum share of offsets is considered "long",
|
||||||
* aka out of cache.
|
* aka out of cache.
|
||||||
@ -1146,9 +1192,12 @@ ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
|
|||||||
#endif
|
#endif
|
||||||
return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
|
||||||
}
|
}
|
||||||
|
#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
|
||||||
|
!defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
|
||||||
/* ZSTD_getLongOffsetsShare() :
|
/* ZSTD_getLongOffsetsShare() :
|
||||||
* condition : offTable must be valid
|
* condition : offTable must be valid
|
||||||
* @return : "share" of long offsets (arbitrarily defined as > (1<<23))
|
* @return : "share" of long offsets (arbitrarily defined as > (1<<23))
|
||||||
@ -1173,6 +1222,7 @@ ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
|
|||||||
|
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
@ -1201,13 +1251,23 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Build Decoding Tables */
|
/* Build Decoding Tables */
|
||||||
{ int usePrefetchDecoder = dctx->ddictIsCold;
|
{
|
||||||
|
/* These macros control at build-time which decompressor implementation
|
||||||
|
* we use. If neither is defined, we do some inspection and dispatch at
|
||||||
|
* runtime.
|
||||||
|
*/
|
||||||
|
#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
|
||||||
|
!defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
|
||||||
|
int usePrefetchDecoder = dctx->ddictIsCold;
|
||||||
|
#endif
|
||||||
int nbSeq;
|
int nbSeq;
|
||||||
size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
|
size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
|
||||||
if (ZSTD_isError(seqHSize)) return seqHSize;
|
if (ZSTD_isError(seqHSize)) return seqHSize;
|
||||||
ip += seqHSize;
|
ip += seqHSize;
|
||||||
srcSize -= seqHSize;
|
srcSize -= seqHSize;
|
||||||
|
|
||||||
|
#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
|
||||||
|
!defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
|
||||||
if ( !usePrefetchDecoder
|
if ( !usePrefetchDecoder
|
||||||
&& (!frame || (dctx->fParams.windowSize > (1<<24)))
|
&& (!frame || (dctx->fParams.windowSize > (1<<24)))
|
||||||
&& (nbSeq>ADVANCED_SEQS) ) { /* could probably use a larger nbSeq limit */
|
&& (nbSeq>ADVANCED_SEQS) ) { /* could probably use a larger nbSeq limit */
|
||||||
@ -1215,14 +1275,22 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
|||||||
U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
|
U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
|
||||||
usePrefetchDecoder = (shareLongOffsets >= minShare);
|
usePrefetchDecoder = (shareLongOffsets >= minShare);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
dctx->ddictIsCold = 0;
|
dctx->ddictIsCold = 0;
|
||||||
|
|
||||||
|
#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
|
||||||
|
!defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
|
||||||
if (usePrefetchDecoder)
|
if (usePrefetchDecoder)
|
||||||
|
#endif
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
|
||||||
return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
|
||||||
/* else */
|
/* else */
|
||||||
return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
|
return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user