zstdlib 0.8.0-x86-mingw32 → 0.9.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +10 -0
- data/README.md +7 -1
- data/Rakefile +38 -8
- data/ext/{zstdlib → zstdlib_c}/extconf.rb +10 -5
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.2/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.3/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.4/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.5/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.6/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.7/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-3.0/zstdlib.c +2 -2
- data/ext/zstdlib_c/ruby/zlib-3.1/zstdlib.c +5076 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/adler32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/compress.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzclose.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzguts.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzlib.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzread.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzwrite.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/infback.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffixed.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/uncompr.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zconf.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zlib.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib.mk +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper/zlibwrapper.c +1 -5
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper.mk +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/bitstream.h +24 -9
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/compiler.h +89 -43
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/cpu.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/debug.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/debug.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/entropy_common.c +11 -5
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/error_private.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/error_private.h +79 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/fse.h +2 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/fse_decompress.c +1 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/huf.h +24 -22
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/mem.h +18 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/pool.c +11 -6
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/pool.h +2 -2
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/portability_macros.h +137 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/threading.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/threading.h +0 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.c +24 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.h +5686 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_common.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_deps.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_internal.h +95 -92
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_trace.h +12 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/clevels.h +134 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/fse_compress.c +63 -27
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/huf_compress.c +537 -104
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress.c +307 -373
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_internal.h +174 -83
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.c +4 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.h +3 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.c +15 -14
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_superblock.c +4 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_superblock.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_cwksp.h +41 -27
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.c +295 -120
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.c +309 -130
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_lazy.c +482 -562
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_lazy.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.c +9 -7
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.h +1 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm_geartab.h +4 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.c +249 -148
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstdmt_compress.c +76 -38
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/compress/zstdmt_compress.h +4 -1
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/huf_decompress.c +727 -189
- data/ext/zstdlib_c/zstd-1.5.2/lib/decompress/huf_decompress_amd64.S +585 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress.c +85 -22
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_block.c +744 -220
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_block.h +8 -2
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_internal.h +34 -3
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zdict.h +4 -4
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zstd.h +179 -136
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/lib/zstd_errors.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzclose.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzcompatibility.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzguts.h +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzlib.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzread.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzwrite.c +0 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.c +7 -0
- data/ext/{zstdlib/zstd-1.5.0 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.h +0 -0
- data/ext/zstdlib_c/zstd.mk +15 -0
- data/lib/2.4/zstdlib_c.so +0 -0
- data/lib/2.5/zstdlib_c.so +0 -0
- data/lib/2.6/zstdlib_c.so +0 -0
- data/lib/2.7/zstdlib_c.so +0 -0
- data/lib/3.0/zstdlib_c.so +0 -0
- data/lib/3.1/zstdlib_c.so +0 -0
- data/lib/zstdlib.rb +2 -2
- metadata +125 -121
- data/ext/zstdlib/zstd-1.5.0/lib/common/xxhash.c +0 -824
- data/ext/zstdlib/zstd-1.5.0/lib/common/xxhash.h +0 -285
- data/ext/zstdlib/zstd.mk +0 -14
- data/lib/2.2/zstdlib.so +0 -0
- data/lib/2.3/zstdlib.so +0 -0
- data/lib/2.4/zstdlib.so +0 -0
- data/lib/2.5/zstdlib.so +0 -0
- data/lib/2.6/zstdlib.so +0 -0
- data/lib/2.7/zstdlib.so +0 -0
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,12 +1,8 @@
|
|
1
1
|
/* Additional required wrappers not covered by zstd's zlibwrapper */
|
2
2
|
|
3
3
|
#include <zlib.h>
|
4
|
-
#include "zstd_zlibwrapper.h"
|
5
4
|
|
6
|
-
|
7
|
-
{
|
8
|
-
return zError(a);
|
9
|
-
}
|
5
|
+
#include "zstd_zlibwrapper.h"
|
10
6
|
|
11
7
|
ZEXTERN int ZEXPORT z_inflateSyncPoint OF((z_streamp a))
|
12
8
|
{
|
File without changes
|
@@ -143,10 +143,16 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
143
143
|
{
|
144
144
|
# if defined(_MSC_VER) /* Visual */
|
145
145
|
# if STATIC_BMI2 == 1
|
146
|
-
|
146
|
+
return _lzcnt_u32(val) ^ 31;
|
147
147
|
# else
|
148
|
-
|
149
|
-
|
148
|
+
if (val != 0) {
|
149
|
+
unsigned long r;
|
150
|
+
_BitScanReverse(&r, val);
|
151
|
+
return (unsigned)r;
|
152
|
+
} else {
|
153
|
+
/* Should not reach this code path */
|
154
|
+
__assume(0);
|
155
|
+
}
|
150
156
|
# endif
|
151
157
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
152
158
|
return __builtin_clz (val) ^ 31;
|
@@ -293,22 +299,22 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
293
299
|
switch(srcSize)
|
294
300
|
{
|
295
301
|
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);
|
296
|
-
|
302
|
+
ZSTD_FALLTHROUGH;
|
297
303
|
|
298
304
|
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);
|
299
|
-
|
305
|
+
ZSTD_FALLTHROUGH;
|
300
306
|
|
301
307
|
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);
|
302
|
-
|
308
|
+
ZSTD_FALLTHROUGH;
|
303
309
|
|
304
310
|
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
305
|
-
|
311
|
+
ZSTD_FALLTHROUGH;
|
306
312
|
|
307
313
|
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
308
|
-
|
314
|
+
ZSTD_FALLTHROUGH;
|
309
315
|
|
310
316
|
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
311
|
-
|
317
|
+
ZSTD_FALLTHROUGH;
|
312
318
|
|
313
319
|
default: break;
|
314
320
|
}
|
@@ -332,7 +338,16 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c
|
|
332
338
|
U32 const regMask = sizeof(bitContainer)*8 - 1;
|
333
339
|
/* if start > regMask, bitstream is corrupted, and result is undefined */
|
334
340
|
assert(nbBits < BIT_MASK_SIZE);
|
341
|
+
/* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better
|
342
|
+
* than accessing memory. When bmi2 instruction is not present, we consider
|
343
|
+
* such cpus old (pre-Haswell, 2013) and their performance is not of that
|
344
|
+
* importance.
|
345
|
+
*/
|
346
|
+
#if defined(__x86_64__) || defined(_M_X86)
|
347
|
+
return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1);
|
348
|
+
#else
|
335
349
|
return (bitContainer >> (start & regMask)) & BIT_mask[nbBits];
|
350
|
+
#endif
|
336
351
|
}
|
337
352
|
|
338
353
|
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
|
@@ -11,6 +11,8 @@
|
|
11
11
|
#ifndef ZSTD_COMPILER_H
|
12
12
|
#define ZSTD_COMPILER_H
|
13
13
|
|
14
|
+
#include "portability_macros.h"
|
15
|
+
|
14
16
|
/*-*******************************************************
|
15
17
|
* Compiler specifics
|
16
18
|
*********************************************************/
|
@@ -40,7 +42,7 @@
|
|
40
42
|
|
41
43
|
/**
|
42
44
|
On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC).
|
43
|
-
This
|
45
|
+
This explicitly marks such functions as __cdecl so that the code will still compile
|
44
46
|
if a CC other than __cdecl has been made the default.
|
45
47
|
*/
|
46
48
|
#if defined(_MSC_VER)
|
@@ -92,29 +94,17 @@
|
|
92
94
|
|
93
95
|
|
94
96
|
/* target attribute */
|
95
|
-
#ifndef __has_attribute
|
96
|
-
#define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */
|
97
|
-
#endif
|
98
97
|
#if defined(__GNUC__) || defined(__ICCARM__)
|
99
98
|
# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target)))
|
100
99
|
#else
|
101
100
|
# define TARGET_ATTRIBUTE(target)
|
102
101
|
#endif
|
103
102
|
|
104
|
-
/*
|
105
|
-
*
|
103
|
+
/* Target attribute for BMI2 dynamic dispatch.
|
104
|
+
* Enable lzcnt, bmi, and bmi2.
|
105
|
+
* We test for bmi1 & bmi2. lzcnt is included in bmi1.
|
106
106
|
*/
|
107
|
-
#
|
108
|
-
#if ((defined(__clang__) && __has_attribute(__target__)) \
|
109
|
-
|| (defined(__GNUC__) \
|
110
|
-
&& (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \
|
111
|
-
&& (defined(__x86_64__) || defined(_M_X86)) \
|
112
|
-
&& !defined(__BMI2__)
|
113
|
-
# define DYNAMIC_BMI2 1
|
114
|
-
#else
|
115
|
-
# define DYNAMIC_BMI2 0
|
116
|
-
#endif
|
117
|
-
#endif
|
107
|
+
#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2")
|
118
108
|
|
119
109
|
/* prefetch
|
120
110
|
* can be disabled, by declaring NO_PREFETCH build macro */
|
@@ -150,8 +140,9 @@
|
|
150
140
|
}
|
151
141
|
|
152
142
|
/* vectorization
|
153
|
-
* older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax
|
154
|
-
|
143
|
+
* older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax,
|
144
|
+
* and some compilers, like Intel ICC and MCST LCC, do not support it at all. */
|
145
|
+
#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__)
|
155
146
|
# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5)
|
156
147
|
# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
|
157
148
|
# else
|
@@ -197,25 +188,91 @@
|
|
197
188
|
#define STATIC_BMI2 0
|
198
189
|
#endif
|
199
190
|
|
200
|
-
/*
|
201
|
-
#
|
202
|
-
#
|
191
|
+
/* compile time determination of SIMD support */
|
192
|
+
#if !defined(ZSTD_NO_INTRINSICS)
|
193
|
+
# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2))
|
194
|
+
# define ZSTD_ARCH_X86_SSE2
|
195
|
+
# endif
|
196
|
+
# if defined(__ARM_NEON) || defined(_M_ARM64)
|
197
|
+
# define ZSTD_ARCH_ARM_NEON
|
198
|
+
# endif
|
199
|
+
#
|
200
|
+
# if defined(ZSTD_ARCH_X86_SSE2)
|
201
|
+
# include <emmintrin.h>
|
202
|
+
# elif defined(ZSTD_ARCH_ARM_NEON)
|
203
|
+
# include <arm_neon.h>
|
204
|
+
# endif
|
203
205
|
#endif
|
204
206
|
|
205
|
-
/*
|
206
|
-
#
|
207
|
-
#
|
207
|
+
/* C-language Attributes are added in C23. */
|
208
|
+
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute)
|
209
|
+
# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)
|
210
|
+
#else
|
211
|
+
# define ZSTD_HAS_C_ATTRIBUTE(x) 0
|
208
212
|
#endif
|
209
213
|
|
210
|
-
/*
|
211
|
-
|
212
|
-
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
214
|
+
/* Only use C++ attributes in C++. Some compilers report support for C++
|
215
|
+
* attributes when compiling with C.
|
216
|
+
*/
|
217
|
+
#if defined(__cplusplus) && defined(__has_cpp_attribute)
|
218
|
+
# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
|
219
|
+
#else
|
220
|
+
# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0
|
217
221
|
#endif
|
218
222
|
|
223
|
+
/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute.
|
224
|
+
* - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough
|
225
|
+
* - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough
|
226
|
+
* - Else: __attribute__((__fallthrough__))
|
227
|
+
*/
|
228
|
+
#ifndef ZSTD_FALLTHROUGH
|
229
|
+
# if ZSTD_HAS_C_ATTRIBUTE(fallthrough)
|
230
|
+
# define ZSTD_FALLTHROUGH [[fallthrough]]
|
231
|
+
# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough)
|
232
|
+
# define ZSTD_FALLTHROUGH [[fallthrough]]
|
233
|
+
# elif __has_attribute(__fallthrough__)
|
234
|
+
/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon
|
235
|
+
* gcc complains about: a label can only be part of a statement and a declaration is not a statement.
|
236
|
+
*/
|
237
|
+
# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__))
|
238
|
+
# else
|
239
|
+
# define ZSTD_FALLTHROUGH
|
240
|
+
# endif
|
241
|
+
#endif
|
242
|
+
|
243
|
+
/*-**************************************************************
|
244
|
+
* Alignment check
|
245
|
+
*****************************************************************/
|
246
|
+
|
247
|
+
/* this test was initially positioned in mem.h,
|
248
|
+
* but this file is removed (or replaced) for linux kernel
|
249
|
+
* so it's now hosted in compiler.h,
|
250
|
+
* which remains valid for both user & kernel spaces.
|
251
|
+
*/
|
252
|
+
|
253
|
+
#ifndef ZSTD_ALIGNOF
|
254
|
+
# if defined(__GNUC__) || defined(_MSC_VER)
|
255
|
+
/* covers gcc, clang & MSVC */
|
256
|
+
/* note : this section must come first, before C11,
|
257
|
+
* due to a limitation in the kernel source generator */
|
258
|
+
# define ZSTD_ALIGNOF(T) __alignof(T)
|
259
|
+
|
260
|
+
# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
261
|
+
/* C11 support */
|
262
|
+
# include <stdalign.h>
|
263
|
+
# define ZSTD_ALIGNOF(T) alignof(T)
|
264
|
+
|
265
|
+
# else
|
266
|
+
/* No known support for alignof() - imperfect backup */
|
267
|
+
# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T))
|
268
|
+
|
269
|
+
# endif
|
270
|
+
#endif /* ZSTD_ALIGNOF */
|
271
|
+
|
272
|
+
/*-**************************************************************
|
273
|
+
* Sanitizer
|
274
|
+
*****************************************************************/
|
275
|
+
|
219
276
|
#if ZSTD_MEMORY_SANITIZER
|
220
277
|
/* Not all platforms that support msan provide sanitizers/msan_interface.h.
|
221
278
|
* We therefore declare the functions we need ourselves, rather than trying to
|
@@ -237,17 +294,6 @@ void __msan_poison(const volatile void *a, size_t size);
|
|
237
294
|
intptr_t __msan_test_shadow(const volatile void *x, size_t size);
|
238
295
|
#endif
|
239
296
|
|
240
|
-
/* detects whether we are being compiled under asan */
|
241
|
-
#ifndef ZSTD_ADDRESS_SANITIZER
|
242
|
-
# if __has_feature(address_sanitizer)
|
243
|
-
# define ZSTD_ADDRESS_SANITIZER 1
|
244
|
-
# elif defined(__SANITIZE_ADDRESS__)
|
245
|
-
# define ZSTD_ADDRESS_SANITIZER 1
|
246
|
-
# else
|
247
|
-
# define ZSTD_ADDRESS_SANITIZER 0
|
248
|
-
# endif
|
249
|
-
#endif
|
250
|
-
|
251
297
|
#if ZSTD_ADDRESS_SANITIZER
|
252
298
|
/* Not all platforms that support asan provide sanitizers/asan_interface.h.
|
253
299
|
* We therefore declare the functions we need ourselves, rather than trying to
|
File without changes
|
File without changes
|
File without changes
|
@@ -43,8 +43,14 @@ static U32 FSE_ctz(U32 val)
|
|
43
43
|
assert(val != 0);
|
44
44
|
{
|
45
45
|
# if defined(_MSC_VER) /* Visual */
|
46
|
-
|
47
|
-
|
46
|
+
if (val != 0) {
|
47
|
+
unsigned long r;
|
48
|
+
_BitScanForward(&r, val);
|
49
|
+
return (unsigned)r;
|
50
|
+
} else {
|
51
|
+
/* Should not reach this code path */
|
52
|
+
__assume(0);
|
53
|
+
}
|
48
54
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
49
55
|
return __builtin_ctz(val);
|
50
56
|
# elif defined(__ICCARM__) /* IAR Intrinsic */
|
@@ -217,7 +223,7 @@ static size_t FSE_readNCount_body_default(
|
|
217
223
|
}
|
218
224
|
|
219
225
|
#if DYNAMIC_BMI2
|
220
|
-
|
226
|
+
BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2(
|
221
227
|
short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
|
222
228
|
const void* headerBuffer, size_t hbSize)
|
223
229
|
{
|
@@ -299,7 +305,7 @@ HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
299
305
|
ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32));
|
300
306
|
weightTotal = 0;
|
301
307
|
{ U32 n; for (n=0; n<oSize; n++) {
|
302
|
-
if (huffWeight[n]
|
308
|
+
if (huffWeight[n] > HUF_TABLELOG_MAX) return ERROR(corruption_detected);
|
303
309
|
rankStats[huffWeight[n]]++;
|
304
310
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
305
311
|
} }
|
@@ -337,7 +343,7 @@ static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* r
|
|
337
343
|
}
|
338
344
|
|
339
345
|
#if DYNAMIC_BMI2
|
340
|
-
static
|
346
|
+
static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
341
347
|
U32* nbSymbolsPtr, U32* tableLogPtr,
|
342
348
|
const void* src, size_t srcSize,
|
343
349
|
void* workSpace, size_t wkspSize)
|
File without changes
|
@@ -22,6 +22,8 @@ extern "C" {
|
|
22
22
|
* Dependencies
|
23
23
|
******************************************/
|
24
24
|
#include "../zstd_errors.h" /* enum list */
|
25
|
+
#include "compiler.h"
|
26
|
+
#include "debug.h"
|
25
27
|
#include "zstd_deps.h" /* size_t */
|
26
28
|
|
27
29
|
|
@@ -73,6 +75,83 @@ ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
73
75
|
return ERR_getErrorString(ERR_getErrorCode(code));
|
74
76
|
}
|
75
77
|
|
78
|
+
/**
|
79
|
+
* Ignore: this is an internal helper.
|
80
|
+
*
|
81
|
+
* This is a helper function to help force C99-correctness during compilation.
|
82
|
+
* Under strict compilation modes, variadic macro arguments can't be empty.
|
83
|
+
* However, variadic function arguments can be. Using a function therefore lets
|
84
|
+
* us statically check that at least one (string) argument was passed,
|
85
|
+
* independent of the compilation flags.
|
86
|
+
*/
|
87
|
+
static INLINE_KEYWORD UNUSED_ATTR
|
88
|
+
void _force_has_format_string(const char *format, ...) {
|
89
|
+
(void)format;
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Ignore: this is an internal helper.
|
94
|
+
*
|
95
|
+
* We want to force this function invocation to be syntactically correct, but
|
96
|
+
* we don't want to force runtime evaluation of its arguments.
|
97
|
+
*/
|
98
|
+
#define _FORCE_HAS_FORMAT_STRING(...) \
|
99
|
+
if (0) { \
|
100
|
+
_force_has_format_string(__VA_ARGS__); \
|
101
|
+
}
|
102
|
+
|
103
|
+
#define ERR_QUOTE(str) #str
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Return the specified error if the condition evaluates to true.
|
107
|
+
*
|
108
|
+
* In debug modes, prints additional information.
|
109
|
+
* In order to do that (particularly, printing the conditional that failed),
|
110
|
+
* this can't just wrap RETURN_ERROR().
|
111
|
+
*/
|
112
|
+
#define RETURN_ERROR_IF(cond, err, ...) \
|
113
|
+
if (cond) { \
|
114
|
+
RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
|
115
|
+
__FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \
|
116
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
117
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
118
|
+
RAWLOG(3, "\n"); \
|
119
|
+
return ERROR(err); \
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* Unconditionally return the specified error.
|
124
|
+
*
|
125
|
+
* In debug modes, prints additional information.
|
126
|
+
*/
|
127
|
+
#define RETURN_ERROR(err, ...) \
|
128
|
+
do { \
|
129
|
+
RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
|
130
|
+
__FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \
|
131
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
132
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
133
|
+
RAWLOG(3, "\n"); \
|
134
|
+
return ERROR(err); \
|
135
|
+
} while(0);
|
136
|
+
|
137
|
+
/**
|
138
|
+
* If the provided expression evaluates to an error code, returns that error code.
|
139
|
+
*
|
140
|
+
* In debug modes, prints additional information.
|
141
|
+
*/
|
142
|
+
#define FORWARD_IF_ERROR(err, ...) \
|
143
|
+
do { \
|
144
|
+
size_t const err_code = (err); \
|
145
|
+
if (ERR_isError(err_code)) { \
|
146
|
+
RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
|
147
|
+
__FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \
|
148
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
149
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
150
|
+
RAWLOG(3, "\n"); \
|
151
|
+
return err_code; \
|
152
|
+
} \
|
153
|
+
} while(0);
|
154
|
+
|
76
155
|
#if defined (__cplusplus)
|
77
156
|
}
|
78
157
|
#endif
|
@@ -336,8 +336,9 @@ size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
|
|
336
336
|
/* FSE_buildCTable_wksp() :
|
337
337
|
* Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
|
338
338
|
* `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`.
|
339
|
+
* See FSE_buildCTable_wksp() for breakdown of workspace usage.
|
339
340
|
*/
|
340
|
-
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (maxSymbolValue + 2 + (1ull << (tableLog
|
341
|
+
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */)
|
341
342
|
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog))
|
342
343
|
size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
343
344
|
|
@@ -365,7 +365,7 @@ static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, co
|
|
365
365
|
}
|
366
366
|
|
367
367
|
#if DYNAMIC_BMI2
|
368
|
-
|
368
|
+
BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize)
|
369
369
|
{
|
370
370
|
return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1);
|
371
371
|
}
|
@@ -89,9 +89,9 @@ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity,
|
|
89
89
|
|
90
90
|
/** HUF_compress4X_wksp() :
|
91
91
|
* Same as HUF_compress2(), but uses externally allocated `workSpace`.
|
92
|
-
* `workspace` must
|
93
|
-
#define HUF_WORKSPACE_SIZE ((
|
94
|
-
#define
|
92
|
+
* `workspace` must be at least as large as HUF_WORKSPACE_SIZE */
|
93
|
+
#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */)
|
94
|
+
#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64))
|
95
95
|
HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
96
96
|
const void* src, size_t srcSize,
|
97
97
|
unsigned maxSymbolValue, unsigned tableLog,
|
@@ -116,11 +116,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
|
116
116
|
|
117
117
|
|
118
118
|
/* *** Constants *** */
|
119
|
-
#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to
|
119
|
+
#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */
|
120
120
|
#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */
|
121
121
|
#define HUF_SYMBOLVALUE_MAX 255
|
122
122
|
|
123
|
-
#define HUF_TABLELOG_ABSOLUTEMAX
|
123
|
+
#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
|
124
124
|
#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
|
125
125
|
# error "HUF_TABLELOG_MAX is too large !"
|
126
126
|
#endif
|
@@ -136,15 +136,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
|
136
136
|
|
137
137
|
/* static allocation of HUF's Compression Table */
|
138
138
|
/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
}; /* typedef'd to HUF_CElt */
|
143
|
-
typedef struct HUF_CElt_s HUF_CElt; /* consider it an incomplete type */
|
144
|
-
#define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1) /* Use tables of U32, for proper alignment */
|
145
|
-
#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32))
|
139
|
+
typedef size_t HUF_CElt; /* consider it an incomplete type */
|
140
|
+
#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */
|
141
|
+
#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t))
|
146
142
|
#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
|
147
|
-
HUF_CElt name[
|
143
|
+
HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */
|
148
144
|
|
149
145
|
/* static allocation of HUF's DTable */
|
150
146
|
typedef U32 HUF_DTable;
|
@@ -194,6 +190,7 @@ size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSym
|
|
194
190
|
size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog);
|
195
191
|
size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize);
|
196
192
|
size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
193
|
+
size_t HUF_compress4X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2);
|
197
194
|
size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
|
198
195
|
int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
|
199
196
|
|
@@ -206,12 +203,13 @@ typedef enum {
|
|
206
203
|
* Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
|
207
204
|
* If it uses hufTable it does not modify hufTable or repeat.
|
208
205
|
* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
|
209
|
-
* If preferRepeat then the old table will always be used if valid.
|
206
|
+
* If preferRepeat then the old table will always be used if valid.
|
207
|
+
* If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */
|
210
208
|
size_t HUF_compress4X_repeat(void* dst, size_t dstSize,
|
211
209
|
const void* src, size_t srcSize,
|
212
210
|
unsigned maxSymbolValue, unsigned tableLog,
|
213
211
|
void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */
|
214
|
-
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
212
|
+
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible);
|
215
213
|
|
216
214
|
/** HUF_buildCTable_wksp() :
|
217
215
|
* Same as HUF_buildCTable(), but using externally allocated scratch buffer.
|
@@ -249,11 +247,10 @@ size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize,
|
|
249
247
|
* Loading a CTable saved with HUF_writeCTable() */
|
250
248
|
size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights);
|
251
249
|
|
252
|
-
/**
|
250
|
+
/** HUF_getNbBitsFromCTable() :
|
253
251
|
* Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX
|
254
|
-
* Note 1 : is not inlined, as HUF_CElt definition is private
|
255
|
-
|
256
|
-
U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue);
|
252
|
+
* Note 1 : is not inlined, as HUF_CElt definition is private */
|
253
|
+
U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue);
|
257
254
|
|
258
255
|
/*
|
259
256
|
* HUF_decompress() does the following:
|
@@ -305,18 +302,20 @@ size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* c
|
|
305
302
|
/* ====================== */
|
306
303
|
|
307
304
|
size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
308
|
-
size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least
|
305
|
+
size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U64 U64 */
|
309
306
|
size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
307
|
+
size_t HUF_compress1X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2);
|
310
308
|
/** HUF_compress1X_repeat() :
|
311
309
|
* Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
|
312
310
|
* If it uses hufTable it does not modify hufTable or repeat.
|
313
311
|
* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
|
314
|
-
* If preferRepeat then the old table will always be used if valid.
|
312
|
+
* If preferRepeat then the old table will always be used if valid.
|
313
|
+
* If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */
|
315
314
|
size_t HUF_compress1X_repeat(void* dst, size_t dstSize,
|
316
315
|
const void* src, size_t srcSize,
|
317
316
|
unsigned maxSymbolValue, unsigned tableLog,
|
318
317
|
void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */
|
319
|
-
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
318
|
+
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible);
|
320
319
|
|
321
320
|
size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
322
321
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
@@ -354,6 +353,9 @@ size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t ds
|
|
354
353
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
355
354
|
size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2);
|
356
355
|
#endif
|
356
|
+
#ifndef HUF_FORCE_DECOMPRESS_X1
|
357
|
+
size_t HUF_readDTableX2_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2);
|
358
|
+
#endif
|
357
359
|
|
358
360
|
#endif /* HUF_STATIC_LINKING_ONLY */
|
359
361
|
|