zstdlib 0.8.0-x64-mingw32 → 0.9.0-x64-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 +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/zstdlib.rb +2 -2
- metadata +124 -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
| @@ -48,10 +48,216 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, | |
| 48 48 |  | 
| 49 49 |  | 
| 50 50 | 
             
            FORCE_INLINE_TEMPLATE
         | 
| 51 | 
            -
            size_t  | 
| 51 | 
            +
            size_t ZSTD_compressBlock_doubleFast_noDict_generic(
         | 
| 52 | 
            +
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 53 | 
            +
                    void const* src, size_t srcSize, U32 const mls /* template */)
         | 
| 54 | 
            +
            {
         | 
| 55 | 
            +
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| 56 | 
            +
                U32* const hashLong = ms->hashTable;
         | 
| 57 | 
            +
                const U32 hBitsL = cParams->hashLog;
         | 
| 58 | 
            +
                U32* const hashSmall = ms->chainTable;
         | 
| 59 | 
            +
                const U32 hBitsS = cParams->chainLog;
         | 
| 60 | 
            +
                const BYTE* const base = ms->window.base;
         | 
| 61 | 
            +
                const BYTE* const istart = (const BYTE*)src;
         | 
| 62 | 
            +
                const BYTE* anchor = istart;
         | 
| 63 | 
            +
                const U32 endIndex = (U32)((size_t)(istart - base) + srcSize);
         | 
| 64 | 
            +
                /* presumes that, if there is a dictionary, it must be using Attach mode */
         | 
| 65 | 
            +
                const U32 prefixLowestIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog);
         | 
| 66 | 
            +
                const BYTE* const prefixLowest = base + prefixLowestIndex;
         | 
| 67 | 
            +
                const BYTE* const iend = istart + srcSize;
         | 
| 68 | 
            +
                const BYTE* const ilimit = iend - HASH_READ_SIZE;
         | 
| 69 | 
            +
                U32 offset_1=rep[0], offset_2=rep[1];
         | 
| 70 | 
            +
                U32 offsetSaved = 0;
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                size_t mLength;
         | 
| 73 | 
            +
                U32 offset;
         | 
| 74 | 
            +
                U32 curr;
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                /* how many positions to search before increasing step size */
         | 
| 77 | 
            +
                const size_t kStepIncr = 1 << kSearchStrength;
         | 
| 78 | 
            +
                /* the position at which to increment the step size if no match is found */
         | 
| 79 | 
            +
                const BYTE* nextStep;
         | 
| 80 | 
            +
                size_t step; /* the current step size */
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                size_t hl0; /* the long hash at ip */
         | 
| 83 | 
            +
                size_t hl1; /* the long hash at ip1 */
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                U32 idxl0; /* the long match index for ip */
         | 
| 86 | 
            +
                U32 idxl1; /* the long match index for ip1 */
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                const BYTE* matchl0; /* the long match for ip */
         | 
| 89 | 
            +
                const BYTE* matchs0; /* the short match for ip */
         | 
| 90 | 
            +
                const BYTE* matchl1; /* the long match for ip1 */
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                const BYTE* ip = istart; /* the current position */
         | 
| 93 | 
            +
                const BYTE* ip1; /* the next position */
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_noDict_generic");
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                /* init */
         | 
| 98 | 
            +
                ip += ((ip - prefixLowest) == 0);
         | 
| 99 | 
            +
                {
         | 
| 100 | 
            +
                    U32 const current = (U32)(ip - base);
         | 
| 101 | 
            +
                    U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, current, cParams->windowLog);
         | 
| 102 | 
            +
                    U32 const maxRep = current - windowLow;
         | 
| 103 | 
            +
                    if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
         | 
| 104 | 
            +
                    if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
         | 
| 105 | 
            +
                }
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                /* Outer Loop: one iteration per match found and stored */
         | 
| 108 | 
            +
                while (1) {
         | 
| 109 | 
            +
                    step = 1;
         | 
| 110 | 
            +
                    nextStep = ip + kStepIncr;
         | 
| 111 | 
            +
                    ip1 = ip + step;
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    if (ip1 > ilimit) {
         | 
| 114 | 
            +
                        goto _cleanup;
         | 
| 115 | 
            +
                    }
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                    hl0 = ZSTD_hashPtr(ip, hBitsL, 8);
         | 
| 118 | 
            +
                    idxl0 = hashLong[hl0];
         | 
| 119 | 
            +
                    matchl0 = base + idxl0;
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                    /* Inner Loop: one iteration per search / position */
         | 
| 122 | 
            +
                    do {
         | 
| 123 | 
            +
                        const size_t hs0 = ZSTD_hashPtr(ip, hBitsS, mls);
         | 
| 124 | 
            +
                        const U32 idxs0 = hashSmall[hs0];
         | 
| 125 | 
            +
                        curr = (U32)(ip-base);
         | 
| 126 | 
            +
                        matchs0 = base + idxs0;
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                        hashLong[hl0] = hashSmall[hs0] = curr;   /* update hash tables */
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                        /* check noDict repcode */
         | 
| 131 | 
            +
                        if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) {
         | 
| 132 | 
            +
                            mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
         | 
| 133 | 
            +
                            ip++;
         | 
| 134 | 
            +
                            ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength);
         | 
| 135 | 
            +
                            goto _match_stored;
         | 
| 136 | 
            +
                        }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                        hl1 = ZSTD_hashPtr(ip1, hBitsL, 8);
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                        if (idxl0 > prefixLowestIndex) {
         | 
| 141 | 
            +
                            /* check prefix long match */
         | 
| 142 | 
            +
                            if (MEM_read64(matchl0) == MEM_read64(ip)) {
         | 
| 143 | 
            +
                                mLength = ZSTD_count(ip+8, matchl0+8, iend) + 8;
         | 
| 144 | 
            +
                                offset = (U32)(ip-matchl0);
         | 
| 145 | 
            +
                                while (((ip>anchor) & (matchl0>prefixLowest)) && (ip[-1] == matchl0[-1])) { ip--; matchl0--; mLength++; } /* catch up */
         | 
| 146 | 
            +
                                goto _match_found;
         | 
| 147 | 
            +
                            }
         | 
| 148 | 
            +
                        }
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                        idxl1 = hashLong[hl1];
         | 
| 151 | 
            +
                        matchl1 = base + idxl1;
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                        if (idxs0 > prefixLowestIndex) {
         | 
| 154 | 
            +
                            /* check prefix short match */
         | 
| 155 | 
            +
                            if (MEM_read32(matchs0) == MEM_read32(ip)) {
         | 
| 156 | 
            +
                                goto _search_next_long;
         | 
| 157 | 
            +
                            }
         | 
| 158 | 
            +
                        }
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                        if (ip1 >= nextStep) {
         | 
| 161 | 
            +
                            PREFETCH_L1(ip1 + 64);
         | 
| 162 | 
            +
                            PREFETCH_L1(ip1 + 128);
         | 
| 163 | 
            +
                            step++;
         | 
| 164 | 
            +
                            nextStep += kStepIncr;
         | 
| 165 | 
            +
                        }
         | 
| 166 | 
            +
                        ip = ip1;
         | 
| 167 | 
            +
                        ip1 += step;
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                        hl0 = hl1;
         | 
| 170 | 
            +
                        idxl0 = idxl1;
         | 
| 171 | 
            +
                        matchl0 = matchl1;
         | 
| 172 | 
            +
                #if defined(__aarch64__)
         | 
| 173 | 
            +
                        PREFETCH_L1(ip+256);
         | 
| 174 | 
            +
                #endif
         | 
| 175 | 
            +
                    } while (ip1 <= ilimit);
         | 
| 176 | 
            +
             | 
| 177 | 
            +
            _cleanup:
         | 
| 178 | 
            +
                    /* save reps for next block */
         | 
| 179 | 
            +
                    rep[0] = offset_1 ? offset_1 : offsetSaved;
         | 
| 180 | 
            +
                    rep[1] = offset_2 ? offset_2 : offsetSaved;
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    /* Return the last literals size */
         | 
| 183 | 
            +
                    return (size_t)(iend - anchor);
         | 
| 184 | 
            +
             | 
| 185 | 
            +
            _search_next_long:
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    /* check prefix long +1 match */
         | 
| 188 | 
            +
                    if (idxl1 > prefixLowestIndex) {
         | 
| 189 | 
            +
                        if (MEM_read64(matchl1) == MEM_read64(ip1)) {
         | 
| 190 | 
            +
                            ip = ip1;
         | 
| 191 | 
            +
                            mLength = ZSTD_count(ip+8, matchl1+8, iend) + 8;
         | 
| 192 | 
            +
                            offset = (U32)(ip-matchl1);
         | 
| 193 | 
            +
                            while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */
         | 
| 194 | 
            +
                            goto _match_found;
         | 
| 195 | 
            +
                        }
         | 
| 196 | 
            +
                    }
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                    /* if no long +1 match, explore the short match we found */
         | 
| 199 | 
            +
                    mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4;
         | 
| 200 | 
            +
                    offset = (U32)(ip - matchs0);
         | 
| 201 | 
            +
                    while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                    /* fall-through */
         | 
| 204 | 
            +
             | 
| 205 | 
            +
            _match_found: /* requires ip, offset, mLength */
         | 
| 206 | 
            +
                    offset_2 = offset_1;
         | 
| 207 | 
            +
                    offset_1 = offset;
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                    if (step < 4) {
         | 
| 210 | 
            +
                        /* It is unsafe to write this value back to the hashtable when ip1 is
         | 
| 211 | 
            +
                         * greater than or equal to the new ip we will have after we're done
         | 
| 212 | 
            +
                         * processing this match. Rather than perform that test directly
         | 
| 213 | 
            +
                         * (ip1 >= ip + mLength), which costs speed in practice, we do a simpler
         | 
| 214 | 
            +
                         * more predictable test. The minmatch even if we take a short match is
         | 
| 215 | 
            +
                         * 4 bytes, so as long as step, the distance between ip and ip1
         | 
| 216 | 
            +
                         * (initially) is less than 4, we know ip1 < new ip. */
         | 
| 217 | 
            +
                        hashLong[hl1] = (U32)(ip1 - base);
         | 
| 218 | 
            +
                    }
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                    ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength);
         | 
| 221 | 
            +
             | 
| 222 | 
            +
            _match_stored:
         | 
| 223 | 
            +
                    /* match found */
         | 
| 224 | 
            +
                    ip += mLength;
         | 
| 225 | 
            +
                    anchor = ip;
         | 
| 226 | 
            +
             | 
| 227 | 
            +
                    if (ip <= ilimit) {
         | 
| 228 | 
            +
                        /* Complementary insertion */
         | 
| 229 | 
            +
                        /* done after iLimit test, as candidates could be > iend-8 */
         | 
| 230 | 
            +
                        {   U32 const indexToInsert = curr+2;
         | 
| 231 | 
            +
                            hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert;
         | 
| 232 | 
            +
                            hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base);
         | 
| 233 | 
            +
                            hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert;
         | 
| 234 | 
            +
                            hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base);
         | 
| 235 | 
            +
                        }
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                        /* check immediate repcode */
         | 
| 238 | 
            +
                        while ( (ip <= ilimit)
         | 
| 239 | 
            +
                             && ( (offset_2>0)
         | 
| 240 | 
            +
                                & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
         | 
| 241 | 
            +
                            /* store sequence */
         | 
| 242 | 
            +
                            size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
         | 
| 243 | 
            +
                            U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff;  /* swap offset_2 <=> offset_1 */
         | 
| 244 | 
            +
                            hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base);
         | 
| 245 | 
            +
                            hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base);
         | 
| 246 | 
            +
                            ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, rLength);
         | 
| 247 | 
            +
                            ip += rLength;
         | 
| 248 | 
            +
                            anchor = ip;
         | 
| 249 | 
            +
                            continue;   /* faster when present ... (?) */
         | 
| 250 | 
            +
                        }
         | 
| 251 | 
            +
                    }
         | 
| 252 | 
            +
                }
         | 
| 253 | 
            +
            }
         | 
| 254 | 
            +
             | 
| 255 | 
            +
             | 
| 256 | 
            +
            FORCE_INLINE_TEMPLATE
         | 
| 257 | 
            +
            size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic(
         | 
| 52 258 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| 53 259 | 
             
                    void const* src, size_t srcSize,
         | 
| 54 | 
            -
                    U32 const mls /* template  | 
| 260 | 
            +
                    U32 const mls /* template */)
         | 
| 55 261 | 
             
            {
         | 
| 56 262 | 
             
                ZSTD_compressionParameters const* cParams = &ms->cParams;
         | 
| 57 263 | 
             
                U32* const hashLong = ms->hashTable;
         | 
| @@ -72,54 +278,30 @@ size_t ZSTD_compressBlock_doubleFast_generic( | |
| 72 278 | 
             
                U32 offsetSaved = 0;
         | 
| 73 279 |  | 
| 74 280 | 
             
                const ZSTD_matchState_t* const dms = ms->dictMatchState;
         | 
| 75 | 
            -
                const ZSTD_compressionParameters* const dictCParams =
         | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
                const U32 | 
| 79 | 
            -
             | 
| 80 | 
            -
                const  | 
| 81 | 
            -
             | 
| 82 | 
            -
                const U32  | 
| 83 | 
            -
             | 
| 84 | 
            -
                const  | 
| 85 | 
            -
                                                 dms->window.base : NULL;
         | 
| 86 | 
            -
                const BYTE* const dictStart    = dictMode == ZSTD_dictMatchState ?
         | 
| 87 | 
            -
                                                 dictBase + dictStartIndex : NULL;
         | 
| 88 | 
            -
                const BYTE* const dictEnd      = dictMode == ZSTD_dictMatchState ?
         | 
| 89 | 
            -
                                                 dms->window.nextSrc : NULL;
         | 
| 90 | 
            -
                const U32 dictIndexDelta       = dictMode == ZSTD_dictMatchState ?
         | 
| 91 | 
            -
                                                 prefixLowestIndex - (U32)(dictEnd - dictBase) :
         | 
| 92 | 
            -
                                                 0;
         | 
| 93 | 
            -
                const U32 dictHBitsL           = dictMode == ZSTD_dictMatchState ?
         | 
| 94 | 
            -
                                                 dictCParams->hashLog : hBitsL;
         | 
| 95 | 
            -
                const U32 dictHBitsS           = dictMode == ZSTD_dictMatchState ?
         | 
| 96 | 
            -
                                                 dictCParams->chainLog : hBitsS;
         | 
| 281 | 
            +
                const ZSTD_compressionParameters* const dictCParams = &dms->cParams;
         | 
| 282 | 
            +
                const U32* const dictHashLong  = dms->hashTable;
         | 
| 283 | 
            +
                const U32* const dictHashSmall = dms->chainTable;
         | 
| 284 | 
            +
                const U32 dictStartIndex       = dms->window.dictLimit;
         | 
| 285 | 
            +
                const BYTE* const dictBase     = dms->window.base;
         | 
| 286 | 
            +
                const BYTE* const dictStart    = dictBase + dictStartIndex;
         | 
| 287 | 
            +
                const BYTE* const dictEnd      = dms->window.nextSrc;
         | 
| 288 | 
            +
                const U32 dictIndexDelta       = prefixLowestIndex - (U32)(dictEnd - dictBase);
         | 
| 289 | 
            +
                const U32 dictHBitsL           = dictCParams->hashLog;
         | 
| 290 | 
            +
                const U32 dictHBitsS           = dictCParams->chainLog;
         | 
| 97 291 | 
             
                const U32 dictAndPrefixLength  = (U32)((ip - prefixLowest) + (dictEnd - dictStart));
         | 
| 98 292 |  | 
| 99 | 
            -
                DEBUGLOG(5, " | 
| 100 | 
            -
             | 
| 101 | 
            -
                assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
         | 
| 293 | 
            +
                DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_dictMatchState_generic");
         | 
| 102 294 |  | 
| 103 295 | 
             
                /* if a dictionary is attached, it must be within window range */
         | 
| 104 | 
            -
                 | 
| 105 | 
            -
                    assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex);
         | 
| 106 | 
            -
                }
         | 
| 296 | 
            +
                assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex);
         | 
| 107 297 |  | 
| 108 298 | 
             
                /* init */
         | 
| 109 299 | 
             
                ip += (dictAndPrefixLength == 0);
         | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
                    if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
         | 
| 116 | 
            -
                }
         | 
| 117 | 
            -
                if (dictMode == ZSTD_dictMatchState) {
         | 
| 118 | 
            -
                    /* dictMatchState repCode checks don't currently handle repCode == 0
         | 
| 119 | 
            -
                     * disabling. */
         | 
| 120 | 
            -
                    assert(offset_1 <= dictAndPrefixLength);
         | 
| 121 | 
            -
                    assert(offset_2 <= dictAndPrefixLength);
         | 
| 122 | 
            -
                }
         | 
| 300 | 
            +
             | 
| 301 | 
            +
                /* dictMatchState repCode checks don't currently handle repCode == 0
         | 
| 302 | 
            +
                 * disabling. */
         | 
| 303 | 
            +
                assert(offset_1 <= dictAndPrefixLength);
         | 
| 304 | 
            +
                assert(offset_2 <= dictAndPrefixLength);
         | 
| 123 305 |  | 
| 124 306 | 
             
                /* Main Search Loop */
         | 
| 125 307 | 
             
                while (ip < ilimit) {   /* < instead of <=, because repcode check at (ip+1) */
         | 
| @@ -135,29 +317,18 @@ size_t ZSTD_compressBlock_doubleFast_generic( | |
| 135 317 | 
             
                    const BYTE* matchLong = base + matchIndexL;
         | 
| 136 318 | 
             
                    const BYTE* match = base + matchIndexS;
         | 
| 137 319 | 
             
                    const U32 repIndex = curr + 1 - offset_1;
         | 
| 138 | 
            -
                    const BYTE* repMatch = ( | 
| 139 | 
            -
                                        && repIndex < prefixLowestIndex) ?
         | 
| 320 | 
            +
                    const BYTE* repMatch = (repIndex < prefixLowestIndex) ?
         | 
| 140 321 | 
             
                                           dictBase + (repIndex - dictIndexDelta) :
         | 
| 141 322 | 
             
                                           base + repIndex;
         | 
| 142 323 | 
             
                    hashLong[h2] = hashSmall[h] = curr;   /* update hash tables */
         | 
| 143 324 |  | 
| 144 | 
            -
                    /* check  | 
| 145 | 
            -
                    if ( | 
| 146 | 
            -
                        && ((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
         | 
| 325 | 
            +
                    /* check repcode */
         | 
| 326 | 
            +
                    if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
         | 
| 147 327 | 
             
                        && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
         | 
| 148 328 | 
             
                        const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
         | 
| 149 329 | 
             
                        mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
         | 
| 150 330 | 
             
                        ip++;
         | 
| 151 | 
            -
                        ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend,  | 
| 152 | 
            -
                        goto _match_stored;
         | 
| 153 | 
            -
                    }
         | 
| 154 | 
            -
             | 
| 155 | 
            -
                    /* check noDict repcode */
         | 
| 156 | 
            -
                    if ( dictMode == ZSTD_noDict
         | 
| 157 | 
            -
                      && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) {
         | 
| 158 | 
            -
                        mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
         | 
| 159 | 
            -
                        ip++;
         | 
| 160 | 
            -
                        ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH);
         | 
| 331 | 
            +
                        ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength);
         | 
| 161 332 | 
             
                        goto _match_stored;
         | 
| 162 333 | 
             
                    }
         | 
| 163 334 |  | 
| @@ -169,7 +340,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( | |
| 169 340 | 
             
                            while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
         | 
| 170 341 | 
             
                            goto _match_found;
         | 
| 171 342 | 
             
                        }
         | 
| 172 | 
            -
                    } else  | 
| 343 | 
            +
                    } else {
         | 
| 173 344 | 
             
                        /* check dictMatchState long match */
         | 
| 174 345 | 
             
                        U32 const dictMatchIndexL = dictHashLong[dictHL];
         | 
| 175 346 | 
             
                        const BYTE* dictMatchL = dictBase + dictMatchIndexL;
         | 
| @@ -187,7 +358,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( | |
| 187 358 | 
             
                        if (MEM_read32(match) == MEM_read32(ip)) {
         | 
| 188 359 | 
             
                            goto _search_next_long;
         | 
| 189 360 | 
             
                        }
         | 
| 190 | 
            -
                    } else  | 
| 361 | 
            +
                    } else {
         | 
| 191 362 | 
             
                        /* check dictMatchState short match */
         | 
| 192 363 | 
             
                        U32 const dictMatchIndexS = dictHashSmall[dictHS];
         | 
| 193 364 | 
             
                        match = dictBase + dictMatchIndexS;
         | 
| @@ -220,7 +391,7 @@ _search_next_long: | |
| 220 391 | 
             
                                while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
         | 
| 221 392 | 
             
                                goto _match_found;
         | 
| 222 393 | 
             
                            }
         | 
| 223 | 
            -
                        } else  | 
| 394 | 
            +
                        } else {
         | 
| 224 395 | 
             
                            /* check dict long +1 match */
         | 
| 225 396 | 
             
                            U32 const dictMatchIndexL3 = dictHashLong[dictHLNext];
         | 
| 226 397 | 
             
                            const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3;
         | 
| @@ -234,7 +405,7 @@ _search_next_long: | |
| 234 405 | 
             
                    }   }   }
         | 
| 235 406 |  | 
| 236 407 | 
             
                    /* if no long +1 match, explore the short match we found */
         | 
| 237 | 
            -
                    if ( | 
| 408 | 
            +
                    if (matchIndexS < prefixLowestIndex) {
         | 
| 238 409 | 
             
                        mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4;
         | 
| 239 410 | 
             
                        offset = (U32)(curr - matchIndexS);
         | 
| 240 411 | 
             
                        while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
         | 
| @@ -244,13 +415,11 @@ _search_next_long: | |
| 244 415 | 
             
                        while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
         | 
| 245 416 | 
             
                    }
         | 
| 246 417 |  | 
| 247 | 
            -
                    /* fall-through */
         | 
| 248 | 
            -
             | 
| 249 418 | 
             
            _match_found:
         | 
| 250 419 | 
             
                    offset_2 = offset_1;
         | 
| 251 420 | 
             
                    offset_1 = offset;
         | 
| 252 421 |  | 
| 253 | 
            -
                    ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset | 
| 422 | 
            +
                    ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength);
         | 
| 254 423 |  | 
| 255 424 | 
             
            _match_stored:
         | 
| 256 425 | 
             
                    /* match found */
         | 
| @@ -268,43 +437,27 @@ _match_stored: | |
| 268 437 | 
             
                        }
         | 
| 269 438 |  | 
| 270 439 | 
             
                        /* check immediate repcode */
         | 
| 271 | 
            -
                         | 
| 272 | 
            -
                             | 
| 273 | 
            -
             | 
| 274 | 
            -
             | 
| 275 | 
            -
             | 
| 276 | 
            -
                                     | 
| 277 | 
            -
             | 
| 278 | 
            -
             | 
| 279 | 
            -
                                 | 
| 280 | 
            -
             | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
             | 
| 285 | 
            -
             | 
| 286 | 
            -
                                    hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
         | 
| 287 | 
            -
                                    ip += repLength2;
         | 
| 288 | 
            -
                                    anchor = ip;
         | 
| 289 | 
            -
                                    continue;
         | 
| 290 | 
            -
                                }
         | 
| 291 | 
            -
                                break;
         | 
| 292 | 
            -
                        }   }
         | 
| 293 | 
            -
             | 
| 294 | 
            -
                        if (dictMode == ZSTD_noDict) {
         | 
| 295 | 
            -
                            while ( (ip <= ilimit)
         | 
| 296 | 
            -
                                 && ( (offset_2>0)
         | 
| 297 | 
            -
                                    & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
         | 
| 298 | 
            -
                                /* store sequence */
         | 
| 299 | 
            -
                                size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
         | 
| 300 | 
            -
                                U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff;  /* swap offset_2 <=> offset_1 */
         | 
| 301 | 
            -
                                hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base);
         | 
| 302 | 
            -
                                hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base);
         | 
| 303 | 
            -
                                ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, rLength-MINMATCH);
         | 
| 304 | 
            -
                                ip += rLength;
         | 
| 440 | 
            +
                        while (ip <= ilimit) {
         | 
| 441 | 
            +
                            U32 const current2 = (U32)(ip-base);
         | 
| 442 | 
            +
                            U32 const repIndex2 = current2 - offset_2;
         | 
| 443 | 
            +
                            const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ?
         | 
| 444 | 
            +
                                    dictBase + repIndex2 - dictIndexDelta :
         | 
| 445 | 
            +
                                    base + repIndex2;
         | 
| 446 | 
            +
                            if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */)
         | 
| 447 | 
            +
                               && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
         | 
| 448 | 
            +
                                const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend;
         | 
| 449 | 
            +
                                size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4;
         | 
| 450 | 
            +
                                U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset;   /* swap offset_2 <=> offset_1 */
         | 
| 451 | 
            +
                                ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2);
         | 
| 452 | 
            +
                                hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2;
         | 
| 453 | 
            +
                                hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
         | 
| 454 | 
            +
                                ip += repLength2;
         | 
| 305 455 | 
             
                                anchor = ip;
         | 
| 306 | 
            -
                                continue; | 
| 307 | 
            -
             | 
| 456 | 
            +
                                continue;
         | 
| 457 | 
            +
                            }
         | 
| 458 | 
            +
                            break;
         | 
| 459 | 
            +
                        }
         | 
| 460 | 
            +
                    }
         | 
| 308 461 | 
             
                }   /* while (ip < ilimit) */
         | 
| 309 462 |  | 
| 310 463 | 
             
                /* save reps for next block */
         | 
| @@ -315,6 +468,24 @@ _match_stored: | |
| 315 468 | 
             
                return (size_t)(iend - anchor);
         | 
| 316 469 | 
             
            }
         | 
| 317 470 |  | 
| 471 | 
            +
            #define ZSTD_GEN_DFAST_FN(dictMode, mls)                                                                 \
         | 
| 472 | 
            +
                static size_t ZSTD_compressBlock_doubleFast_##dictMode##_##mls(                                      \
         | 
| 473 | 
            +
                        ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],                          \
         | 
| 474 | 
            +
                        void const* src, size_t srcSize)                                                             \
         | 
| 475 | 
            +
                {                                                                                                    \
         | 
| 476 | 
            +
                    return ZSTD_compressBlock_doubleFast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls); \
         | 
| 477 | 
            +
                }
         | 
| 478 | 
            +
             | 
| 479 | 
            +
            ZSTD_GEN_DFAST_FN(noDict, 4)
         | 
| 480 | 
            +
            ZSTD_GEN_DFAST_FN(noDict, 5)
         | 
| 481 | 
            +
            ZSTD_GEN_DFAST_FN(noDict, 6)
         | 
| 482 | 
            +
            ZSTD_GEN_DFAST_FN(noDict, 7)
         | 
| 483 | 
            +
             | 
| 484 | 
            +
            ZSTD_GEN_DFAST_FN(dictMatchState, 4)
         | 
| 485 | 
            +
            ZSTD_GEN_DFAST_FN(dictMatchState, 5)
         | 
| 486 | 
            +
            ZSTD_GEN_DFAST_FN(dictMatchState, 6)
         | 
| 487 | 
            +
            ZSTD_GEN_DFAST_FN(dictMatchState, 7)
         | 
| 488 | 
            +
             | 
| 318 489 |  | 
| 319 490 | 
             
            size_t ZSTD_compressBlock_doubleFast(
         | 
| 320 491 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| @@ -325,13 +496,13 @@ size_t ZSTD_compressBlock_doubleFast( | |
| 325 496 | 
             
                {
         | 
| 326 497 | 
             
                default: /* includes case 3 */
         | 
| 327 498 | 
             
                case 4 :
         | 
| 328 | 
            -
                    return  | 
| 499 | 
            +
                    return ZSTD_compressBlock_doubleFast_noDict_4(ms, seqStore, rep, src, srcSize);
         | 
| 329 500 | 
             
                case 5 :
         | 
| 330 | 
            -
                    return  | 
| 501 | 
            +
                    return ZSTD_compressBlock_doubleFast_noDict_5(ms, seqStore, rep, src, srcSize);
         | 
| 331 502 | 
             
                case 6 :
         | 
| 332 | 
            -
                    return  | 
| 503 | 
            +
                    return ZSTD_compressBlock_doubleFast_noDict_6(ms, seqStore, rep, src, srcSize);
         | 
| 333 504 | 
             
                case 7 :
         | 
| 334 | 
            -
                    return  | 
| 505 | 
            +
                    return ZSTD_compressBlock_doubleFast_noDict_7(ms, seqStore, rep, src, srcSize);
         | 
| 335 506 | 
             
                }
         | 
| 336 507 | 
             
            }
         | 
| 337 508 |  | 
| @@ -345,13 +516,13 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState( | |
| 345 516 | 
             
                {
         | 
| 346 517 | 
             
                default: /* includes case 3 */
         | 
| 347 518 | 
             
                case 4 :
         | 
| 348 | 
            -
                    return  | 
| 519 | 
            +
                    return ZSTD_compressBlock_doubleFast_dictMatchState_4(ms, seqStore, rep, src, srcSize);
         | 
| 349 520 | 
             
                case 5 :
         | 
| 350 | 
            -
                    return  | 
| 521 | 
            +
                    return ZSTD_compressBlock_doubleFast_dictMatchState_5(ms, seqStore, rep, src, srcSize);
         | 
| 351 522 | 
             
                case 6 :
         | 
| 352 | 
            -
                    return  | 
| 523 | 
            +
                    return ZSTD_compressBlock_doubleFast_dictMatchState_6(ms, seqStore, rep, src, srcSize);
         | 
| 353 524 | 
             
                case 7 :
         | 
| 354 | 
            -
                    return  | 
| 525 | 
            +
                    return ZSTD_compressBlock_doubleFast_dictMatchState_7(ms, seqStore, rep, src, srcSize);
         | 
| 355 526 | 
             
                }
         | 
| 356 527 | 
             
            }
         | 
| 357 528 |  | 
| @@ -387,7 +558,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 387 558 |  | 
| 388 559 | 
             
                /* if extDict is invalidated due to maxDistance, switch to "regular" variant */
         | 
| 389 560 | 
             
                if (prefixStartIndex == dictStartIndex)
         | 
| 390 | 
            -
                    return  | 
| 561 | 
            +
                    return ZSTD_compressBlock_doubleFast(ms, seqStore, rep, src, srcSize);
         | 
| 391 562 |  | 
| 392 563 | 
             
                /* Search Loop */
         | 
| 393 564 | 
             
                while (ip < ilimit) {  /* < instead of <=, because (ip+1) */
         | 
| @@ -409,12 +580,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 409 580 | 
             
                    hashSmall[hSmall] = hashLong[hLong] = curr;   /* update hash table */
         | 
| 410 581 |  | 
| 411 582 | 
             
                    if ((((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex doesn't overlap dict + prefix */
         | 
| 412 | 
            -
                        & (offset_1  | 
| 583 | 
            +
                        & (offset_1 <= curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */
         | 
| 413 584 | 
             
                      && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
         | 
| 414 585 | 
             
                        const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend;
         | 
| 415 586 | 
             
                        mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4;
         | 
| 416 587 | 
             
                        ip++;
         | 
| 417 | 
            -
                        ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend,  | 
| 588 | 
            +
                        ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength);
         | 
| 418 589 | 
             
                    } else {
         | 
| 419 590 | 
             
                        if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) {
         | 
| 420 591 | 
             
                            const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend;
         | 
| @@ -425,7 +596,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 425 596 | 
             
                            while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; }   /* catch up */
         | 
| 426 597 | 
             
                            offset_2 = offset_1;
         | 
| 427 598 | 
             
                            offset_1 = offset;
         | 
| 428 | 
            -
                            ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset | 
| 599 | 
            +
                            ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength);
         | 
| 429 600 |  | 
| 430 601 | 
             
                        } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) {
         | 
| 431 602 | 
             
                            size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
         | 
| @@ -450,7 +621,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 450 621 | 
             
                            }
         | 
| 451 622 | 
             
                            offset_2 = offset_1;
         | 
| 452 623 | 
             
                            offset_1 = offset;
         | 
| 453 | 
            -
                            ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset | 
| 624 | 
            +
                            ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength);
         | 
| 454 625 |  | 
| 455 626 | 
             
                        } else {
         | 
| 456 627 | 
             
                            ip += ((ip-anchor) >> kSearchStrength) + 1;
         | 
| @@ -477,12 +648,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 477 648 | 
             
                            U32 const repIndex2 = current2 - offset_2;
         | 
| 478 649 | 
             
                            const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2;
         | 
| 479 650 | 
             
                            if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3)   /* intentional overflow : ensure repIndex2 doesn't overlap dict + prefix */
         | 
| 480 | 
            -
                                & (offset_2  | 
| 651 | 
            +
                                & (offset_2 <= current2 - dictStartIndex))
         | 
| 481 652 | 
             
                              && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
         | 
| 482 653 | 
             
                                const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend;
         | 
| 483 654 | 
             
                                size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4;
         | 
| 484 655 | 
             
                                U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset;   /* swap offset_2 <=> offset_1 */
         | 
| 485 | 
            -
                                ZSTD_storeSeq(seqStore, 0, anchor, iend,  | 
| 656 | 
            +
                                ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2);
         | 
| 486 657 | 
             
                                hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2;
         | 
| 487 658 | 
             
                                hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
         | 
| 488 659 | 
             
                                ip += repLength2;
         | 
| @@ -500,6 +671,10 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( | |
| 500 671 | 
             
                return (size_t)(iend - anchor);
         | 
| 501 672 | 
             
            }
         | 
| 502 673 |  | 
| 674 | 
            +
            ZSTD_GEN_DFAST_FN(extDict, 4)
         | 
| 675 | 
            +
            ZSTD_GEN_DFAST_FN(extDict, 5)
         | 
| 676 | 
            +
            ZSTD_GEN_DFAST_FN(extDict, 6)
         | 
| 677 | 
            +
            ZSTD_GEN_DFAST_FN(extDict, 7)
         | 
| 503 678 |  | 
| 504 679 | 
             
            size_t ZSTD_compressBlock_doubleFast_extDict(
         | 
| 505 680 | 
             
                    ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
         | 
| @@ -510,12 +685,12 @@ size_t ZSTD_compressBlock_doubleFast_extDict( | |
| 510 685 | 
             
                {
         | 
| 511 686 | 
             
                default: /* includes case 3 */
         | 
| 512 687 | 
             
                case 4 :
         | 
| 513 | 
            -
                    return  | 
| 688 | 
            +
                    return ZSTD_compressBlock_doubleFast_extDict_4(ms, seqStore, rep, src, srcSize);
         | 
| 514 689 | 
             
                case 5 :
         | 
| 515 | 
            -
                    return  | 
| 690 | 
            +
                    return ZSTD_compressBlock_doubleFast_extDict_5(ms, seqStore, rep, src, srcSize);
         | 
| 516 691 | 
             
                case 6 :
         | 
| 517 | 
            -
                    return  | 
| 692 | 
            +
                    return ZSTD_compressBlock_doubleFast_extDict_6(ms, seqStore, rep, src, srcSize);
         | 
| 518 693 | 
             
                case 7 :
         | 
| 519 | 
            -
                    return  | 
| 694 | 
            +
                    return ZSTD_compressBlock_doubleFast_extDict_7(ms, seqStore, rep, src, srcSize);
         | 
| 520 695 | 
             
                }
         | 
| 521 696 | 
             
            }
         | 
| 
            File without changes
         |