zstdlib 0.14.0-x86-mingw32 → 0.15.0-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +5 -0
- data/ext/zstdlib_c/extconf.rb +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/bits.h +92 -87
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/bitstream.h +26 -29
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/compiler.h +36 -22
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/cpu.h +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/debug.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/error_private.c +1 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/error_private.h +0 -10
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/fse.h +2 -17
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/fse_decompress.c +2 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/huf.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/mem.h +7 -11
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/pool.h +0 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/portability_macros.h +22 -9
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/threading.h +0 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/xxhash.h +93 -19
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_deps.h +12 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_internal.h +1 -69
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_trace.h +5 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/hist.c +10 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/hist.h +7 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress.c +1057 -367
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_internal.h +227 -125
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_literals.c +1 -1
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_sequences.c +7 -7
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_sequences.h +7 -6
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_superblock.c +17 -17
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_cwksp.h +41 -24
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_double_fast.c +58 -50
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_double_fast.h +4 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_fast.c +91 -74
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_fast.h +4 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_lazy.c +64 -64
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_lazy.h +30 -39
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm.c +48 -33
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm.h +6 -14
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_opt.c +55 -51
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_opt.h +8 -16
- data/ext/zstdlib_c/zstd-1.5.7/lib/compress/zstd_preSplit.c +238 -0
- data/ext/zstdlib_c/zstd-1.5.7/lib/compress/zstd_preSplit.h +33 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstdmt_compress.c +134 -93
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstdmt_compress.h +4 -15
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/huf_decompress_amd64.S +10 -3
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress.c +14 -11
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_block.c +6 -12
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_internal.h +5 -5
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zdict.h +15 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zstd.h +241 -132
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/zstd_errors.h +1 -8
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzwrite.c +2 -1
- 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/3.2/zstdlib_c.so +0 -0
- data/lib/3.3/zstdlib_c.so +0 -0
- data/lib/3.4/zstdlib_c.so +0 -0
- metadata +75 -73
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/allocations.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/debug.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/entropy_common.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/pool.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/threading.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/xxhash.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/common/zstd_common.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/clevels.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/fse_compress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/huf_compress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_literals.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_compress_superblock.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/compress/zstd_ldm_geartab.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/huf_decompress.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_ddict.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_ddict.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/lib/decompress/zstd_decompress_block.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzclose.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzcompatibility.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzguts.h +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzlib.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/gzread.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/zstd_zlibwrapper.c +0 -0
- data/ext/zstdlib_c/{zstd-1.5.6 → zstd-1.5.7}/zlibWrapper/zstd_zlibwrapper.h +5 -5
| @@ -153,13 +153,13 @@ size_t ZSTD_crossEntropyCost(short const* norm, unsigned accuracyLog, | |
| 153 153 | 
             
                return cost >> 8;
         | 
| 154 154 | 
             
            }
         | 
| 155 155 |  | 
| 156 | 
            -
             | 
| 156 | 
            +
            SymbolEncodingType_e
         | 
| 157 157 | 
             
            ZSTD_selectEncodingType(
         | 
| 158 158 | 
             
                    FSE_repeat* repeatMode, unsigned const* count, unsigned const max,
         | 
| 159 159 | 
             
                    size_t const mostFrequent, size_t nbSeq, unsigned const FSELog,
         | 
| 160 160 | 
             
                    FSE_CTable const* prevCTable,
         | 
| 161 161 | 
             
                    short const* defaultNorm, U32 defaultNormLog,
         | 
| 162 | 
            -
                     | 
| 162 | 
            +
                    ZSTD_DefaultPolicy_e const isDefaultAllowed,
         | 
| 163 163 | 
             
                    ZSTD_strategy const strategy)
         | 
| 164 164 | 
             
            {
         | 
| 165 165 | 
             
                ZSTD_STATIC_ASSERT(ZSTD_defaultDisallowed == 0 && ZSTD_defaultAllowed != 0);
         | 
| @@ -241,7 +241,7 @@ typedef struct { | |
| 241 241 |  | 
| 242 242 | 
             
            size_t
         | 
| 243 243 | 
             
            ZSTD_buildCTable(void* dst, size_t dstCapacity,
         | 
| 244 | 
            -
                            FSE_CTable* nextCTable, U32 FSELog,  | 
| 244 | 
            +
                            FSE_CTable* nextCTable, U32 FSELog, SymbolEncodingType_e type,
         | 
| 245 245 | 
             
                            unsigned* count, U32 max,
         | 
| 246 246 | 
             
                            const BYTE* codeTable, size_t nbSeq,
         | 
| 247 247 | 
             
                            const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax,
         | 
| @@ -293,7 +293,7 @@ ZSTD_encodeSequences_body( | |
| 293 293 | 
             
                        FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
         | 
| 294 294 | 
             
                        FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
         | 
| 295 295 | 
             
                        FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
         | 
| 296 | 
            -
                         | 
| 296 | 
            +
                        SeqDef const* sequences, size_t nbSeq, int longOffsets)
         | 
| 297 297 | 
             
            {
         | 
| 298 298 | 
             
                BIT_CStream_t blockStream;
         | 
| 299 299 | 
             
                FSE_CState_t  stateMatchLength;
         | 
| @@ -387,7 +387,7 @@ ZSTD_encodeSequences_default( | |
| 387 387 | 
             
                        FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
         | 
| 388 388 | 
             
                        FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
         | 
| 389 389 | 
             
                        FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
         | 
| 390 | 
            -
                         | 
| 390 | 
            +
                        SeqDef const* sequences, size_t nbSeq, int longOffsets)
         | 
| 391 391 | 
             
            {
         | 
| 392 392 | 
             
                return ZSTD_encodeSequences_body(dst, dstCapacity,
         | 
| 393 393 | 
             
                                                CTable_MatchLength, mlCodeTable,
         | 
| @@ -405,7 +405,7 @@ ZSTD_encodeSequences_bmi2( | |
| 405 405 | 
             
                        FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
         | 
| 406 406 | 
             
                        FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
         | 
| 407 407 | 
             
                        FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
         | 
| 408 | 
            -
                         | 
| 408 | 
            +
                        SeqDef const* sequences, size_t nbSeq, int longOffsets)
         | 
| 409 409 | 
             
            {
         | 
| 410 410 | 
             
                return ZSTD_encodeSequences_body(dst, dstCapacity,
         | 
| 411 411 | 
             
                                                CTable_MatchLength, mlCodeTable,
         | 
| @@ -421,7 +421,7 @@ size_t ZSTD_encodeSequences( | |
| 421 421 | 
             
                        FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
         | 
| 422 422 | 
             
                        FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
         | 
| 423 423 | 
             
                        FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
         | 
| 424 | 
            -
                         | 
| 424 | 
            +
                        SeqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2)
         | 
| 425 425 | 
             
            {
         | 
| 426 426 | 
             
                DEBUGLOG(5, "ZSTD_encodeSequences: dstCapacity = %u", (unsigned)dstCapacity);
         | 
| 427 427 | 
             
            #if DYNAMIC_BMI2
         | 
| @@ -11,26 +11,27 @@ | |
| 11 11 | 
             
            #ifndef ZSTD_COMPRESS_SEQUENCES_H
         | 
| 12 12 | 
             
            #define ZSTD_COMPRESS_SEQUENCES_H
         | 
| 13 13 |  | 
| 14 | 
            +
            #include "zstd_compress_internal.h" /* SeqDef */
         | 
| 14 15 | 
             
            #include "../common/fse.h" /* FSE_repeat, FSE_CTable */
         | 
| 15 | 
            -
            #include "../common/zstd_internal.h" /*  | 
| 16 | 
            +
            #include "../common/zstd_internal.h" /* SymbolEncodingType_e, ZSTD_strategy */
         | 
| 16 17 |  | 
| 17 18 | 
             
            typedef enum {
         | 
| 18 19 | 
             
                ZSTD_defaultDisallowed = 0,
         | 
| 19 20 | 
             
                ZSTD_defaultAllowed = 1
         | 
| 20 | 
            -
            }  | 
| 21 | 
            +
            } ZSTD_DefaultPolicy_e;
         | 
| 21 22 |  | 
| 22 | 
            -
             | 
| 23 | 
            +
            SymbolEncodingType_e
         | 
| 23 24 | 
             
            ZSTD_selectEncodingType(
         | 
| 24 25 | 
             
                    FSE_repeat* repeatMode, unsigned const* count, unsigned const max,
         | 
| 25 26 | 
             
                    size_t const mostFrequent, size_t nbSeq, unsigned const FSELog,
         | 
| 26 27 | 
             
                    FSE_CTable const* prevCTable,
         | 
| 27 28 | 
             
                    short const* defaultNorm, U32 defaultNormLog,
         | 
| 28 | 
            -
                     | 
| 29 | 
            +
                    ZSTD_DefaultPolicy_e const isDefaultAllowed,
         | 
| 29 30 | 
             
                    ZSTD_strategy const strategy);
         | 
| 30 31 |  | 
| 31 32 | 
             
            size_t
         | 
| 32 33 | 
             
            ZSTD_buildCTable(void* dst, size_t dstCapacity,
         | 
| 33 | 
            -
                            FSE_CTable* nextCTable, U32 FSELog,  | 
| 34 | 
            +
                            FSE_CTable* nextCTable, U32 FSELog, SymbolEncodingType_e type,
         | 
| 34 35 | 
             
                            unsigned* count, U32 max,
         | 
| 35 36 | 
             
                            const BYTE* codeTable, size_t nbSeq,
         | 
| 36 37 | 
             
                            const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax,
         | 
| @@ -42,7 +43,7 @@ size_t ZSTD_encodeSequences( | |
| 42 43 | 
             
                        FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
         | 
| 43 44 | 
             
                        FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
         | 
| 44 45 | 
             
                        FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
         | 
| 45 | 
            -
                         | 
| 46 | 
            +
                        SeqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2);
         | 
| 46 47 |  | 
| 47 48 | 
             
            size_t ZSTD_fseBitCost(
         | 
| 48 49 | 
             
                FSE_CTable const* ctable,
         | 
| @@ -51,7 +51,7 @@ ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, | |
| 51 51 | 
             
                BYTE* const oend = ostart + dstSize;
         | 
| 52 52 | 
             
                BYTE* op = ostart + lhSize;
         | 
| 53 53 | 
             
                U32 const singleStream = lhSize == 3;
         | 
| 54 | 
            -
                 | 
| 54 | 
            +
                SymbolEncodingType_e hType = writeEntropy ? hufMetadata->hType : set_repeat;
         | 
| 55 55 | 
             
                size_t cLitSize = 0;
         | 
| 56 56 |  | 
| 57 57 | 
             
                DEBUGLOG(5, "ZSTD_compressSubBlock_literal (litSize=%zu, lhSize=%zu, writeEntropy=%d)", litSize, lhSize, writeEntropy);
         | 
| @@ -126,15 +126,15 @@ ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, | |
| 126 126 | 
             
            }
         | 
| 127 127 |  | 
| 128 128 | 
             
            static size_t
         | 
| 129 | 
            -
            ZSTD_seqDecompressedSize( | 
| 130 | 
            -
                               const  | 
| 129 | 
            +
            ZSTD_seqDecompressedSize(SeqStore_t const* seqStore,
         | 
| 130 | 
            +
                               const SeqDef* sequences, size_t nbSeqs,
         | 
| 131 131 | 
             
                                     size_t litSize, int lastSubBlock)
         | 
| 132 132 | 
             
            {
         | 
| 133 133 | 
             
                size_t matchLengthSum = 0;
         | 
| 134 134 | 
             
                size_t litLengthSum = 0;
         | 
| 135 135 | 
             
                size_t n;
         | 
| 136 136 | 
             
                for (n=0; n<nbSeqs; n++) {
         | 
| 137 | 
            -
                    const  | 
| 137 | 
            +
                    const ZSTD_SequenceLength seqLen = ZSTD_getSequenceLength(seqStore, sequences+n);
         | 
| 138 138 | 
             
                    litLengthSum += seqLen.litLength;
         | 
| 139 139 | 
             
                    matchLengthSum += seqLen.matchLength;
         | 
| 140 140 | 
             
                }
         | 
| @@ -162,7 +162,7 @@ ZSTD_seqDecompressedSize(seqStore_t const* seqStore, | |
| 162 162 | 
             
            static size_t
         | 
| 163 163 | 
             
            ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables,
         | 
| 164 164 | 
             
                                            const ZSTD_fseCTablesMetadata_t* fseMetadata,
         | 
| 165 | 
            -
                                            const  | 
| 165 | 
            +
                                            const SeqDef* sequences, size_t nbSeq,
         | 
| 166 166 | 
             
                                            const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode,
         | 
| 167 167 | 
             
                                            const ZSTD_CCtx_params* cctxParams,
         | 
| 168 168 | 
             
                                            void* dst, size_t dstCapacity,
         | 
| @@ -262,7 +262,7 @@ ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, | |
| 262 262 | 
             
             *            Or 0 if it failed to compress. */
         | 
| 263 263 | 
             
            static size_t ZSTD_compressSubBlock(const ZSTD_entropyCTables_t* entropy,
         | 
| 264 264 | 
             
                                                const ZSTD_entropyCTablesMetadata_t* entropyMetadata,
         | 
| 265 | 
            -
                                                const  | 
| 265 | 
            +
                                                const SeqDef* sequences, size_t nbSeq,
         | 
| 266 266 | 
             
                                                const BYTE* literals, size_t litSize,
         | 
| 267 267 | 
             
                                                const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode,
         | 
| 268 268 | 
             
                                                const ZSTD_CCtx_params* cctxParams,
         | 
| @@ -327,7 +327,7 @@ static size_t ZSTD_estimateSubBlockSize_literal(const BYTE* literals, size_t lit | |
| 327 327 | 
             
                return 0;
         | 
| 328 328 | 
             
            }
         | 
| 329 329 |  | 
| 330 | 
            -
            static size_t ZSTD_estimateSubBlockSize_symbolType( | 
| 330 | 
            +
            static size_t ZSTD_estimateSubBlockSize_symbolType(SymbolEncodingType_e type,
         | 
| 331 331 | 
             
                                    const BYTE* codeTable, unsigned maxCode,
         | 
| 332 332 | 
             
                                    size_t nbSeq, const FSE_CTable* fseCTable,
         | 
| 333 333 | 
             
                                    const U8* additionalBits,
         | 
| @@ -426,7 +426,7 @@ static int ZSTD_needSequenceEntropyTables(ZSTD_fseCTablesMetadata_t const* fseMe | |
| 426 426 | 
             
                return 0;
         | 
| 427 427 | 
             
            }
         | 
| 428 428 |  | 
| 429 | 
            -
            static size_t countLiterals( | 
| 429 | 
            +
            static size_t countLiterals(SeqStore_t const* seqStore, const SeqDef* sp, size_t seqCount)
         | 
| 430 430 | 
             
            {
         | 
| 431 431 | 
             
                size_t n, total = 0;
         | 
| 432 432 | 
             
                assert(sp != NULL);
         | 
| @@ -439,7 +439,7 @@ static size_t countLiterals(seqStore_t const* seqStore, const seqDef* sp, size_t | |
| 439 439 |  | 
| 440 440 | 
             
            #define BYTESCALE 256
         | 
| 441 441 |  | 
| 442 | 
            -
            static size_t sizeBlockSequences(const  | 
| 442 | 
            +
            static size_t sizeBlockSequences(const SeqDef* sp, size_t nbSeqs,
         | 
| 443 443 | 
             
                            size_t targetBudget, size_t avgLitCost, size_t avgSeqCost,
         | 
| 444 444 | 
             
                            int firstSubBlock)
         | 
| 445 445 | 
             
            {
         | 
| @@ -476,7 +476,7 @@ static size_t sizeBlockSequences(const seqDef* sp, size_t nbSeqs, | |
| 476 476 | 
             
             *  Sub-blocks are all compressed, except the last one when beneficial.
         | 
| 477 477 | 
             
             *  @return : compressed size of the super block (which features multiple ZSTD blocks)
         | 
| 478 478 | 
             
             *            or 0 if it failed to compress. */
         | 
| 479 | 
            -
            static size_t ZSTD_compressSubBlock_multi(const  | 
| 479 | 
            +
            static size_t ZSTD_compressSubBlock_multi(const SeqStore_t* seqStorePtr,
         | 
| 480 480 | 
             
                                        const ZSTD_compressedBlockState_t* prevCBlock,
         | 
| 481 481 | 
             
                                        ZSTD_compressedBlockState_t* nextCBlock,
         | 
| 482 482 | 
             
                                        const ZSTD_entropyCTablesMetadata_t* entropyMetadata,
         | 
| @@ -486,9 +486,9 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, | |
| 486 486 | 
             
                                        const int bmi2, U32 lastBlock,
         | 
| 487 487 | 
             
                                        void* workspace, size_t wkspSize)
         | 
| 488 488 | 
             
            {
         | 
| 489 | 
            -
                const  | 
| 490 | 
            -
                const  | 
| 491 | 
            -
                const  | 
| 489 | 
            +
                const SeqDef* const sstart = seqStorePtr->sequencesStart;
         | 
| 490 | 
            +
                const SeqDef* const send = seqStorePtr->sequences;
         | 
| 491 | 
            +
                const SeqDef* sp = sstart; /* tracks progresses within seqStorePtr->sequences */
         | 
| 492 492 | 
             
                size_t const nbSeqs = (size_t)(send - sstart);
         | 
| 493 493 | 
             
                const BYTE* const lstart = seqStorePtr->litStart;
         | 
| 494 494 | 
             
                const BYTE* const lend = seqStorePtr->lit;
         | 
| @@ -647,8 +647,8 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, | |
| 647 647 | 
             
                    op += cSize;
         | 
| 648 648 | 
             
                    /* We have to regenerate the repcodes because we've skipped some sequences */
         | 
| 649 649 | 
             
                    if (sp < send) {
         | 
| 650 | 
            -
                        const  | 
| 651 | 
            -
                         | 
| 650 | 
            +
                        const SeqDef* seq;
         | 
| 651 | 
            +
                        Repcodes_t rep;
         | 
| 652 652 | 
             
                        ZSTD_memcpy(&rep, prevCBlock->rep, sizeof(rep));
         | 
| 653 653 | 
             
                        for (seq = sstart; seq < sp; ++seq) {
         | 
| 654 654 | 
             
                            ZSTD_updateRep(rep.rep, seq->offBase, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0);
         | 
| @@ -674,7 +674,7 @@ size_t ZSTD_compressSuperBlock(ZSTD_CCtx* zc, | |
| 674 674 | 
             
                      &zc->blockState.nextCBlock->entropy,
         | 
| 675 675 | 
             
                      &zc->appliedParams,
         | 
| 676 676 | 
             
                      &entropyMetadata,
         | 
| 677 | 
            -
                      zc-> | 
| 677 | 
            +
                      zc->tmpWorkspace, zc->tmpWkspSize /* statically allocated in resetCCtx */), "");
         | 
| 678 678 |  | 
| 679 679 | 
             
                return ZSTD_compressSubBlock_multi(&zc->seqStore,
         | 
| 680 680 | 
             
                        zc->blockState.prevCBlock,
         | 
| @@ -684,5 +684,5 @@ size_t ZSTD_compressSuperBlock(ZSTD_CCtx* zc, | |
| 684 684 | 
             
                        dst, dstCapacity,
         | 
| 685 685 | 
             
                        src, srcSize,
         | 
| 686 686 | 
             
                        zc->bmi2, lastBlock,
         | 
| 687 | 
            -
                        zc-> | 
| 687 | 
            +
                        zc->tmpWorkspace, zc->tmpWkspSize /* statically allocated in resetCCtx */);
         | 
| 688 688 | 
             
            }
         | 
| @@ -17,10 +17,7 @@ | |
| 17 17 | 
             
            #include "../common/allocations.h"  /* ZSTD_customMalloc, ZSTD_customFree */
         | 
| 18 18 | 
             
            #include "../common/zstd_internal.h"
         | 
| 19 19 | 
             
            #include "../common/portability_macros.h"
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            #if defined (__cplusplus)
         | 
| 22 | 
            -
            extern "C" {
         | 
| 23 | 
            -
            #endif
         | 
| 20 | 
            +
            #include "../common/compiler.h" /* ZS2_isPower2 */
         | 
| 24 21 |  | 
| 25 22 | 
             
            /*-*************************************
         | 
| 26 23 | 
             
            *  Constants
         | 
| @@ -206,9 +203,9 @@ MEM_STATIC void ZSTD_cwksp_assert_internal_consistency(ZSTD_cwksp* ws) { | |
| 206 203 | 
             
            /**
         | 
| 207 204 | 
             
             * Align must be a power of 2.
         | 
| 208 205 | 
             
             */
         | 
| 209 | 
            -
            MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t  | 
| 206 | 
            +
            MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t align) {
         | 
| 210 207 | 
             
                size_t const mask = align - 1;
         | 
| 211 | 
            -
                assert((align | 
| 208 | 
            +
                assert(ZSTD_isPower2(align));
         | 
| 212 209 | 
             
                return (size + mask) & ~mask;
         | 
| 213 210 | 
             
            }
         | 
| 214 211 |  | 
| @@ -222,7 +219,7 @@ MEM_STATIC size_t ZSTD_cwksp_align(size_t size, size_t const align) { | |
| 222 219 | 
             
             * to figure out how much space you need for the matchState tables. Everything
         | 
| 223 220 | 
             
             * else is though.
         | 
| 224 221 | 
             
             *
         | 
| 225 | 
            -
             * Do not use for sizing aligned buffers. Instead, use  | 
| 222 | 
            +
             * Do not use for sizing aligned buffers. Instead, use ZSTD_cwksp_aligned64_alloc_size().
         | 
| 226 223 | 
             
             */
         | 
| 227 224 | 
             
            MEM_STATIC size_t ZSTD_cwksp_alloc_size(size_t size) {
         | 
| 228 225 | 
             
                if (size == 0)
         | 
| @@ -234,12 +231,16 @@ MEM_STATIC size_t ZSTD_cwksp_alloc_size(size_t size) { | |
| 234 231 | 
             
            #endif
         | 
| 235 232 | 
             
            }
         | 
| 236 233 |  | 
| 234 | 
            +
            MEM_STATIC size_t ZSTD_cwksp_aligned_alloc_size(size_t size, size_t alignment) {
         | 
| 235 | 
            +
                return ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(size, alignment));
         | 
| 236 | 
            +
            }
         | 
| 237 | 
            +
             | 
| 237 238 | 
             
            /**
         | 
| 238 239 | 
             
             * Returns an adjusted alloc size that is the nearest larger multiple of 64 bytes.
         | 
| 239 240 | 
             
             * Used to determine the number of bytes required for a given "aligned".
         | 
| 240 241 | 
             
             */
         | 
| 241 | 
            -
            MEM_STATIC size_t  | 
| 242 | 
            -
                return  | 
| 242 | 
            +
            MEM_STATIC size_t ZSTD_cwksp_aligned64_alloc_size(size_t size) {
         | 
| 243 | 
            +
                return ZSTD_cwksp_aligned_alloc_size(size, ZSTD_CWKSP_ALIGNMENT_BYTES);
         | 
| 243 244 | 
             
            }
         | 
| 244 245 |  | 
| 245 246 | 
             
            /**
         | 
| @@ -262,7 +263,7 @@ MEM_STATIC size_t ZSTD_cwksp_slack_space_required(void) { | |
| 262 263 | 
             
            MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignBytes) {
         | 
| 263 264 | 
             
                size_t const alignBytesMask = alignBytes - 1;
         | 
| 264 265 | 
             
                size_t const bytes = (alignBytes - ((size_t)ptr & (alignBytesMask))) & alignBytesMask;
         | 
| 265 | 
            -
                assert((alignBytes | 
| 266 | 
            +
                assert(ZSTD_isPower2(alignBytes));
         | 
| 266 267 | 
             
                assert(bytes < alignBytes);
         | 
| 267 268 | 
             
                return bytes;
         | 
| 268 269 | 
             
            }
         | 
| @@ -271,8 +272,12 @@ MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignByt | |
| 271 272 | 
             
             * Returns the initial value for allocStart which is used to determine the position from
         | 
| 272 273 | 
             
             * which we can allocate from the end of the workspace.
         | 
| 273 274 | 
             
             */
         | 
| 274 | 
            -
            MEM_STATIC void*  ZSTD_cwksp_initialAllocStart(ZSTD_cwksp* ws) | 
| 275 | 
            -
             | 
| 275 | 
            +
            MEM_STATIC void*  ZSTD_cwksp_initialAllocStart(ZSTD_cwksp* ws)
         | 
| 276 | 
            +
            {
         | 
| 277 | 
            +
                char* endPtr = (char*)ws->workspaceEnd;
         | 
| 278 | 
            +
                assert(ZSTD_isPower2(ZSTD_CWKSP_ALIGNMENT_BYTES));
         | 
| 279 | 
            +
                endPtr = endPtr - ((size_t)endPtr % ZSTD_CWKSP_ALIGNMENT_BYTES);
         | 
| 280 | 
            +
                return (void*)endPtr;
         | 
| 276 281 | 
             
            }
         | 
| 277 282 |  | 
| 278 283 | 
             
            /**
         | 
| @@ -287,7 +292,7 @@ ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) | |
| 287 292 | 
             
            {
         | 
| 288 293 | 
             
                void* const alloc = (BYTE*)ws->allocStart - bytes;
         | 
| 289 294 | 
             
                void* const bottom = ws->tableEnd;
         | 
| 290 | 
            -
                DEBUGLOG(5, "cwksp: reserving %p | 
| 295 | 
            +
                DEBUGLOG(5, "cwksp: reserving [0x%p]:%zd bytes; %zd bytes remaining",
         | 
| 291 296 | 
             
                    alloc, bytes, ZSTD_cwksp_available_space(ws) - bytes);
         | 
| 292 297 | 
             
                ZSTD_cwksp_assert_internal_consistency(ws);
         | 
| 293 298 | 
             
                assert(alloc >= bottom);
         | 
| @@ -404,7 +409,7 @@ MEM_STATIC void* ZSTD_cwksp_reserve_aligned_init_once(ZSTD_cwksp* ws, size_t byt | |
| 404 409 | 
             
            {
         | 
| 405 410 | 
             
                size_t const alignedBytes = ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES);
         | 
| 406 411 | 
             
                void* ptr = ZSTD_cwksp_reserve_internal(ws, alignedBytes, ZSTD_cwksp_alloc_aligned_init_once);
         | 
| 407 | 
            -
                assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0);
         | 
| 412 | 
            +
                assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1)) == 0);
         | 
| 408 413 | 
             
                if(ptr && ptr < ws->initOnceStart) {
         | 
| 409 414 | 
             
                    /* We assume the memory following the current allocation is either:
         | 
| 410 415 | 
             
                     * 1. Not usable as initOnce memory (end of workspace)
         | 
| @@ -424,11 +429,12 @@ MEM_STATIC void* ZSTD_cwksp_reserve_aligned_init_once(ZSTD_cwksp* ws, size_t byt | |
| 424 429 | 
             
            /**
         | 
| 425 430 | 
             
             * Reserves and returns memory sized on and aligned on ZSTD_CWKSP_ALIGNMENT_BYTES (64 bytes).
         | 
| 426 431 | 
             
             */
         | 
| 427 | 
            -
            MEM_STATIC void*  | 
| 432 | 
            +
            MEM_STATIC void* ZSTD_cwksp_reserve_aligned64(ZSTD_cwksp* ws, size_t bytes)
         | 
| 428 433 | 
             
            {
         | 
| 429 | 
            -
                void* ptr = ZSTD_cwksp_reserve_internal(ws, | 
| 430 | 
            -
             | 
| 431 | 
            -
             | 
| 434 | 
            +
                void* const ptr = ZSTD_cwksp_reserve_internal(ws,
         | 
| 435 | 
            +
                                    ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES),
         | 
| 436 | 
            +
                                    ZSTD_cwksp_alloc_aligned);
         | 
| 437 | 
            +
                assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1)) == 0);
         | 
| 432 438 | 
             
                return ptr;
         | 
| 433 439 | 
             
            }
         | 
| 434 440 |  | 
| @@ -474,7 +480,7 @@ MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) | |
| 474 480 | 
             
            #endif
         | 
| 475 481 |  | 
| 476 482 | 
             
                assert((bytes & (ZSTD_CWKSP_ALIGNMENT_BYTES-1)) == 0);
         | 
| 477 | 
            -
                assert(((size_t)alloc & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0);
         | 
| 483 | 
            +
                assert(((size_t)alloc & (ZSTD_CWKSP_ALIGNMENT_BYTES-1)) == 0);
         | 
| 478 484 | 
             
                return alloc;
         | 
| 479 485 | 
             
            }
         | 
| 480 486 |  | 
| @@ -520,6 +526,20 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) | |
| 520 526 |  | 
| 521 527 | 
             
                return alloc;
         | 
| 522 528 | 
             
            }
         | 
| 529 | 
            +
            /**
         | 
| 530 | 
            +
             * with alignment control
         | 
| 531 | 
            +
             * Note : should happen only once, at workspace first initialization
         | 
| 532 | 
            +
             */
         | 
| 533 | 
            +
            MEM_STATIC void* ZSTD_cwksp_reserve_object_aligned(ZSTD_cwksp* ws, size_t byteSize, size_t alignment)
         | 
| 534 | 
            +
            {
         | 
| 535 | 
            +
                size_t const mask = alignment - 1;
         | 
| 536 | 
            +
                size_t const surplus = (alignment > sizeof(void*)) ? alignment - sizeof(void*) : 0;
         | 
| 537 | 
            +
                void* const start = ZSTD_cwksp_reserve_object(ws, byteSize + surplus);
         | 
| 538 | 
            +
                if (start == NULL) return NULL;
         | 
| 539 | 
            +
                if (surplus == 0) return start;
         | 
| 540 | 
            +
                assert(ZSTD_isPower2(alignment));
         | 
| 541 | 
            +
                return (void*)(((size_t)start + surplus) & ~mask);
         | 
| 542 | 
            +
            }
         | 
| 523 543 |  | 
| 524 544 | 
             
            MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws)
         | 
| 525 545 | 
             
            {
         | 
| @@ -577,7 +597,8 @@ MEM_STATIC void ZSTD_cwksp_clean_tables(ZSTD_cwksp* ws) { | |
| 577 597 | 
             
             * Invalidates table allocations.
         | 
| 578 598 | 
             
             * All other allocations remain valid.
         | 
| 579 599 | 
             
             */
         | 
| 580 | 
            -
            MEM_STATIC void ZSTD_cwksp_clear_tables(ZSTD_cwksp* ws) | 
| 600 | 
            +
            MEM_STATIC void ZSTD_cwksp_clear_tables(ZSTD_cwksp* ws)
         | 
| 601 | 
            +
            {
         | 
| 581 602 | 
             
                DEBUGLOG(4, "cwksp: clearing tables!");
         | 
| 582 603 |  | 
| 583 604 | 
             
            #if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE)
         | 
| @@ -741,8 +762,4 @@ MEM_STATIC void ZSTD_cwksp_bump_oversized_duration( | |
| 741 762 | 
             
                }
         | 
| 742 763 | 
             
            }
         | 
| 743 764 |  | 
| 744 | 
            -
            #if defined (__cplusplus)
         | 
| 745 | 
            -
            }
         | 
| 746 | 
            -
            #endif
         | 
| 747 | 
            -
             | 
| 748 765 | 
             
            #endif /* ZSTD_CWKSP_H */
         | 
| @@ -15,7 +15,7 @@ | |
| 15 15 |  | 
| 16 16 | 
             
            static
         | 
| 17 17 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 18 | 
            -
            void ZSTD_fillDoubleHashTableForCDict( | 
| 18 | 
            +
            void ZSTD_fillDoubleHashTableForCDict(ZSTD_MatchState_t* ms,
         | 
| 19 19 | 
             
                                          void const* end, ZSTD_dictTableLoadMethod_e dtlm)
         | 
| 20 20 | 
             
            {
         | 
| 21 21 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| @@ -53,7 +53,7 @@ void ZSTD_fillDoubleHashTableForCDict(ZSTD_matchState_t* ms, | |
| 53 53 |  | 
| 54 54 | 
             
            static
         | 
| 55 55 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 56 | 
            -
            void ZSTD_fillDoubleHashTableForCCtx( | 
| 56 | 
            +
            void ZSTD_fillDoubleHashTableForCCtx(ZSTD_MatchState_t* ms,
         | 
| 57 57 | 
             
                                          void const* end, ZSTD_dictTableLoadMethod_e dtlm)
         | 
| 58 58 | 
             
            {
         | 
| 59 59 | 
             
                const ZSTD_compressionParameters* const cParams = &ms->cParams;
         | 
| @@ -87,7 +87,7 @@ void ZSTD_fillDoubleHashTableForCCtx(ZSTD_matchState_t* ms, | |
| 87 87 | 
             
                    }   }
         | 
| 88 88 | 
             
            }
         | 
| 89 89 |  | 
| 90 | 
            -
            void ZSTD_fillDoubleHashTable( | 
| 90 | 
            +
            void ZSTD_fillDoubleHashTable(ZSTD_MatchState_t* ms,
         | 
| 91 91 | 
             
                                    const void* const end,
         | 
| 92 92 | 
             
                                    ZSTD_dictTableLoadMethod_e dtlm,
         | 
| 93 93 | 
             
                                    ZSTD_tableFillPurpose_e tfp)
         | 
| @@ -103,7 +103,7 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, | |
| 103 103 | 
             
            FORCE_INLINE_TEMPLATE
         | 
| 104 104 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 105 105 | 
             
            size_t ZSTD_compressBlock_doubleFast_noDict_generic(
         | 
| 106 | 
            -
                     | 
| 106 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 107 107 | 
             
                    void const* src, size_t srcSize, U32 const mls /* template */)
         | 
| 108 108 | 
             
            {
         | 
| 109 109 | 
             
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| @@ -142,9 +142,14 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( | |
| 142 142 | 
             
                const BYTE* matchl0; /* the long match for ip */
         | 
| 143 143 | 
             
                const BYTE* matchs0; /* the short match for ip */
         | 
| 144 144 | 
             
                const BYTE* matchl1; /* the long match for ip1 */
         | 
| 145 | 
            +
                const BYTE* matchs0_safe; /* matchs0 or safe address */
         | 
| 145 146 |  | 
| 146 147 | 
             
                const BYTE* ip = istart; /* the current position */
         | 
| 147 148 | 
             
                const BYTE* ip1; /* the next position */
         | 
| 149 | 
            +
                /* Array of ~random data, should have low probability of matching data
         | 
| 150 | 
            +
                 * we load from here instead of from tables, if matchl0/matchl1 are
         | 
| 151 | 
            +
                 * invalid indices. Used to avoid unpredictable branches. */
         | 
| 152 | 
            +
                const BYTE dummy[] = {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0xe2,0xb4};
         | 
| 148 153 |  | 
| 149 154 | 
             
                DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_noDict_generic");
         | 
| 150 155 |  | 
| @@ -191,24 +196,29 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( | |
| 191 196 |  | 
| 192 197 | 
             
                        hl1 = ZSTD_hashPtr(ip1, hBitsL, 8);
         | 
| 193 198 |  | 
| 194 | 
            -
                         | 
| 199 | 
            +
                        /* idxl0 > prefixLowestIndex is a (somewhat) unpredictable branch.
         | 
| 200 | 
            +
                         * However expression below complies into conditional move. Since
         | 
| 201 | 
            +
                         * match is unlikely and we only *branch* on idxl0 > prefixLowestIndex
         | 
| 202 | 
            +
                         * if there is a match, all branches become predictable. */
         | 
| 203 | 
            +
                        {   const BYTE*  const matchl0_safe = ZSTD_selectAddr(idxl0, prefixLowestIndex, matchl0, &dummy[0]);
         | 
| 204 | 
            +
             | 
| 195 205 | 
             
                            /* check prefix long match */
         | 
| 196 | 
            -
                            if (MEM_read64( | 
| 206 | 
            +
                            if (MEM_read64(matchl0_safe) == MEM_read64(ip) && matchl0_safe == matchl0) {
         | 
| 197 207 | 
             
                                mLength = ZSTD_count(ip+8, matchl0+8, iend) + 8;
         | 
| 198 208 | 
             
                                offset = (U32)(ip-matchl0);
         | 
| 199 209 | 
             
                                while (((ip>anchor) & (matchl0>prefixLowest)) && (ip[-1] == matchl0[-1])) { ip--; matchl0--; mLength++; } /* catch up */
         | 
| 200 210 | 
             
                                goto _match_found;
         | 
| 201 | 
            -
             | 
| 202 | 
            -
                        }
         | 
| 211 | 
            +
                        }   }
         | 
| 203 212 |  | 
| 204 213 | 
             
                        idxl1 = hashLong[hl1];
         | 
| 205 214 | 
             
                        matchl1 = base + idxl1;
         | 
| 206 215 |  | 
| 207 | 
            -
                         | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 216 | 
            +
                        /* Same optimization as matchl0 above */
         | 
| 217 | 
            +
                        matchs0_safe = ZSTD_selectAddr(idxs0, prefixLowestIndex, matchs0, &dummy[0]);
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                        /* check prefix short match */
         | 
| 220 | 
            +
                        if(MEM_read32(matchs0_safe) == MEM_read32(ip) && matchs0_safe == matchs0) {
         | 
| 221 | 
            +
                              goto _search_next_long;
         | 
| 212 222 | 
             
                        }
         | 
| 213 223 |  | 
| 214 224 | 
             
                        if (ip1 >= nextStep) {
         | 
| @@ -242,21 +252,23 @@ _cleanup: | |
| 242 252 |  | 
| 243 253 | 
             
            _search_next_long:
         | 
| 244 254 |  | 
| 245 | 
            -
                    /* check  | 
| 246 | 
            -
                     | 
| 247 | 
            -
             | 
| 255 | 
            +
                    /* short match found: let's check for a longer one */
         | 
| 256 | 
            +
                    mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4;
         | 
| 257 | 
            +
                    offset = (U32)(ip - matchs0);
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                    /* check long match at +1 position */
         | 
| 260 | 
            +
                    if ((idxl1 > prefixLowestIndex) && (MEM_read64(matchl1) == MEM_read64(ip1))) {
         | 
| 261 | 
            +
                        size_t const l1len = ZSTD_count(ip1+8, matchl1+8, iend) + 8;
         | 
| 262 | 
            +
                        if (l1len > mLength) {
         | 
| 263 | 
            +
                            /* use the long match instead */
         | 
| 248 264 | 
             
                            ip = ip1;
         | 
| 249 | 
            -
                            mLength =  | 
| 265 | 
            +
                            mLength = l1len;
         | 
| 250 266 | 
             
                            offset = (U32)(ip-matchl1);
         | 
| 251 | 
            -
                             | 
| 252 | 
            -
                            goto _match_found;
         | 
| 267 | 
            +
                            matchs0 = matchl1;
         | 
| 253 268 | 
             
                        }
         | 
| 254 269 | 
             
                    }
         | 
| 255 270 |  | 
| 256 | 
            -
                     | 
| 257 | 
            -
                    mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4;
         | 
| 258 | 
            -
                    offset = (U32)(ip - matchs0);
         | 
| 259 | 
            -
                    while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */
         | 
| 271 | 
            +
                    while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* complete backward */
         | 
| 260 272 |  | 
| 261 273 | 
             
                    /* fall-through */
         | 
| 262 274 |  | 
| @@ -314,7 +326,7 @@ _match_stored: | |
| 314 326 | 
             
            FORCE_INLINE_TEMPLATE
         | 
| 315 327 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 316 328 | 
             
            size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic(
         | 
| 317 | 
            -
                     | 
| 329 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 318 330 | 
             
                    void const* src, size_t srcSize,
         | 
| 319 331 | 
             
                    U32 const mls /* template */)
         | 
| 320 332 | 
             
            {
         | 
| @@ -335,7 +347,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( | |
| 335 347 | 
             
                const BYTE* const ilimit = iend - HASH_READ_SIZE;
         | 
| 336 348 | 
             
                U32 offset_1=rep[0], offset_2=rep[1];
         | 
| 337 349 |  | 
| 338 | 
            -
                const  | 
| 350 | 
            +
                const ZSTD_MatchState_t* const dms = ms->dictMatchState;
         | 
| 339 351 | 
             
                const ZSTD_compressionParameters* const dictCParams = &dms->cParams;
         | 
| 340 352 | 
             
                const U32* const dictHashLong  = dms->hashTable;
         | 
| 341 353 | 
             
                const U32* const dictHashSmall = dms->chainTable;
         | 
| @@ -392,7 +404,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( | |
| 392 404 | 
             
                    hashLong[h2] = hashSmall[h] = curr;   /* update hash tables */
         | 
| 393 405 |  | 
| 394 406 | 
             
                    /* check repcode */
         | 
| 395 | 
            -
                    if ((( | 
| 407 | 
            +
                    if ((ZSTD_index_overlap_check(prefixLowestIndex, repIndex))
         | 
| 396 408 | 
             
                        && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
         | 
| 397 409 | 
             
                        const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
         | 
| 398 410 | 
             
                        mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
         | 
| @@ -401,14 +413,12 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( | |
| 401 413 | 
             
                        goto _match_stored;
         | 
| 402 414 | 
             
                    }
         | 
| 403 415 |  | 
| 404 | 
            -
                    if (matchIndexL  | 
| 416 | 
            +
                    if ((matchIndexL >= prefixLowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) {
         | 
| 405 417 | 
             
                        /* check prefix long match */
         | 
| 406 | 
            -
                         | 
| 407 | 
            -
             | 
| 408 | 
            -
             | 
| 409 | 
            -
             | 
| 410 | 
            -
                            goto _match_found;
         | 
| 411 | 
            -
                        }
         | 
| 418 | 
            +
                        mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8;
         | 
| 419 | 
            +
                        offset = (U32)(ip-matchLong);
         | 
| 420 | 
            +
                        while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
         | 
| 421 | 
            +
                        goto _match_found;
         | 
| 412 422 | 
             
                    } else if (dictTagsMatchL) {
         | 
| 413 423 | 
             
                        /* check dictMatchState long match */
         | 
| 414 424 | 
             
                        U32 const dictMatchIndexL = dictMatchIndexAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS;
         | 
| @@ -423,7 +433,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( | |
| 423 433 | 
             
                    }   }
         | 
| 424 434 |  | 
| 425 435 | 
             
                    if (matchIndexS > prefixLowestIndex) {
         | 
| 426 | 
            -
                        /*  | 
| 436 | 
            +
                        /* short match  candidate */
         | 
| 427 437 | 
             
                        if (MEM_read32(match) == MEM_read32(ip)) {
         | 
| 428 438 | 
             
                            goto _search_next_long;
         | 
| 429 439 | 
             
                        }
         | 
| @@ -453,14 +463,12 @@ _search_next_long: | |
| 453 463 | 
             
                        hashLong[hl3] = curr + 1;
         | 
| 454 464 |  | 
| 455 465 | 
             
                        /* check prefix long +1 match */
         | 
| 456 | 
            -
                        if (matchIndexL3  | 
| 457 | 
            -
                             | 
| 458 | 
            -
             | 
| 459 | 
            -
             | 
| 460 | 
            -
             | 
| 461 | 
            -
             | 
| 462 | 
            -
                                goto _match_found;
         | 
| 463 | 
            -
                            }
         | 
| 466 | 
            +
                        if ((matchIndexL3 >= prefixLowestIndex) && (MEM_read64(matchL3) == MEM_read64(ip+1))) {
         | 
| 467 | 
            +
                            mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8;
         | 
| 468 | 
            +
                            ip++;
         | 
| 469 | 
            +
                            offset = (U32)(ip-matchL3);
         | 
| 470 | 
            +
                            while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
         | 
| 471 | 
            +
                            goto _match_found;
         | 
| 464 472 | 
             
                        } else if (dictTagsMatchL3) {
         | 
| 465 473 | 
             
                            /* check dict long +1 match */
         | 
| 466 474 | 
             
                            U32 const dictMatchIndexL3 = dictMatchIndexAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS;
         | 
| @@ -513,7 +521,7 @@ _match_stored: | |
| 513 521 | 
             
                            const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ?
         | 
| 514 522 | 
             
                                    dictBase + repIndex2 - dictIndexDelta :
         | 
| 515 523 | 
             
                                    base + repIndex2;
         | 
| 516 | 
            -
                            if ( (( | 
| 524 | 
            +
                            if ( (ZSTD_index_overlap_check(prefixLowestIndex, repIndex2))
         | 
| 517 525 | 
             
                               && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
         | 
| 518 526 | 
             
                                const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend;
         | 
| 519 527 | 
             
                                size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4;
         | 
| @@ -540,7 +548,7 @@ _match_stored: | |
| 540 548 |  | 
| 541 549 | 
             
            #define ZSTD_GEN_DFAST_FN(dictMode, mls)                                                                 \
         | 
| 542 550 | 
             
                static size_t ZSTD_compressBlock_doubleFast_##dictMode##_##mls(                                      \
         | 
| 543 | 
            -
                         | 
| 551 | 
            +
                        ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],                          \
         | 
| 544 552 | 
             
                        void const* src, size_t srcSize)                                                             \
         | 
| 545 553 | 
             
                {                                                                                                    \
         | 
| 546 554 | 
             
                    return ZSTD_compressBlock_doubleFast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls); \
         | 
| @@ -558,7 +566,7 @@ ZSTD_GEN_DFAST_FN(dictMatchState, 7) | |
| 558 566 |  | 
| 559 567 |  | 
| 560 568 | 
             
            size_t ZSTD_compressBlock_doubleFast(
         | 
| 561 | 
            -
                     | 
| 569 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 562 570 | 
             
                    void const* src, size_t srcSize)
         | 
| 563 571 | 
             
            {
         | 
| 564 572 | 
             
                const U32 mls = ms->cParams.minMatch;
         | 
| @@ -578,7 +586,7 @@ size_t ZSTD_compressBlock_doubleFast( | |
| 578 586 |  | 
| 579 587 |  | 
| 580 588 | 
             
            size_t ZSTD_compressBlock_doubleFast_dictMatchState(
         | 
| 581 | 
            -
                     | 
| 589 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 582 590 | 
             
                    void const* src, size_t srcSize)
         | 
| 583 591 | 
             
            {
         | 
| 584 592 | 
             
                const U32 mls = ms->cParams.minMatch;
         | 
| @@ -600,7 +608,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState( | |
| 600 608 | 
             
            static
         | 
| 601 609 | 
             
            ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
         | 
| 602 610 | 
             
            size_t ZSTD_compressBlock_doubleFast_extDict_generic(
         | 
| 603 | 
            -
                     | 
| 611 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 604 612 | 
             
                    void const* src, size_t srcSize,
         | 
| 605 613 | 
             
                    U32 const mls /* template */)
         | 
| 606 614 | 
             
            {
         | 
| @@ -651,7 +659,7 @@ size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 651 659 | 
             
                    size_t mLength;
         | 
| 652 660 | 
             
                    hashSmall[hSmall] = hashLong[hLong] = curr;   /* update hash table */
         | 
| 653 661 |  | 
| 654 | 
            -
                    if (((( | 
| 662 | 
            +
                    if (((ZSTD_index_overlap_check(prefixStartIndex, repIndex))
         | 
| 655 663 | 
             
                        & (offset_1 <= curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */
         | 
| 656 664 | 
             
                      && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
         | 
| 657 665 | 
             
                        const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend;
         | 
| @@ -719,7 +727,7 @@ size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 719 727 | 
             
                            U32 const current2 = (U32)(ip-base);
         | 
| 720 728 | 
             
                            U32 const repIndex2 = current2 - offset_2;
         | 
| 721 729 | 
             
                            const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2;
         | 
| 722 | 
            -
                            if ( ((( | 
| 730 | 
            +
                            if ( ((ZSTD_index_overlap_check(prefixStartIndex, repIndex2))
         | 
| 723 731 | 
             
                                & (offset_2 <= current2 - dictStartIndex))
         | 
| 724 732 | 
             
                              && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
         | 
| 725 733 | 
             
                                const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend;
         | 
| @@ -749,7 +757,7 @@ ZSTD_GEN_DFAST_FN(extDict, 6) | |
| 749 757 | 
             
            ZSTD_GEN_DFAST_FN(extDict, 7)
         | 
| 750 758 |  | 
| 751 759 | 
             
            size_t ZSTD_compressBlock_doubleFast_extDict(
         | 
| 752 | 
            -
                     | 
| 760 | 
            +
                    ZSTD_MatchState_t* ms, SeqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 753 761 | 
             
                    void const* src, size_t srcSize)
         | 
| 754 762 | 
             
            {
         | 
| 755 763 | 
             
                U32 const mls = ms->cParams.minMatch;
         |