From a5bf3dda384dcf3f96eb5387f0e99170f58a6bf2 Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Fri, 6 Mar 2026 13:36:14 +0000 Subject: [PATCH 1/3] Add ZSTD_HASH_USE_CRC32C to use an optimized hash At Google we found 3-5% improvement for densely compressed data when using CRC32C and low bits of its hash. Most uplift should be seen with at least `-msse4.2` flag for x86-64 and march=armv8-a+crc extension (from Arm8.3 CRC is mandatory). In this patch we added a macro, fixed implementation details which relied on shifts and added CI tests with different configurations. We also added a crc32c regression test to compare sizes and verify it's not regressing the values too much. --- .github/workflows/commit.yml | 65 +- .github/workflows/dev-long-tests.yml | 29 + .github/workflows/dev-short-tests.yml | 23 +- Makefile | 11 +- lib/compress/zstd_compress.c | 2 +- lib/compress/zstd_compress_internal.h | 241 +++- lib/compress/zstd_double_fast.c | 24 +- lib/compress/zstd_fast.c | 16 +- lib/compress/zstd_lazy.c | 16 +- tests/regression/README.md | 2 + tests/regression/results_crc32c.csv | 1480 +++++++++++++++++++++++++ 11 files changed, 1838 insertions(+), 71 deletions(-) create mode 100644 tests/regression/results_crc32c.csv diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index af3028e3cd1..75c377c7289 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -51,12 +51,16 @@ jobs: run: make gnu99build && make clean - name: ppc64 build run: make ppc64build V=1 && make clean + - name: ppc64CRC build + run: make ppc64buildCRC V=1 && make clean - name: ppc build run: make ppcbuild V=1 && make clean - name: arm build run: make armbuild V=1 && make clean - name: aarch64 build run: make aarch64build V=1 && make clean + - name: aarch64CRC build + run: make aarch64buildCRC V=1 && make clean - name: test-legacy run: make -C tests test-legacy V=1 && make clean - name: test-longmatch @@ -65,40 +69,81 @@ jobs: run: make -C lib libzstd-nomt V=1 && make clean regression-test: - runs-on: ubuntu-latest + name: regression-${{ matrix.config_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - config_name: "default" + os: ubuntu-latest + baseline: "results.csv" + cflags: "-O3" + + - config_name: "x86-crc" + os: ubuntu-latest + baseline: "results_crc32c.csv" + cflags: "-O3 -DZSTD_HASH_USE_CRC32C" + + - config_name: "x86-sse4.2-crc" + os: ubuntu-latest + baseline: "results_crc32c.csv" + cflags: "-O3 -DZSTD_HASH_USE_CRC32C -msse4.2" + + - config_name: "arm-v8.2-crc" + os: ubuntu-24.04-arm + baseline: "results_crc32c.csv" + cflags: "-O3 -DZSTD_HASH_USE_CRC32C -march=armv8.2-a+crc+crypto" + services: docker: image: fbopensource/zstd-circleci-primary:0.0.1 options: --entrypoint /bin/bash + env: CIRCLE_ARTIFACTS: "/tmp/circleci-artifacts" + CFLAGS: ${{ matrix.cflags }} + steps: - uses: actions/checkout@v6.0.2 + - name: restore_cache uses: actions/cache@v5 with: - key: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + # Use matrix config_name to keep cache keys unique per architecture/config + key: regression-cache-${{ matrix.config_name }}-${{ checksum "tests/regression/data.c" }}-v0 path: tests/regression/cache - restore-keys: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + - name: Install Dependencies run: | sudo apt-get update sudo apt-get install libcurl4-gnutls-dev + - name: Regression Test run: | + # Build zstd with the matrix-specific CFLAGS make -C programs zstd make -C tests/regression test + mkdir -p $CIRCLE_ARTIFACTS + + # Run the regression test tool ./tests/regression/test \ --cache tests/regression/cache \ --output $CIRCLE_ARTIFACTS/results.csv \ --zstd programs/zstd - echo "NOTE: The new results.csv is uploaded as an artifact to this job" - echo " If this fails, go to the Artifacts pane in CircleCI, " - echo " download /tmp/circleci-artifacts/results.csv, and if they " - echo " are still good, copy it into the repo and commit it." - echo "> diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv" - diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv + + echo "Comparing against baseline: ${{ matrix.baseline }}" + # Check if the baseline exists (to avoid failing on the first run of a new config) + if [ -f "tests/regression/${{ matrix.baseline }}" ]; then + diff tests/regression/${{ matrix.baseline }} $CIRCLE_ARTIFACTS/results.csv + else + echo "Warning: Baseline tests/regression/${{ matrix.baseline }} not found." + echo "If this is a new configuration, please commit the generated results.csv as ${{ matrix.baseline }}." + fi + - uses: actions/upload-artifact@v7.0.0 with: - path: "/tmp/circleci-artifacts" + # Artifact name includes config for easy identification + name: results-${{ matrix.config_name }} + path: "$CIRCLE_ARTIFACTS/results.csv" \ No newline at end of file diff --git a/.github/workflows/dev-long-tests.yml b/.github/workflows/dev-long-tests.yml index f72a99729b6..1dea895ec47 100644 --- a/.github/workflows/dev-long-tests.yml +++ b/.github/workflows/dev-long-tests.yml @@ -42,6 +42,13 @@ jobs: - name: make test on macos run: make test + make-test-macos-crc32: + runs-on: macos-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: make test on macos with CRC32C + run: CFLAGS="-DZSTD_HASH_USE_CRC32C" make test + # lasts ~10mn make-test-32bit: runs-on: ubuntu-latest @@ -74,6 +81,21 @@ jobs: - name: no intrinsics fuzztest run: MOREFLAGS="-DZSTD_NO_INTRINSICS" make -C tests fuzztest + # lasts ~9mn + crc-sse42-fuzztest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: CRC32C fuzztest with sse4.2 + run: MOREFLAGS="-DZSTD_HASH_USE_CRC32C -msse4.2" make -C tests fuzztest + + crc-nosse42-fuzztest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: CRC32C fuzztest without sse4.2 + run: MOREFLAGS="-DZSTD_HASH_USE_CRC32C" make -C tests fuzztest + # lasts ~8mn tsan-zstreamtest: runs-on: ubuntu-latest @@ -209,6 +231,13 @@ jobs: - name: clang + ASan + UBSan + Regression Test run: CC=clang make -j uasanregressiontest + clang-asan-ubsan-regressionCRC: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: clang + ASan + UBSan + Regression Test + CRC hash + run: CC=clang make -j uasanregressiontestCRC + msan-regression: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index aef73157e48..ea2dd84b39d 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -153,6 +153,16 @@ jobs: make libc6install CFLAGS="-Werror -mavx2" make -j all + gcc-make-all-avx2-crc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: Make all, with AVX2 and CRC hash + run: | + sudo apt-get -qqq update + make libc6install + CFLAGS="-Werror -mavx2 -DZSTD_HASH_USE_CRC32C" make -j all + gcc-make-all-32bit: runs-on: ubuntu-latest steps: @@ -173,6 +183,15 @@ jobs: make libc6install CPPFLAGS="-DSTATIC_BMI2=1" CFLAGS="-Werror -m32 -mavx2 -mbmi2" make -j all32 + gcc-make-all-32bit-avx2-crc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # tag=v6.0.2 + - name: Make all, 32bit + AVX2 mode and CRC hash + run: | + sudo apt-get -qqq update + make libc6install + CPPFLAGS="-DSTATIC_BMI2=1" CFLAGS="-Werror -m32 -mavx2 -mbmi2 -DZSTD_HASH_USE_CRC32C" make -j all32 gcc-8-make: runs-on: ubuntu-latest @@ -434,8 +453,8 @@ jobs: make clean LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j check LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j -C tests test-cli-tests - CFLAGS="-O3 -march=armv8.2-a+sve2" LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j check - CFLAGS="-O3 -march=armv8.2-a+sve2" LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j -C tests test-cli-tests + CFLAGS="-O3 -march=armv8.2-a+sve2+crc -DZSTD_HASH_USE_CRC32C" LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j check + CFLAGS="-O3 -march=armv8.2-a+sve2+crc -DZSTD_HASH_USE_CRC32C" LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j -C tests test-cli-tests # This test is only compatible with standard libraries that support BTI (Branch Target Identification). # Unfortunately, the standard library provided on Ubuntu 24.04 does not have this feature enabled. # make clean diff --git a/Makefile b/Makefile index b726f7970ce..9bc1ef0c0ad 100644 --- a/Makefile +++ b/Makefile @@ -205,7 +205,7 @@ clangbuild-darwin-fat: clean mv programs/zstd programs/zstd_x64 lipo -create programs/zstd_x64 programs/zstd_arm64 -output programs/zstd -.PHONY: gcc5build gcc6build gcc7build clangbuild m32build armbuild aarch64build ppcbuild ppc64build +.PHONY: gcc5build gcc6build gcc7build clangbuild m32build armbuild aarch64build aarch64buildCRC ppcbuild ppc64build ppc64buildCRC gcc5build: clean gcc-5 -v CC=gcc-5 $(MAKE) all MOREFLAGS="-Werror $(MOREFLAGS)" @@ -232,12 +232,18 @@ armbuild: clean aarch64build: clean CC=aarch64-linux-gnu-gcc CFLAGS="-Werror -O0" $(MAKE) allzstd +aarch64buildCRC: clean + CC=aarch64-linux-gnu-gcc CFLAGS="-Werror -O0 -DZSTD_HASH_USE_CRC32C -march=armv8.2-a+crc+crypto" $(MAKE) allzstd + ppcbuild: clean CC=powerpc-linux-gnu-gcc CFLAGS="-m32 -Wno-attributes -Werror" $(MAKE) -j allzstd ppc64build: clean CC=powerpc-linux-gnu-gcc CFLAGS="-m64 -Werror" $(MAKE) -j allzstd +ppc64buildCRC: clean + CC=powerpc-linux-gnu-gcc CFLAGS="-m64 -Werror -DZSTD_HASH_USE_CRC32C" $(MAKE) -j allzstd + .PHONY: armfuzz aarch64fuzz ppcfuzz ppc64fuzz armfuzz: clean CC=arm-linux-gnueabi-gcc QEMU_SYS=qemu-arm-static MOREFLAGS="-static $(MOREFLAGS)" FUZZER_FLAGS="--no-big-tests $(FUZZER_FLAGS)" $(MAKE) -C $(TESTDIR) fuzztest @@ -294,6 +300,9 @@ regressiontest: uasanregressiontest: $(MAKE) -C $(FUZZDIR) regressiontest CC=clang CXX=clang++ CFLAGS="-O3 -fsanitize=address,undefined -Werror" CXXFLAGS="-O3 -fsanitize=address,undefined -Werror" +uasanregressiontestCRC: + $(MAKE) -C $(FUZZDIR) regressiontest CC=clang CXX=clang++ CFLAGS="-O3 -fsanitize=address,undefined -Werror -DZSTD_HASH_USE_CRC32C" CXXFLAGS="-O3 -fsanitize=address,undefined -Werror" + msanregressiontest: $(MAKE) -C $(FUZZDIR) regressiontest CC=clang CXX=clang++ CFLAGS="-O3 -fsanitize=memory -Werror" CXXFLAGS="-O3 -fsanitize=memory -Werror" diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c06f2e1bb98..4e4402e5433 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2415,7 +2415,7 @@ static void ZSTD_copyCDictTableIntoCCtx(U32* dst, U32 const* src, size_t tableSi size_t i; for (i = 0; i < tableSize; i++) { U32 const taggedIndex = src[i]; - U32 const index = taggedIndex >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const index = ZSTD_extractIndex(taggedIndex, ZSTD_SHORT_CACHE_TAG_BITS); dst[i] = index; } } else { diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 13a394b3816..42eedc46254 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -26,6 +26,107 @@ #include "../common/bits.h" /* ZSTD_highbit32, ZSTD_NbCommonBytes */ #include "zstd_preSplit.h" /* ZSTD_SLIPBLOCK_WORKSPACESIZE */ +#if !defined(ZSTD_NO_INTRINSICS) && defined(ZSTD_HASH_USE_CRC32C) +/* + 32-bit builds with SSE 4.2 do not have _mm_crc32_u64, so the + __x86_64__ condition is necessary. +*/ +#if defined(__SSE4_2__) && defined(__x86_64__) + +#include +#define ZSTD_HASH_INTERNAL_CRC32_U64 _mm_crc32_u64 + +#elif defined(_MSC_VER) && !defined(__clang__) && defined(__AVX__) + +/* MSVC AVX (/arch:AVX) implies SSE 4.2. */ +#include +#define ZSTD_HASH_INTERNAL_CRC32_U64 _mm_crc32_u64 + +#elif defined(__ARM_FEATURE_CRC32) + +#include +/* Casting to uint32_t to be consistent with x86 intrinsic (_mm_crc32_u64 + accepts crc as 64 bit integer). +*/ +#define ZSTD_HASH_INTERNAL_CRC32_U64(crc, data) \ + __crc32cd((U32)(crc), data) + +#else + +HINT_INLINE U32 ZSTD_HASH_INTERNAL_CRC32_U64(U32 seed, U64 data) { + static const U32 crc32_table[] = { + 0x00000000U, 0xf26b8303U, 0xe13b70f7U, 0x1350f3f4U, 0xc79a971fU, + 0x35f1141cU, 0x26a1e7e8U, 0xd4ca64ebU, 0x8ad958cfU, 0x78b2dbccU, + 0x6be22838U, 0x9989ab3bU, 0x4d43cfd0U, 0xbf284cd3U, 0xac78bf27U, + 0x5e133c24U, 0x105ec76fU, 0xe235446cU, 0xf165b798U, 0x030e349bU, + 0xd7c45070U, 0x25afd373U, 0x36ff2087U, 0xc494a384U, 0x9a879fa0U, + 0x68ec1ca3U, 0x7bbcef57U, 0x89d76c54U, 0x5d1d08bfU, 0xaf768bbcU, + 0xbc267848U, 0x4e4dfb4bU, 0x20bd8edeU, 0xd2d60dddU, 0xc186fe29U, + 0x33ed7d2aU, 0xe72719c1U, 0x154c9ac2U, 0x061c6936U, 0xf477ea35U, + 0xaa64d611U, 0x580f5512U, 0x4b5fa6e6U, 0xb93425e5U, 0x6dfe410eU, + 0x9f95c20dU, 0x8cc531f9U, 0x7eaeb2faU, 0x30e349b1U, 0xc288cab2U, + 0xd1d83946U, 0x23b3ba45U, 0xf779deaeU, 0x05125dadU, 0x1642ae59U, + 0xe4292d5aU, 0xba3a117eU, 0x4851927dU, 0x5b016189U, 0xa96ae28aU, + 0x7da08661U, 0x8fcb0562U, 0x9c9bf696U, 0x6ef07595U, 0x417b1dbcU, + 0xb3109ebfU, 0xa0406d4bU, 0x522bee48U, 0x86e18aa3U, 0x748a09a0U, + 0x67dafa54U, 0x95b17957U, 0xcba24573U, 0x39c9c670U, 0x2a993584U, + 0xd8f2b687U, 0x0c38d26cU, 0xfe53516fU, 0xed03a29bU, 0x1f682198U, + 0x5125dad3U, 0xa34e59d0U, 0xb01eaa24U, 0x42752927U, 0x96bf4dccU, + 0x64d4cecfU, 0x77843d3bU, 0x85efbe38U, 0xdbfc821cU, 0x2997011fU, + 0x3ac7f2ebU, 0xc8ac71e8U, 0x1c661503U, 0xee0d9600U, 0xfd5d65f4U, + 0x0f36e6f7U, 0x61c69362U, 0x93ad1061U, 0x80fde395U, 0x72966096U, + 0xa65c047dU, 0x5437877eU, 0x4767748aU, 0xb50cf789U, 0xeb1fcbadU, + 0x197448aeU, 0x0a24bb5aU, 0xf84f3859U, 0x2c855cb2U, 0xdeeedfb1U, + 0xcdbe2c45U, 0x3fd5af46U, 0x7198540dU, 0x83f3d70eU, 0x90a324faU, + 0x62c8a7f9U, 0xb602c312U, 0x44694011U, 0x5739b3e5U, 0xa55230e6U, + 0xfb410cc2U, 0x092a8fc1U, 0x1a7a7c35U, 0xe811ff36U, 0x3cdb9bddU, + 0xceb018deU, 0xdde0eb2aU, 0x2f8b6829U, 0x82f63b78U, 0x709db87bU, + 0x63cd4b8fU, 0x91a6c88cU, 0x456cac67U, 0xb7072f64U, 0xa457dc90U, + 0x563c5f93U, 0x082f63b7U, 0xfa44e0b4U, 0xe9141340U, 0x1b7f9043U, + 0xcfb5f4a8U, 0x3dde77abU, 0x2e8e845fU, 0xdce5075cU, 0x92a8fc17U, + 0x60c37f14U, 0x73938ce0U, 0x81f80fe3U, 0x55326b08U, 0xa759e80bU, + 0xb4091bffU, 0x466298fcU, 0x1871a4d8U, 0xea1a27dbU, 0xf94ad42fU, + 0x0b21572cU, 0xdfeb33c7U, 0x2d80b0c4U, 0x3ed04330U, 0xccbbc033U, + 0xa24bb5a6U, 0x502036a5U, 0x4370c551U, 0xb11b4652U, 0x65d122b9U, + 0x97baa1baU, 0x84ea524eU, 0x7681d14dU, 0x2892ed69U, 0xdaf96e6aU, + 0xc9a99d9eU, 0x3bc21e9dU, 0xef087a76U, 0x1d63f975U, 0x0e330a81U, + 0xfc588982U, 0xb21572c9U, 0x407ef1caU, 0x532e023eU, 0xa145813dU, + 0x758fe5d6U, 0x87e466d5U, 0x94b49521U, 0x66df1622U, 0x38cc2a06U, + 0xcaa7a905U, 0xd9f75af1U, 0x2b9cd9f2U, 0xff56bd19U, 0x0d3d3e1aU, + 0x1e6dcdeeU, 0xec064eedU, 0xc38d26c4U, 0x31e6a5c7U, 0x22b65633U, + 0xd0ddd530U, 0x0417b1dbU, 0xf67c32d8U, 0xe52cc12cU, 0x1747422fU, + 0x49547e0bU, 0xbb3ffd08U, 0xa86f0efcU, 0x5a048dffU, 0x8ecee914U, + 0x7ca56a17U, 0x6ff599e3U, 0x9d9e1ae0U, 0xd3d3e1abU, 0x21b862a8U, + 0x32e8915cU, 0xc083125fU, 0x144976b4U, 0xe622f5b7U, 0xf5720643U, + 0x07198540U, 0x590ab964U, 0xab613a67U, 0xb831c993U, 0x4a5a4a90U, + 0x9e902e7bU, 0x6cfbad78U, 0x7fab5e8cU, 0x8dc0dd8fU, 0xe330a81aU, + 0x115b2b19U, 0x020bd8edU, 0xf0605beeU, 0x24aa3f05U, 0xd6c1bc06U, + 0xc5914ff2U, 0x37faccf1U, 0x69e9f0d5U, 0x9b8273d6U, 0x88d28022U, + 0x7ab90321U, 0xae7367caU, 0x5c18e4c9U, 0x4f48173dU, 0xbd23943eU, + 0xf36e6f75U, 0x0105ec76U, 0x12551f82U, 0xe03e9c81U, 0x34f4f86aU, + 0xc69f7b69U, 0xd5cf889dU, 0x27a40b9eU, 0x79b737baU, 0x8bdcb4b9U, + 0x988c474dU, 0x6ae7c44eU, 0xbe2da0a5U, 0x4c4623a6U, 0x5f16d052U, + 0xad7d5351U, + }; + + U32 crc = seed; + const char* p; + int i; + char c; + p = (const char*)&data; + for (i = 0; i < 8; ++i) { + c = MEM_isLittleEndian() ? p[i] : p[7 - i]; + crc = crc32_table[(crc ^ c) & 0xff] ^ (crc >> 8); + } + + return crc; +} + +#endif + +#endif + + /*-************************************* * Constants ***************************************/ @@ -891,38 +992,65 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match, return matchLength + ZSTD_count(ip+matchLength, iStart, iEnd); } +MEM_STATIC U32 ZSTD_reduceHash32(U32 hash, U32 bits) { + assert(bits <= 32); +#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) + return hash & ((1ULL << bits) - 1); +#else + return hash >> (32 - bits); +#endif +} + +MEM_STATIC size_t ZSTD_reduceHash64(U64 hash, U32 bits) { + assert(bits <= 32); +#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) + return (size_t)(hash & ((1ULL << bits) - 1)); +#else + return (size_t)(hash >> (64 - bits)); +#endif +} /*-************************************* * Hashes ***************************************/ static const U32 prime3bytes = 506832829U; -static U32 ZSTD_hash3(U32 u, U32 h, U32 s) { assert(h <= 32); return (((u << (32-24)) * prime3bytes) ^ s) >> (32-h) ; } -MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h, 0); } /* only in zstd_opt.h */ -MEM_STATIC size_t ZSTD_hash3PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash3(MEM_readLE32(ptr), h, s); } - static const U32 prime4bytes = 2654435761U; -static U32 ZSTD_hash4(U32 u, U32 h, U32 s) { assert(h <= 32); return ((u * prime4bytes) ^ s) >> (32-h) ; } -static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_readLE32(ptr), h, 0); } -static size_t ZSTD_hash4PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash4(MEM_readLE32(ptr), h, s); } - static const U64 prime5bytes = 889523592379ULL; -static size_t ZSTD_hash5(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-40)) * prime5bytes) ^ s) >> (64-h)) ; } -static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h, 0); } -static size_t ZSTD_hash5PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash5(MEM_readLE64(p), h, s); } - static const U64 prime6bytes = 227718039650203ULL; -static size_t ZSTD_hash6(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-48)) * prime6bytes) ^ s) >> (64-h)) ; } -static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h, 0); } -static size_t ZSTD_hash6PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash6(MEM_readLE64(p), h, s); } - static const U64 prime7bytes = 58295818150454627ULL; -static size_t ZSTD_hash7(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u << (64-56)) * prime7bytes) ^ s) >> (64-h)) ; } -static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h, 0); } -static size_t ZSTD_hash7PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash7(MEM_readLE64(p), h, s); } - static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL; -static size_t ZSTD_hash8(U64 u, U32 h, U64 s) { assert(h <= 64); return (size_t)((((u) * prime8bytes) ^ s) >> (64-h)) ; } + +#if defined(ZSTD_HASH_USE_CRC32C) + +static U32 ZSTD_hash3(U32 u, U32 h, U32 s) { assert(h <= 32); return ZSTD_reduceHash32((U32)ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u << 8), h); } +static U32 ZSTD_hash4(U32 u, U32 h, U32 s) { assert(h <= 32); return ZSTD_reduceHash32((U32)ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u), h); } +static size_t ZSTD_hash5(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u << 24)), h); } +static size_t ZSTD_hash6(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u << 16)), h); } +static size_t ZSTD_hash7(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u << 8)), h); } +static size_t ZSTD_hash8(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(ZSTD_HASH_INTERNAL_CRC32_U64((U32)s, u)), h); } + +#else + +static U32 ZSTD_hash3(U32 u, U32 h, U32 s) { assert(h <= 32); return ZSTD_reduceHash32((((u << (32-24)) * prime3bytes) ^ s) , h) ; } +static U32 ZSTD_hash4(U32 u, U32 h, U32 s) { assert(h <= 32); return ZSTD_reduceHash32(((u * prime4bytes) ^ s), h) ; } +static size_t ZSTD_hash5(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(((u << (64-40)) * prime5bytes) ^ s), h) ; } +static size_t ZSTD_hash6(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(((u << (64-48)) * prime6bytes) ^ s), h) ; } +static size_t ZSTD_hash7(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(((u << (64-56)) * prime7bytes) ^ s), h); } +static size_t ZSTD_hash8(U64 u, U32 h, U64 s) { assert(h <= 64); return ZSTD_reduceHash64((U64)(((u) * prime8bytes) ^ s), h) ; } + +#endif + +MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h, 0); } /* only in zstd_opt.h */ +static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_readLE32(ptr), h, 0); } +static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h, 0); } +static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h, 0); } static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h, 0); } +MEM_STATIC size_t ZSTD_hash3PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash3(MEM_readLE32(ptr), h, s); } +static size_t ZSTD_hash4PtrS(const void* ptr, U32 h, U32 s) { return ZSTD_hash4(MEM_readLE32(ptr), h, s); } +static size_t ZSTD_hash5PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash5(MEM_readLE64(p), h, s); } +static size_t ZSTD_hash6PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash6(MEM_readLE64(p), h, s); } +static size_t ZSTD_hash7PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash7(MEM_readLE64(p), h, s); } static size_t ZSTD_hash8PtrS(const void* p, U32 h, U64 s) { return ZSTD_hash8(MEM_readLE64(p), h, s); } @@ -961,6 +1089,61 @@ size_t ZSTD_hashPtrSalted(const void* p, U32 hBits, U32 mls, const U64 hashSalt) } } +#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) + +MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { + (void)tagBits; + return hashAndTag & (((U64)1 << hashBits) - 1); +} + +MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { + return indexAndTag & (((U32)1 << (32 - tagBits)) - 1); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { + (void)tagBits; + return (U32)(hashAndTag >> hashBits); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromIndex(size_t indexAndTag, U32 tagBits) { + return (U32)(indexAndTag >> (32 - tagBits)); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_combineIndexAndTag(U32 index, U32 tag, U32 tagBits) { + assert(tag >> tagBits == 0); + assert(index >> (32 - tagBits) == 0); + return (tag << (32 - tagBits)) | index; +} + +#else + +MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { + (void)hashBits; + return hashAndTag >> tagBits; +} + +MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { + return ZSTD_extractHash(indexAndTag, tagBits, 0); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { + (void)hashBits; + return (U32)(hashAndTag & ((1 << tagBits) - 1)); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromIndex(size_t indexAndTag, U32 tagBits) { + return ZSTD_extractTagFromHash(indexAndTag, tagBits, 0); +} + +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_combineIndexAndTag(U32 index, U32 tag, U32 tagBits) { + assert(tag >> tagBits == 0); + assert(index >> (32 - tagBits) == 0); + return (index << tagBits) | tag; +} + +#endif + + /** ZSTD_ipow() : * Return base^exponent. @@ -1484,18 +1667,18 @@ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max) /* Helper function for ZSTD_fillHashTable and ZSTD_fillDoubleHashTable. * Unpacks hashAndTag into (hash, tag), then packs (index, tag) into hashTable[hash]. */ -MEM_STATIC void ZSTD_writeTaggedIndex(U32* const hashTable, size_t hashAndTag, U32 index) { - size_t const hash = hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; - U32 const tag = (U32)(hashAndTag & ZSTD_SHORT_CACHE_TAG_MASK); +MEM_STATIC void ZSTD_writeTaggedIndex(U32* const hashTable, size_t hashAndTag, U32 const hashLog, U32 index) { + size_t const hash = ZSTD_extractHash(hashAndTag, ZSTD_SHORT_CACHE_TAG_BITS, hashLog); + U32 const tag = ZSTD_extractTagFromHash(hashAndTag, ZSTD_SHORT_CACHE_TAG_BITS, hashLog); assert(index >> (32 - ZSTD_SHORT_CACHE_TAG_BITS) == 0); - hashTable[hash] = (index << ZSTD_SHORT_CACHE_TAG_BITS) | tag; + hashTable[hash] = ZSTD_combineIndexAndTag(index, tag, ZSTD_SHORT_CACHE_TAG_BITS); } /* Helper function for short cache matchfinders. - * Unpacks tag1 and tag2 from lower bits of packedTag1 and packedTag2, then checks if the tags match. */ -MEM_STATIC int ZSTD_comparePackedTags(size_t packedTag1, size_t packedTag2) { - U32 const tag1 = packedTag1 & ZSTD_SHORT_CACHE_TAG_MASK; - U32 const tag2 = packedTag2 & ZSTD_SHORT_CACHE_TAG_MASK; + * Unpacks tag1 and tag2 from packedIndexTag1 and packedHashTag2, then checks if the tags match. */ +MEM_STATIC int ZSTD_comparePackedTags(size_t packedIndexTag1, size_t packedHashTag2, U32 const hashLog) { + U32 const tag1 = ZSTD_extractTagFromIndex(packedIndexTag1, ZSTD_SHORT_CACHE_TAG_BITS); + U32 const tag2 = ZSTD_extractTagFromHash(packedHashTag2, ZSTD_SHORT_CACHE_TAG_BITS, hashLog); return tag1 == tag2; } diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 1a266e7d955..91b6ebe086f 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -40,10 +40,10 @@ void ZSTD_fillDoubleHashTableForCDict(ZSTD_MatchState_t* ms, size_t const smHashAndTag = ZSTD_hashPtr(ip + i, hBitsS, mls); size_t const lgHashAndTag = ZSTD_hashPtr(ip + i, hBitsL, 8); if (i == 0) { - ZSTD_writeTaggedIndex(hashSmall, smHashAndTag, curr + i); + ZSTD_writeTaggedIndex(hashSmall, smHashAndTag, cParams->chainLog, curr + i); } - if (i == 0 || hashLarge[lgHashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { - ZSTD_writeTaggedIndex(hashLarge, lgHashAndTag, curr + i); + if (i == 0 || hashLarge[ZSTD_extractHash(lgHashAndTag, ZSTD_SHORT_CACHE_TAG_BITS, cParams->hashLog)] == 0) { + ZSTD_writeTaggedIndex(hashLarge, lgHashAndTag, cParams->hashLog, curr + i); } /* Only load extra positions for ZSTD_dtlm_full */ if (dtlm == ZSTD_dtlm_fast) @@ -388,10 +388,10 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( size_t const h = ZSTD_hashPtr(ip, hBitsS, mls); size_t const dictHashAndTagL = ZSTD_hashPtr(ip, dictHBitsL, 8); size_t const dictHashAndTagS = ZSTD_hashPtr(ip, dictHBitsS, mls); - U32 const dictMatchIndexAndTagL = dictHashLong[dictHashAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS]; - U32 const dictMatchIndexAndTagS = dictHashSmall[dictHashAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS]; - int const dictTagsMatchL = ZSTD_comparePackedTags(dictMatchIndexAndTagL, dictHashAndTagL); - int const dictTagsMatchS = ZSTD_comparePackedTags(dictMatchIndexAndTagS, dictHashAndTagS); + U32 const dictMatchIndexAndTagL = dictHashLong[ZSTD_extractHash(dictHashAndTagL, ZSTD_SHORT_CACHE_TAG_BITS, dictCParams->hashLog)]; + U32 const dictMatchIndexAndTagS = dictHashSmall[ZSTD_extractHash(dictHashAndTagS, ZSTD_SHORT_CACHE_TAG_BITS, dictCParams->chainLog)]; + int const dictTagsMatchL = ZSTD_comparePackedTags(dictMatchIndexAndTagL, dictHashAndTagL, dictCParams->hashLog); + int const dictTagsMatchS = ZSTD_comparePackedTags(dictMatchIndexAndTagS, dictHashAndTagS, dictCParams->chainLog); U32 const curr = (U32)(ip-base); U32 const matchIndexL = hashLong[h2]; U32 matchIndexS = hashSmall[h]; @@ -421,7 +421,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( goto _match_found; } else if (dictTagsMatchL) { /* check dictMatchState long match */ - U32 const dictMatchIndexL = dictMatchIndexAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const dictMatchIndexL = ZSTD_extractIndex(dictMatchIndexAndTagL, ZSTD_SHORT_CACHE_TAG_BITS); const BYTE* dictMatchL = dictBase + dictMatchIndexL; assert(dictMatchL < dictEnd); @@ -439,7 +439,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( } } else if (dictTagsMatchS) { /* check dictMatchState short match */ - U32 const dictMatchIndexS = dictMatchIndexAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const dictMatchIndexS = ZSTD_extractIndex(dictMatchIndexAndTagS, ZSTD_SHORT_CACHE_TAG_BITS); match = dictBase + dictMatchIndexS; matchIndexS = dictMatchIndexS + dictIndexDelta; @@ -457,8 +457,8 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); size_t const dictHashAndTagL3 = ZSTD_hashPtr(ip+1, dictHBitsL, 8); U32 const matchIndexL3 = hashLong[hl3]; - U32 const dictMatchIndexAndTagL3 = dictHashLong[dictHashAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS]; - int const dictTagsMatchL3 = ZSTD_comparePackedTags(dictMatchIndexAndTagL3, dictHashAndTagL3); + U32 const dictMatchIndexAndTagL3 = dictHashLong[ZSTD_extractHash(dictHashAndTagL3, ZSTD_SHORT_CACHE_TAG_BITS, dictCParams->hashLog)]; + int const dictTagsMatchL3 = ZSTD_comparePackedTags(dictMatchIndexAndTagL3, dictHashAndTagL3, dictCParams->hashLog); const BYTE* matchL3 = base + matchIndexL3; hashLong[hl3] = curr + 1; @@ -471,7 +471,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( goto _match_found; } else if (dictTagsMatchL3) { /* check dict long +1 match */ - U32 const dictMatchIndexL3 = dictMatchIndexAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const dictMatchIndexL3 = ZSTD_extractIndex(dictMatchIndexAndTagL3, ZSTD_SHORT_CACHE_TAG_BITS); const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; assert(dictMatchL3 < dictEnd); if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) { diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index ee25bcbac8d..34593cb2aa8 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -36,15 +36,15 @@ void ZSTD_fillHashTableForCDict(ZSTD_MatchState_t* ms, for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { U32 const curr = (U32)(ip - base); { size_t const hashAndTag = ZSTD_hashPtr(ip, hBits, mls); - ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr); } + ZSTD_writeTaggedIndex(hashTable, hashAndTag, cParams->hashLog, curr); } if (dtlm == ZSTD_dtlm_fast) continue; /* Only load extra positions for ZSTD_dtlm_full */ { U32 p; for (p = 1; p < fastHashFillStep; ++p) { size_t const hashAndTag = ZSTD_hashPtr(ip + p, hBits, mls); - if (hashTable[hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { /* not yet filled */ - ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr + p); + if (hashTable[ZSTD_extractHash(hashAndTag, ZSTD_SHORT_CACHE_TAG_BITS, cParams->hashLog)] == 0) { /* not yet filled */ + ZSTD_writeTaggedIndex(hashTable, hashAndTag, cParams->hashLog, curr + p); } } } } } @@ -544,8 +544,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( size_t hash0 = ZSTD_hashPtr(ip0, hlog, mls); size_t const dictHashAndTag0 = ZSTD_hashPtr(ip0, dictHBits, mls); - U32 dictMatchIndexAndTag = dictHashTable[dictHashAndTag0 >> ZSTD_SHORT_CACHE_TAG_BITS]; - int dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag0); + U32 dictMatchIndexAndTag = dictHashTable[ZSTD_extractHash(dictHashAndTag0, ZSTD_SHORT_CACHE_TAG_BITS, dictCParams->hashLog)]; + int dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag0, dictCParams->hashLog); U32 matchIndex = hashTable[hash0]; U32 curr = (U32)(ip0 - base); @@ -575,7 +575,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( if (dictTagsMatch) { /* Found a possible dict match */ - const U32 dictMatchIndex = dictMatchIndexAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictMatchIndex = ZSTD_extractIndex(dictMatchIndexAndTag, ZSTD_SHORT_CACHE_TAG_BITS); const BYTE* dictMatch = dictBase + dictMatchIndex; if (dictMatchIndex > dictStartIndex && MEM_read32(dictMatch) == MEM_read32(ip0)) { @@ -614,8 +614,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( } /* Prepare for next iteration */ - dictMatchIndexAndTag = dictHashTable[dictHashAndTag1 >> ZSTD_SHORT_CACHE_TAG_BITS]; - dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag1); + dictMatchIndexAndTag = dictHashTable[ZSTD_extractHash(dictHashAndTag1, ZSTD_SHORT_CACHE_TAG_BITS, dictCParams->hashLog)]; + dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag1, dictCParams->hashLog); matchIndex = hashTable[hash1]; if (ip1 >= nextStep) { diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 18b7b43948f..cb28c1fac61 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -846,7 +846,7 @@ void ZSTD_row_fillHashCache(ZSTD_MatchState_t* ms, const BYTE* base, for (; idx < lim; ++idx) { U32 const hash = (U32)ZSTD_hashPtrSalted(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt); - U32 const row = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + U32 const row = (U32)ZSTD_extractHash(hash, ZSTD_ROW_HASH_TAG_BITS, hashLog) << rowLog; ZSTD_row_prefetch(hashTable, tagTable, row, rowLog); ms->hashCache[idx & ZSTD_ROW_HASH_CACHE_MASK] = hash; } @@ -869,7 +869,7 @@ U32 ZSTD_row_nextCachedHash(U32* cache, U32 const* hashTable, U64 const hashSalt) { U32 const newHash = (U32)ZSTD_hashPtrSalted(base+idx+ZSTD_ROW_HASH_CACHE_SIZE, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, hashSalt); - U32 const row = (newHash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + U32 const row = (U32)ZSTD_extractHash(newHash, ZSTD_ROW_HASH_TAG_BITS, hashLog) << rowLog; ZSTD_row_prefetch(hashTable, tagTable, row, rowLog); { U32 const hash = cache[idx & ZSTD_ROW_HASH_CACHE_MASK]; cache[idx & ZSTD_ROW_HASH_CACHE_MASK] = newHash; @@ -896,13 +896,13 @@ void ZSTD_row_update_internalImpl(ZSTD_MatchState_t* ms, for (; updateStartIdx < updateEndIdx; ++updateStartIdx) { U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, updateStartIdx, hashLog, rowLog, mls, ms->hashSalt) : (U32)ZSTD_hashPtrSalted(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt); - U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; + U32 const relRow = (U32)ZSTD_extractHash(hash, ZSTD_ROW_HASH_TAG_BITS, hashLog) << rowLog; U32* const row = hashTable + relRow; BYTE* tagRow = tagTable + relRow; U32 const pos = ZSTD_row_nextIndex(tagRow, rowMask); assert(hash == ZSTD_hashPtrSalted(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls, ms->hashSalt)); - tagRow[pos] = hash & ZSTD_ROW_HASH_TAG_MASK; + tagRow[pos] = (BYTE)ZSTD_extractTagFromHash(hash, ZSTD_ROW_HASH_TAG_BITS, hashLog); row[pos] = updateStartIdx; } } @@ -1238,8 +1238,8 @@ size_t ZSTD_RowFindBestMatch( U32* const dmsHashTable = dms->hashTable; BYTE* const dmsTagTable = dms->tagTable; U32 const dmsHash = (U32)ZSTD_hashPtr(ip, dms->rowHashLog + ZSTD_ROW_HASH_TAG_BITS, mls); - U32 const dmsRelRow = (dmsHash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; - dmsTag = dmsHash & ZSTD_ROW_HASH_TAG_MASK; + U32 const dmsRelRow = (U32)ZSTD_extractHash(dmsHash, ZSTD_ROW_HASH_TAG_BITS, dms->rowHashLog) << rowLog; + dmsTag = (BYTE)ZSTD_extractTagFromHash(dmsHash, ZSTD_ROW_HASH_TAG_BITS, dms->rowHashLog); dmsTagRow = (BYTE*)(dmsTagTable + dmsRelRow); dmsRow = dmsHashTable + dmsRelRow; ZSTD_row_prefetch(dmsHashTable, dmsTagTable, dmsRelRow, rowLog); @@ -1259,8 +1259,8 @@ size_t ZSTD_RowFindBestMatch( ms->hashSaltEntropy += hash; /* collect salt entropy */ { /* Get the hash for ip, compute the appropriate row */ - U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; - U32 const tag = hash & ZSTD_ROW_HASH_TAG_MASK; + U32 const relRow = (U32)ZSTD_extractHash(hash, ZSTD_ROW_HASH_TAG_BITS, hashLog) << rowLog; + U32 const tag = (U32)ZSTD_extractTagFromHash(hash, ZSTD_ROW_HASH_TAG_BITS, hashLog); U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); U32 const headGrouped = (*tagRow & rowMask) * groupWidth; diff --git a/tests/regression/README.md b/tests/regression/README.md index bb36b1ddd6d..c834552ba64 100644 --- a/tests/regression/README.md +++ b/tests/regression/README.md @@ -26,3 +26,5 @@ git diff # Then submit the PR ``` + +Do the same for `CFLAGS=-DZSTD_HASH_USE_CRC32C` and update `results_crc32c.csv`. diff --git a/tests/regression/results_crc32c.csv b/tests/regression/results_crc32c.csv new file mode 100644 index 00000000000..d92ea78d53f --- /dev/null +++ b/tests/regression/results_crc32c.csv @@ -0,0 +1,1480 @@ +Data, Config, Method, Total compressed size +silesia.tar, level -5, compress simple, 6841910 +silesia.tar, level -3, compress simple, 6487824 +silesia.tar, level -1, compress simple, 6167426 +silesia.tar, level 0, compress simple, 4830637 +silesia.tar, level 1, compress simple, 5307982 +silesia.tar, level 3, compress simple, 4830637 +silesia.tar, level 4, compress simple, 4772466 +silesia.tar, level 5, compress simple, 4663199 +silesia.tar, level 6, compress simple, 4597711 +silesia.tar, level 7, compress simple, 4564413 +silesia.tar, level 9, compress simple, 4537609 +silesia.tar, level 13, compress simple, 4484711 +silesia.tar, level 16, compress simple, 4355631 +silesia.tar, level 19, compress simple, 4257858 +silesia.tar, uncompressed literals, compress simple, 4830637 +silesia.tar, uncompressed literals optimal, compress simple, 4257858 +silesia.tar, huffman literals, compress simple, 6167426 +github.tar, level -5, compress simple, 52372 +github.tar, level -3, compress simple, 45858 +github.tar, level -1, compress simple, 42608 +github.tar, level 0, compress simple, 38869 +github.tar, level 1, compress simple, 39407 +github.tar, level 3, compress simple, 38869 +github.tar, level 4, compress simple, 38869 +github.tar, level 5, compress simple, 39641 +github.tar, level 6, compress simple, 39292 +github.tar, level 7, compress simple, 38006 +github.tar, level 9, compress simple, 36749 +github.tar, level 13, compress simple, 35501 +github.tar, level 16, compress simple, 40466 +github.tar, level 19, compress simple, 32262 +github.tar, uncompressed literals, compress simple, 38869 +github.tar, uncompressed literals optimal, compress simple, 32262 +github.tar, huffman literals, compress simple, 42608 +silesia, level -5, compress cctx, 6841180 +silesia, level -3, compress cctx, 6487807 +silesia, level -1, compress cctx, 6166934 +silesia, level 0, compress cctx, 4833338 +silesia, level 1, compress cctx, 5304951 +silesia, level 3, compress cctx, 4833338 +silesia, level 4, compress cctx, 4774523 +silesia, level 5, compress cctx, 4663971 +silesia, level 6, compress cctx, 4599915 +silesia, level 7, compress cctx, 4566562 +silesia, level 9, compress cctx, 4540685 +silesia, level 13, compress cctx, 4488950 +silesia, level 16, compress cctx, 4356799 +silesia, level 19, compress cctx, 4265857 +silesia, long distance mode, compress cctx, 4833338 +silesia, multithreaded, compress cctx, 4833338 +silesia, multithreaded long distance mode, compress cctx, 4833338 +silesia, small window log, compress cctx, 7082844 +silesia, small hash log, compress cctx, 6525464 +silesia, small chain log, compress cctx, 4914756 +silesia, explicit params, compress cctx, 4789674 +silesia, uncompressed literals, compress cctx, 4833338 +silesia, uncompressed literals optimal, compress cctx, 4265857 +silesia, huffman literals, compress cctx, 6166934 +silesia, multithreaded with advanced params, compress cctx, 4833338 +github, level -5, compress cctx, 203114 +github, level -5 with dict, compress cctx, 47514 +github, level -3, compress cctx, 193442 +github, level -3 with dict, compress cctx, 43099 +github, level -1, compress cctx, 175450 +github, level -1 with dict, compress cctx, 42115 +github, level 0, compress cctx, 135908 +github, level 0 with dict, compress cctx, 41519 +github, level 1, compress cctx, 142361 +github, level 1 with dict, compress cctx, 43241 +github, level 3, compress cctx, 135908 +github, level 3 with dict, compress cctx, 41519 +github, level 4, compress cctx, 136199 +github, level 4 with dict, compress cctx, 41660 +github, level 5, compress cctx, 135119 +github, level 5 with dict, compress cctx, 38738 +github, level 6, compress cctx, 135122 +github, level 6 with dict, compress cctx, 38645 +github, level 7, compress cctx, 135122 +github, level 7 with dict, compress cctx, 38764 +github, level 9, compress cctx, 135122 +github, level 9 with dict, compress cctx, 39368 +github, level 13, compress cctx, 132873 +github, level 13 with dict, compress cctx, 39958 +github, level 16, compress cctx, 133013 +github, level 16 with dict, compress cctx, 37892 +github, level 19, compress cctx, 132883 +github, level 19 with dict, compress cctx, 37906 +github, long distance mode, compress cctx, 141069 +github, multithreaded, compress cctx, 141069 +github, multithreaded long distance mode, compress cctx, 141069 +github, small window log, compress cctx, 141069 +github, small hash log, compress cctx, 139594 +github, small chain log, compress cctx, 139239 +github, explicit params, compress cctx, 140932 +github, uncompressed literals, compress cctx, 135908 +github, uncompressed literals optimal, compress cctx, 132883 +github, huffman literals, compress cctx, 175450 +github, multithreaded with advanced params, compress cctx, 141069 +silesia, level -5, zstdcli, 6840106 +silesia, level -3, zstdcli, 6487073 +silesia, level -1, zstdcli, 6164885 +silesia, level 0, zstdcli, 4834415 +silesia, level 1, zstdcli, 5302994 +silesia, level 3, zstdcli, 4834415 +silesia, level 4, zstdcli, 4775815 +silesia, level 5, zstdcli, 4663571 +silesia, level 6, zstdcli, 4599479 +silesia, level 7, zstdcli, 4566093 +silesia, level 9, zstdcli, 4540252 +silesia, level 13, zstdcli, 4488421 +silesia, level 16, zstdcli, 4358150 +silesia, level 19, zstdcli, 4265800 +silesia, long distance mode, zstdcli, 4825874 +silesia, multithreaded, zstdcli, 4834415 +silesia, multithreaded long distance mode, zstdcli, 4825874 +silesia, small window log, zstdcli, 7093974 +silesia, small hash log, zstdcli, 6525348 +silesia, small chain log, zstdcli, 4914133 +silesia, explicit params, zstdcli, 4790644 +silesia, uncompressed literals, zstdcli, 5121344 +silesia, uncompressed literals optimal, zstdcli, 4316821 +silesia, huffman literals, zstdcli, 5312721 +silesia, multithreaded with advanced params, zstdcli, 5121344 +silesia.tar, level -5, zstdcli, 6844818 +silesia.tar, level -3, zstdcli, 6488053 +silesia.tar, level -1, zstdcli, 6168196 +silesia.tar, level 0, zstdcli, 4837306 +silesia.tar, level 1, zstdcli, 5309327 +silesia.tar, level 3, zstdcli, 4837306 +silesia.tar, level 4, zstdcli, 4779957 +silesia.tar, level 5, zstdcli, 4667636 +silesia.tar, level 6, zstdcli, 4602350 +silesia.tar, level 7, zstdcli, 4569547 +silesia.tar, level 9, zstdcli, 4541195 +silesia.tar, level 13, zstdcli, 4488453 +silesia.tar, level 16, zstdcli, 4357025 +silesia.tar, level 19, zstdcli, 4259986 +silesia.tar, no source size, zstdcli, 4837302 +silesia.tar, long distance mode, zstdcli, 4829936 +silesia.tar, multithreaded, zstdcli, 4837306 +silesia.tar, multithreaded long distance mode, zstdcli, 4829936 +silesia.tar, small window log, zstdcli, 7099640 +silesia.tar, small hash log, zstdcli, 6526321 +silesia.tar, small chain log, zstdcli, 4918357 +silesia.tar, explicit params, zstdcli, 4808219 +silesia.tar, uncompressed literals, zstdcli, 5119705 +silesia.tar, uncompressed literals optimal, zstdcli, 4306653 +silesia.tar, huffman literals, zstdcli, 5318302 +silesia.tar, multithreaded with advanced params, zstdcli, 5119705 +github, level -5, zstdcli, 205114 +github, level -5 with dict, zstdcli, 48188 +github, level -3, zstdcli, 195442 +github, level -3 with dict, zstdcli, 46112 +github, level -1, zstdcli, 177450 +github, level -1 with dict, zstdcli, 44057 +github, level 0, zstdcli, 137908 +github, level 0 with dict, zstdcli, 43081 +github, level 1, zstdcli, 144361 +github, level 1 with dict, zstdcli, 44800 +github, level 3, zstdcli, 137908 +github, level 3 with dict, zstdcli, 43081 +github, level 4, zstdcli, 138199 +github, level 4 with dict, zstdcli, 43157 +github, level 5, zstdcli, 137119 +github, level 5 with dict, zstdcli, 40716 +github, level 6, zstdcli, 137122 +github, level 6 with dict, zstdcli, 40623 +github, level 7, zstdcli, 137122 +github, level 7 with dict, zstdcli, 40725 +github, level 9, zstdcli, 137122 +github, level 9 with dict, zstdcli, 41378 +github, level 13, zstdcli, 134873 +github, level 13 with dict, zstdcli, 41907 +github, level 16, zstdcli, 135013 +github, level 16 with dict, zstdcli, 39893 +github, level 19, zstdcli, 134883 +github, level 19 with dict, zstdcli, 39907 +github, long distance mode, zstdcli, 137908 +github, multithreaded, zstdcli, 137908 +github, multithreaded long distance mode, zstdcli, 137908 +github, small window log, zstdcli, 137908 +github, small hash log, zstdcli, 137741 +github, small chain log, zstdcli, 137592 +github, explicit params, zstdcli, 136192 +github, uncompressed literals, zstdcli, 168319 +github, uncompressed literals optimal, zstdcli, 156095 +github, huffman literals, zstdcli, 144361 +github, multithreaded with advanced params, zstdcli, 168319 +github.tar, level -5, zstdcli, 52455 +github.tar, level -5 with dict, zstdcli, 50911 +github.tar, level -3, zstdcli, 45922 +github.tar, level -3 with dict, zstdcli, 44937 +github.tar, level -1, zstdcli, 42643 +github.tar, level -1 with dict, zstdcli, 41285 +github.tar, level 0, zstdcli, 38873 +github.tar, level 0 with dict, zstdcli, 38061 +github.tar, level 1, zstdcli, 39424 +github.tar, level 1 with dict, zstdcli, 38244 +github.tar, level 3, zstdcli, 38873 +github.tar, level 3 with dict, zstdcli, 38061 +github.tar, level 4, zstdcli, 38873 +github.tar, level 4 with dict, zstdcli, 38039 +github.tar, level 5, zstdcli, 39645 +github.tar, level 5 with dict, zstdcli, 39096 +github.tar, level 6, zstdcli, 39296 +github.tar, level 6 with dict, zstdcli, 38693 +github.tar, level 7, zstdcli, 38010 +github.tar, level 7 with dict, zstdcli, 37977 +github.tar, level 9, zstdcli, 36753 +github.tar, level 9 with dict, zstdcli, 36916 +github.tar, level 13, zstdcli, 35505 +github.tar, level 13 with dict, zstdcli, 37223 +github.tar, level 16, zstdcli, 40470 +github.tar, level 16 with dict, zstdcli, 33368 +github.tar, level 19, zstdcli, 32266 +github.tar, level 19 with dict, zstdcli, 32710 +github.tar, no source size, zstdcli, 38870 +github.tar, no source size with dict, zstdcli, 38092 +github.tar, long distance mode, zstdcli, 40148 +github.tar, multithreaded, zstdcli, 38873 +github.tar, multithreaded long distance mode, zstdcli, 40148 +github.tar, small window log, zstdcli, 198468 +github.tar, small hash log, zstdcli, 139885 +github.tar, small chain log, zstdcli, 41933 +github.tar, explicit params, zstdcli, 41325 +github.tar, uncompressed literals, zstdcli, 41549 +github.tar, uncompressed literals optimal, zstdcli, 35355 +github.tar, huffman literals, zstdcli, 38887 +github.tar, multithreaded with advanced params, zstdcli, 41549 +silesia, level -5, advanced one pass, 6841180 +silesia, level -3, advanced one pass, 6487807 +silesia, level -1, advanced one pass, 6166934 +silesia, level 0, advanced one pass, 4833338 +silesia, level 1, advanced one pass, 5304951 +silesia, level 3, advanced one pass, 4833338 +silesia, level 4, advanced one pass, 4774523 +silesia, level 5 row 1, advanced one pass, 4663971 +silesia, level 5 row 2, advanced one pass, 4667571 +silesia, level 5, advanced one pass, 4663971 +silesia, level 6, advanced one pass, 4599915 +silesia, level 7 row 1, advanced one pass, 4566562 +silesia, level 7 row 2, advanced one pass, 4560942 +silesia, level 7, advanced one pass, 4566562 +silesia, level 9, advanced one pass, 4540685 +silesia, level 11 row 1, advanced one pass, 4500665 +silesia, level 11 row 2, advanced one pass, 4498145 +silesia, level 12 row 1, advanced one pass, 4500665 +silesia, level 12 row 2, advanced one pass, 4498145 +silesia, level 13, advanced one pass, 4488950 +silesia, level 16, advanced one pass, 4356799 +silesia, level 19, advanced one pass, 4265857 +silesia, no source size, advanced one pass, 4833338 +silesia, long distance mode, advanced one pass, 4824765 +silesia, multithreaded, advanced one pass, 4834367 +silesia, multithreaded long distance mode, advanced one pass, 4825826 +silesia, small window log, advanced one pass, 7093926 +silesia, small hash log, advanced one pass, 6525464 +silesia, small chain log, advanced one pass, 4914756 +silesia, explicit params, advanced one pass, 4791064 +silesia, uncompressed literals, advanced one pass, 5120629 +silesia, uncompressed literals optimal, advanced one pass, 4316796 +silesia, huffman literals, advanced one pass, 5314815 +silesia, multithreaded with advanced params, advanced one pass, 5121296 +silesia.tar, level -5, advanced one pass, 6841910 +silesia.tar, level -3, advanced one pass, 6487824 +silesia.tar, level -1, advanced one pass, 6167426 +silesia.tar, level 0, advanced one pass, 4830637 +silesia.tar, level 1, advanced one pass, 5307982 +silesia.tar, level 3, advanced one pass, 4830637 +silesia.tar, level 4, advanced one pass, 4772466 +silesia.tar, level 5 row 1, advanced one pass, 4663199 +silesia.tar, level 5 row 2, advanced one pass, 4668112 +silesia.tar, level 5, advanced one pass, 4663199 +silesia.tar, level 6, advanced one pass, 4597711 +silesia.tar, level 7 row 1, advanced one pass, 4564413 +silesia.tar, level 7 row 2, advanced one pass, 4559539 +silesia.tar, level 7, advanced one pass, 4564413 +silesia.tar, level 9, advanced one pass, 4537609 +silesia.tar, level 11 row 1, advanced one pass, 4496533 +silesia.tar, level 11 row 2, advanced one pass, 4495166 +silesia.tar, level 12 row 1, advanced one pass, 4496196 +silesia.tar, level 12 row 2, advanced one pass, 4495409 +silesia.tar, level 13, advanced one pass, 4484711 +silesia.tar, level 16, advanced one pass, 4355631 +silesia.tar, level 19, advanced one pass, 4257858 +silesia.tar, no source size, advanced one pass, 4830637 +silesia.tar, long distance mode, advanced one pass, 4817826 +silesia.tar, multithreaded, advanced one pass, 4837302 +silesia.tar, multithreaded long distance mode, advanced one pass, 4829932 +silesia.tar, small window log, advanced one pass, 7099595 +silesia.tar, small hash log, advanced one pass, 6526299 +silesia.tar, small chain log, advanced one pass, 4918167 +silesia.tar, explicit params, advanced one pass, 4790210 +silesia.tar, uncompressed literals, advanced one pass, 5117851 +silesia.tar, uncompressed literals optimal, advanced one pass, 4305999 +silesia.tar, huffman literals, advanced one pass, 5317981 +silesia.tar, multithreaded with advanced params, advanced one pass, 5119701 +github, level -5, advanced one pass, 203114 +github, level -5 with dict, advanced one pass, 46188 +github, level -3, advanced one pass, 193442 +github, level -3 with dict, advanced one pass, 44112 +github, level -1, advanced one pass, 175450 +github, level -1 with dict, advanced one pass, 42057 +github, level 0, advanced one pass, 135908 +github, level 0 with dict, advanced one pass, 41081 +github, level 0 with dict dms, advanced one pass, 41081 +github, level 0 with dict dds, advanced one pass, 41081 +github, level 0 with dict copy, advanced one pass, 41086 +github, level 0 with dict load, advanced one pass, 41789 +github, level 1, advanced one pass, 142361 +github, level 1 with dict, advanced one pass, 42800 +github, level 1 with dict dms, advanced one pass, 42800 +github, level 1 with dict dds, advanced one pass, 42800 +github, level 1 with dict copy, advanced one pass, 42806 +github, level 1 with dict load, advanced one pass, 42362 +github, level 3, advanced one pass, 135908 +github, level 3 with dict, advanced one pass, 41081 +github, level 3 with dict dms, advanced one pass, 41081 +github, level 3 with dict dds, advanced one pass, 41081 +github, level 3 with dict copy, advanced one pass, 41086 +github, level 3 with dict load, advanced one pass, 41789 +github, level 4, advanced one pass, 136199 +github, level 4 with dict, advanced one pass, 41157 +github, level 4 with dict dms, advanced one pass, 41157 +github, level 4 with dict dds, advanced one pass, 41157 +github, level 4 with dict copy, advanced one pass, 41165 +github, level 4 with dict load, advanced one pass, 42390 +github, level 5 row 1, advanced one pass, 134584 +github, level 5 row 1 with dict dms, advanced one pass, 38740 +github, level 5 row 1 with dict dds, advanced one pass, 38716 +github, level 5 row 1 with dict copy, advanced one pass, 38738 +github, level 5 row 1 with dict load, advanced one pass, 41321 +github, level 5 row 2, advanced one pass, 135119 +github, level 5 row 2 with dict dms, advanced one pass, 38937 +github, level 5 row 2 with dict dds, advanced one pass, 38731 +github, level 5 row 2 with dict copy, advanced one pass, 38920 +github, level 5 row 2 with dict load, advanced one pass, 41068 +github, level 5, advanced one pass, 135119 +github, level 5 with dict, advanced one pass, 38740 +github, level 5 with dict dms, advanced one pass, 38740 +github, level 5 with dict dds, advanced one pass, 38716 +github, level 5 with dict copy, advanced one pass, 38738 +github, level 5 with dict load, advanced one pass, 41068 +github, level 6, advanced one pass, 135122 +github, level 6 with dict, advanced one pass, 38647 +github, level 6 with dict dms, advanced one pass, 38647 +github, level 6 with dict dds, advanced one pass, 38623 +github, level 6 with dict copy, advanced one pass, 38645 +github, level 6 with dict load, advanced one pass, 40982 +github, level 7 row 1, advanced one pass, 134584 +github, level 7 row 1 with dict dms, advanced one pass, 38763 +github, level 7 row 1 with dict dds, advanced one pass, 38725 +github, level 7 row 1 with dict copy, advanced one pass, 38764 +github, level 7 row 1 with dict load, advanced one pass, 43015 +github, level 7 row 2, advanced one pass, 135122 +github, level 7 row 2 with dict dms, advanced one pass, 38838 +github, level 7 row 2 with dict dds, advanced one pass, 38727 +github, level 7 row 2 with dict copy, advanced one pass, 38841 +github, level 7 row 2 with dict load, advanced one pass, 40982 +github, level 7, advanced one pass, 135122 +github, level 7 with dict, advanced one pass, 38763 +github, level 7 with dict dms, advanced one pass, 38763 +github, level 7 with dict dds, advanced one pass, 38725 +github, level 7 with dict copy, advanced one pass, 38764 +github, level 7 with dict load, advanced one pass, 40982 +github, level 9, advanced one pass, 135122 +github, level 9 with dict, advanced one pass, 39373 +github, level 9 with dict dms, advanced one pass, 39373 +github, level 9 with dict dds, advanced one pass, 39378 +github, level 9 with dict copy, advanced one pass, 39368 +github, level 9 with dict load, advanced one pass, 42684 +github, level 11 row 1, advanced one pass, 135367 +github, level 11 row 1 with dict dms, advanced one pass, 39657 +github, level 11 row 1 with dict dds, advanced one pass, 39657 +github, level 11 row 1 with dict copy, advanced one pass, 39637 +github, level 11 row 1 with dict load, advanced one pass, 42745 +github, level 11 row 2, advanced one pass, 135367 +github, level 11 row 2 with dict dms, advanced one pass, 39657 +github, level 11 row 2 with dict dds, advanced one pass, 39657 +github, level 11 row 2 with dict copy, advanced one pass, 39637 +github, level 11 row 2 with dict load, advanced one pass, 42745 +github, level 12 row 1, advanced one pass, 134395 +github, level 12 row 1 with dict dms, advanced one pass, 39677 +github, level 12 row 1 with dict dds, advanced one pass, 39677 +github, level 12 row 1 with dict copy, advanced one pass, 39677 +github, level 12 row 1 with dict load, advanced one pass, 42425 +github, level 12 row 2, advanced one pass, 134395 +github, level 12 row 2 with dict dms, advanced one pass, 39677 +github, level 12 row 2 with dict dds, advanced one pass, 39677 +github, level 12 row 2 with dict copy, advanced one pass, 39677 +github, level 12 row 2 with dict load, advanced one pass, 42425 +github, level 13, advanced one pass, 132873 +github, level 13 with dict, advanced one pass, 39907 +github, level 13 with dict dms, advanced one pass, 39907 +github, level 13 with dict dds, advanced one pass, 39907 +github, level 13 with dict copy, advanced one pass, 39958 +github, level 13 with dict load, advanced one pass, 43225 +github, level 16, advanced one pass, 133013 +github, level 16 with dict, advanced one pass, 37893 +github, level 16 with dict dms, advanced one pass, 37893 +github, level 16 with dict dds, advanced one pass, 37893 +github, level 16 with dict copy, advanced one pass, 37892 +github, level 16 with dict load, advanced one pass, 42997 +github, level 19, advanced one pass, 132883 +github, level 19 with dict, advanced one pass, 37907 +github, level 19 with dict dms, advanced one pass, 37907 +github, level 19 with dict dds, advanced one pass, 37907 +github, level 19 with dict copy, advanced one pass, 37906 +github, level 19 with dict load, advanced one pass, 40821 +github, no source size, advanced one pass, 135908 +github, no source size with dict, advanced one pass, 41081 +github, long distance mode, advanced one pass, 135908 +github, multithreaded, advanced one pass, 135908 +github, multithreaded long distance mode, advanced one pass, 135908 +github, small window log, advanced one pass, 135908 +github, small hash log, advanced one pass, 135741 +github, small chain log, advanced one pass, 135592 +github, explicit params, advanced one pass, 137722 +github, uncompressed literals, advanced one pass, 166319 +github, uncompressed literals optimal, advanced one pass, 154095 +github, huffman literals, advanced one pass, 142361 +github, multithreaded with advanced params, advanced one pass, 166319 +github.tar, level -5, advanced one pass, 52372 +github.tar, level -5 with dict, advanced one pass, 50839 +github.tar, level -3, advanced one pass, 45858 +github.tar, level -3 with dict, advanced one pass, 44840 +github.tar, level -1, advanced one pass, 42608 +github.tar, level -1 with dict, advanced one pass, 41234 +github.tar, level 0, advanced one pass, 38869 +github.tar, level 0 with dict, advanced one pass, 38057 +github.tar, level 0 with dict dms, advanced one pass, 38091 +github.tar, level 0 with dict dds, advanced one pass, 38091 +github.tar, level 0 with dict copy, advanced one pass, 38057 +github.tar, level 0 with dict load, advanced one pass, 37967 +github.tar, level 1, advanced one pass, 39407 +github.tar, level 1 with dict, advanced one pass, 38175 +github.tar, level 1 with dict dms, advanced one pass, 38140 +github.tar, level 1 with dict dds, advanced one pass, 38140 +github.tar, level 1 with dict copy, advanced one pass, 38175 +github.tar, level 1 with dict load, advanced one pass, 38665 +github.tar, level 3, advanced one pass, 38869 +github.tar, level 3 with dict, advanced one pass, 38057 +github.tar, level 3 with dict dms, advanced one pass, 38091 +github.tar, level 3 with dict dds, advanced one pass, 38091 +github.tar, level 3 with dict copy, advanced one pass, 38057 +github.tar, level 3 with dict load, advanced one pass, 37967 +github.tar, level 4, advanced one pass, 38869 +github.tar, level 4 with dict, advanced one pass, 38035 +github.tar, level 4 with dict dms, advanced one pass, 38030 +github.tar, level 4 with dict dds, advanced one pass, 38030 +github.tar, level 4 with dict copy, advanced one pass, 38035 +github.tar, level 4 with dict load, advanced one pass, 37874 +github.tar, level 5 row 1, advanced one pass, 39641 +github.tar, level 5 row 1 with dict dms, advanced one pass, 39038 +github.tar, level 5 row 1 with dict dds, advanced one pass, 39092 +github.tar, level 5 row 1 with dict copy, advanced one pass, 38978 +github.tar, level 5 row 1 with dict load, advanced one pass, 38981 +github.tar, level 5 row 2, advanced one pass, 39696 +github.tar, level 5 row 2 with dict dms, advanced one pass, 39404 +github.tar, level 5 row 2 with dict dds, advanced one pass, 39269 +github.tar, level 5 row 2 with dict copy, advanced one pass, 39706 +github.tar, level 5 row 2 with dict load, advanced one pass, 39158 +github.tar, level 5, advanced one pass, 39641 +github.tar, level 5 with dict, advanced one pass, 38978 +github.tar, level 5 with dict dms, advanced one pass, 39038 +github.tar, level 5 with dict dds, advanced one pass, 39092 +github.tar, level 5 with dict copy, advanced one pass, 38978 +github.tar, level 5 with dict load, advanced one pass, 38981 +github.tar, level 6, advanced one pass, 39292 +github.tar, level 6 with dict, advanced one pass, 38635 +github.tar, level 6 with dict dms, advanced one pass, 38649 +github.tar, level 6 with dict dds, advanced one pass, 38689 +github.tar, level 6 with dict copy, advanced one pass, 38635 +github.tar, level 6 with dict load, advanced one pass, 38635 +github.tar, level 7 row 1, advanced one pass, 38006 +github.tar, level 7 row 1 with dict dms, advanced one pass, 37916 +github.tar, level 7 row 1 with dict dds, advanced one pass, 37973 +github.tar, level 7 row 1 with dict copy, advanced one pass, 37887 +github.tar, level 7 row 1 with dict load, advanced one pass, 37307 +github.tar, level 7 row 2, advanced one pass, 38079 +github.tar, level 7 row 2 with dict dms, advanced one pass, 38134 +github.tar, level 7 row 2 with dict dds, advanced one pass, 38143 +github.tar, level 7 row 2 with dict copy, advanced one pass, 38149 +github.tar, level 7 row 2 with dict load, advanced one pass, 37403 +github.tar, level 7, advanced one pass, 38006 +github.tar, level 7 with dict, advanced one pass, 37887 +github.tar, level 7 with dict dms, advanced one pass, 37916 +github.tar, level 7 with dict dds, advanced one pass, 37973 +github.tar, level 7 with dict copy, advanced one pass, 37887 +github.tar, level 7 with dict load, advanced one pass, 37307 +github.tar, level 9, advanced one pass, 36749 +github.tar, level 9 with dict, advanced one pass, 36540 +github.tar, level 9 with dict dms, advanced one pass, 36818 +github.tar, level 9 with dict dds, advanced one pass, 36912 +github.tar, level 9 with dict copy, advanced one pass, 36540 +github.tar, level 9 with dict load, advanced one pass, 36334 +github.tar, level 11 row 1, advanced one pass, 36061 +github.tar, level 11 row 1 with dict dms, advanced one pass, 37018 +github.tar, level 11 row 1 with dict dds, advanced one pass, 37018 +github.tar, level 11 row 1 with dict copy, advanced one pass, 36648 +github.tar, level 11 row 1 with dict load, advanced one pass, 36415 +github.tar, level 11 row 2, advanced one pass, 36110 +github.tar, level 11 row 2 with dict dms, advanced one pass, 37018 +github.tar, level 11 row 2 with dict dds, advanced one pass, 37018 +github.tar, level 11 row 2 with dict copy, advanced one pass, 36648 +github.tar, level 11 row 2 with dict load, advanced one pass, 36459 +github.tar, level 12 row 1, advanced one pass, 36061 +github.tar, level 12 row 1 with dict dms, advanced one pass, 36974 +github.tar, level 12 row 1 with dict dds, advanced one pass, 36974 +github.tar, level 12 row 1 with dict copy, advanced one pass, 36627 +github.tar, level 12 row 1 with dict load, advanced one pass, 36415 +github.tar, level 12 row 2, advanced one pass, 36110 +github.tar, level 12 row 2 with dict dms, advanced one pass, 36974 +github.tar, level 12 row 2 with dict dds, advanced one pass, 36974 +github.tar, level 12 row 2 with dict copy, advanced one pass, 36627 +github.tar, level 12 row 2 with dict load, advanced one pass, 36459 +github.tar, level 13, advanced one pass, 35501 +github.tar, level 13 with dict, advanced one pass, 37219 +github.tar, level 13 with dict dms, advanced one pass, 37245 +github.tar, level 13 with dict dds, advanced one pass, 37245 +github.tar, level 13 with dict copy, advanced one pass, 37219 +github.tar, level 13 with dict load, advanced one pass, 36006 +github.tar, level 16, advanced one pass, 40466 +github.tar, level 16 with dict, advanced one pass, 33364 +github.tar, level 16 with dict dms, advanced one pass, 33177 +github.tar, level 16 with dict dds, advanced one pass, 33177 +github.tar, level 16 with dict copy, advanced one pass, 33364 +github.tar, level 16 with dict load, advanced one pass, 39081 +github.tar, level 19, advanced one pass, 32262 +github.tar, level 19 with dict, advanced one pass, 32706 +github.tar, level 19 with dict dms, advanced one pass, 32563 +github.tar, level 19 with dict dds, advanced one pass, 32563 +github.tar, level 19 with dict copy, advanced one pass, 32706 +github.tar, level 19 with dict load, advanced one pass, 32428 +github.tar, no source size, advanced one pass, 38869 +github.tar, no source size with dict, advanced one pass, 38057 +github.tar, long distance mode, advanced one pass, 40161 +github.tar, multithreaded, advanced one pass, 38869 +github.tar, multithreaded long distance mode, advanced one pass, 40144 +github.tar, small window log, advanced one pass, 198464 +github.tar, small hash log, advanced one pass, 139881 +github.tar, small chain log, advanced one pass, 41929 +github.tar, explicit params, advanced one pass, 41325 +github.tar, uncompressed literals, advanced one pass, 41545 +github.tar, uncompressed literals optimal, advanced one pass, 35351 +github.tar, huffman literals, advanced one pass, 38837 +github.tar, multithreaded with advanced params, advanced one pass, 41545 +silesia, level -5, advanced one pass small out, 6841180 +silesia, level -3, advanced one pass small out, 6487807 +silesia, level -1, advanced one pass small out, 6166934 +silesia, level 0, advanced one pass small out, 4833338 +silesia, level 1, advanced one pass small out, 5304951 +silesia, level 3, advanced one pass small out, 4833338 +silesia, level 4, advanced one pass small out, 4774523 +silesia, level 5 row 1, advanced one pass small out, 4663971 +silesia, level 5 row 2, advanced one pass small out, 4667571 +silesia, level 5, advanced one pass small out, 4663971 +silesia, level 6, advanced one pass small out, 4599915 +silesia, level 7 row 1, advanced one pass small out, 4566562 +silesia, level 7 row 2, advanced one pass small out, 4560942 +silesia, level 7, advanced one pass small out, 4566562 +silesia, level 9, advanced one pass small out, 4540685 +silesia, level 11 row 1, advanced one pass small out, 4500665 +silesia, level 11 row 2, advanced one pass small out, 4498145 +silesia, level 12 row 1, advanced one pass small out, 4500665 +silesia, level 12 row 2, advanced one pass small out, 4498145 +silesia, level 13, advanced one pass small out, 4488950 +silesia, level 16, advanced one pass small out, 4356799 +silesia, level 19, advanced one pass small out, 4265857 +silesia, no source size, advanced one pass small out, 4833338 +silesia, long distance mode, advanced one pass small out, 4824765 +silesia, multithreaded, advanced one pass small out, 4834367 +silesia, multithreaded long distance mode, advanced one pass small out, 4825826 +silesia, small window log, advanced one pass small out, 7093926 +silesia, small hash log, advanced one pass small out, 6525464 +silesia, small chain log, advanced one pass small out, 4914756 +silesia, explicit params, advanced one pass small out, 4791064 +silesia, uncompressed literals, advanced one pass small out, 5120629 +silesia, uncompressed literals optimal, advanced one pass small out, 4316796 +silesia, huffman literals, advanced one pass small out, 5314815 +silesia, multithreaded with advanced params, advanced one pass small out, 5121296 +silesia.tar, level -5, advanced one pass small out, 6841910 +silesia.tar, level -3, advanced one pass small out, 6487824 +silesia.tar, level -1, advanced one pass small out, 6167426 +silesia.tar, level 0, advanced one pass small out, 4830637 +silesia.tar, level 1, advanced one pass small out, 5307982 +silesia.tar, level 3, advanced one pass small out, 4830637 +silesia.tar, level 4, advanced one pass small out, 4772466 +silesia.tar, level 5 row 1, advanced one pass small out, 4663199 +silesia.tar, level 5 row 2, advanced one pass small out, 4668112 +silesia.tar, level 5, advanced one pass small out, 4663199 +silesia.tar, level 6, advanced one pass small out, 4597711 +silesia.tar, level 7 row 1, advanced one pass small out, 4564413 +silesia.tar, level 7 row 2, advanced one pass small out, 4559539 +silesia.tar, level 7, advanced one pass small out, 4564413 +silesia.tar, level 9, advanced one pass small out, 4537609 +silesia.tar, level 11 row 1, advanced one pass small out, 4496533 +silesia.tar, level 11 row 2, advanced one pass small out, 4495166 +silesia.tar, level 12 row 1, advanced one pass small out, 4496196 +silesia.tar, level 12 row 2, advanced one pass small out, 4495409 +silesia.tar, level 13, advanced one pass small out, 4484711 +silesia.tar, level 16, advanced one pass small out, 4355631 +silesia.tar, level 19, advanced one pass small out, 4257858 +silesia.tar, no source size, advanced one pass small out, 4830637 +silesia.tar, long distance mode, advanced one pass small out, 4817826 +silesia.tar, multithreaded, advanced one pass small out, 4837302 +silesia.tar, multithreaded long distance mode, advanced one pass small out, 4829932 +silesia.tar, small window log, advanced one pass small out, 7099595 +silesia.tar, small hash log, advanced one pass small out, 6526299 +silesia.tar, small chain log, advanced one pass small out, 4918167 +silesia.tar, explicit params, advanced one pass small out, 4790210 +silesia.tar, uncompressed literals, advanced one pass small out, 5117851 +silesia.tar, uncompressed literals optimal, advanced one pass small out, 4305999 +silesia.tar, huffman literals, advanced one pass small out, 5317981 +silesia.tar, multithreaded with advanced params, advanced one pass small out, 5119701 +github, level -5, advanced one pass small out, 203114 +github, level -5 with dict, advanced one pass small out, 46188 +github, level -3, advanced one pass small out, 193442 +github, level -3 with dict, advanced one pass small out, 44112 +github, level -1, advanced one pass small out, 175450 +github, level -1 with dict, advanced one pass small out, 42057 +github, level 0, advanced one pass small out, 135908 +github, level 0 with dict, advanced one pass small out, 41081 +github, level 0 with dict dms, advanced one pass small out, 41081 +github, level 0 with dict dds, advanced one pass small out, 41081 +github, level 0 with dict copy, advanced one pass small out, 41086 +github, level 0 with dict load, advanced one pass small out, 41789 +github, level 1, advanced one pass small out, 142361 +github, level 1 with dict, advanced one pass small out, 42800 +github, level 1 with dict dms, advanced one pass small out, 42800 +github, level 1 with dict dds, advanced one pass small out, 42800 +github, level 1 with dict copy, advanced one pass small out, 42806 +github, level 1 with dict load, advanced one pass small out, 42362 +github, level 3, advanced one pass small out, 135908 +github, level 3 with dict, advanced one pass small out, 41081 +github, level 3 with dict dms, advanced one pass small out, 41081 +github, level 3 with dict dds, advanced one pass small out, 41081 +github, level 3 with dict copy, advanced one pass small out, 41086 +github, level 3 with dict load, advanced one pass small out, 41789 +github, level 4, advanced one pass small out, 136199 +github, level 4 with dict, advanced one pass small out, 41157 +github, level 4 with dict dms, advanced one pass small out, 41157 +github, level 4 with dict dds, advanced one pass small out, 41157 +github, level 4 with dict copy, advanced one pass small out, 41165 +github, level 4 with dict load, advanced one pass small out, 42390 +github, level 5 row 1, advanced one pass small out, 134584 +github, level 5 row 1 with dict dms, advanced one pass small out, 38740 +github, level 5 row 1 with dict dds, advanced one pass small out, 38716 +github, level 5 row 1 with dict copy, advanced one pass small out, 38738 +github, level 5 row 1 with dict load, advanced one pass small out, 41321 +github, level 5 row 2, advanced one pass small out, 135119 +github, level 5 row 2 with dict dms, advanced one pass small out, 38937 +github, level 5 row 2 with dict dds, advanced one pass small out, 38731 +github, level 5 row 2 with dict copy, advanced one pass small out, 38920 +github, level 5 row 2 with dict load, advanced one pass small out, 41068 +github, level 5, advanced one pass small out, 135119 +github, level 5 with dict, advanced one pass small out, 38740 +github, level 5 with dict dms, advanced one pass small out, 38740 +github, level 5 with dict dds, advanced one pass small out, 38716 +github, level 5 with dict copy, advanced one pass small out, 38738 +github, level 5 with dict load, advanced one pass small out, 41068 +github, level 6, advanced one pass small out, 135122 +github, level 6 with dict, advanced one pass small out, 38647 +github, level 6 with dict dms, advanced one pass small out, 38647 +github, level 6 with dict dds, advanced one pass small out, 38623 +github, level 6 with dict copy, advanced one pass small out, 38645 +github, level 6 with dict load, advanced one pass small out, 40982 +github, level 7 row 1, advanced one pass small out, 134584 +github, level 7 row 1 with dict dms, advanced one pass small out, 38763 +github, level 7 row 1 with dict dds, advanced one pass small out, 38725 +github, level 7 row 1 with dict copy, advanced one pass small out, 38764 +github, level 7 row 1 with dict load, advanced one pass small out, 43015 +github, level 7 row 2, advanced one pass small out, 135122 +github, level 7 row 2 with dict dms, advanced one pass small out, 38838 +github, level 7 row 2 with dict dds, advanced one pass small out, 38727 +github, level 7 row 2 with dict copy, advanced one pass small out, 38841 +github, level 7 row 2 with dict load, advanced one pass small out, 40982 +github, level 7, advanced one pass small out, 135122 +github, level 7 with dict, advanced one pass small out, 38763 +github, level 7 with dict dms, advanced one pass small out, 38763 +github, level 7 with dict dds, advanced one pass small out, 38725 +github, level 7 with dict copy, advanced one pass small out, 38764 +github, level 7 with dict load, advanced one pass small out, 40982 +github, level 9, advanced one pass small out, 135122 +github, level 9 with dict, advanced one pass small out, 39373 +github, level 9 with dict dms, advanced one pass small out, 39373 +github, level 9 with dict dds, advanced one pass small out, 39378 +github, level 9 with dict copy, advanced one pass small out, 39368 +github, level 9 with dict load, advanced one pass small out, 42684 +github, level 11 row 1, advanced one pass small out, 135367 +github, level 11 row 1 with dict dms, advanced one pass small out, 39657 +github, level 11 row 1 with dict dds, advanced one pass small out, 39657 +github, level 11 row 1 with dict copy, advanced one pass small out, 39637 +github, level 11 row 1 with dict load, advanced one pass small out, 42745 +github, level 11 row 2, advanced one pass small out, 135367 +github, level 11 row 2 with dict dms, advanced one pass small out, 39657 +github, level 11 row 2 with dict dds, advanced one pass small out, 39657 +github, level 11 row 2 with dict copy, advanced one pass small out, 39637 +github, level 11 row 2 with dict load, advanced one pass small out, 42745 +github, level 12 row 1, advanced one pass small out, 134395 +github, level 12 row 1 with dict dms, advanced one pass small out, 39677 +github, level 12 row 1 with dict dds, advanced one pass small out, 39677 +github, level 12 row 1 with dict copy, advanced one pass small out, 39677 +github, level 12 row 1 with dict load, advanced one pass small out, 42425 +github, level 12 row 2, advanced one pass small out, 134395 +github, level 12 row 2 with dict dms, advanced one pass small out, 39677 +github, level 12 row 2 with dict dds, advanced one pass small out, 39677 +github, level 12 row 2 with dict copy, advanced one pass small out, 39677 +github, level 12 row 2 with dict load, advanced one pass small out, 42425 +github, level 13, advanced one pass small out, 132873 +github, level 13 with dict, advanced one pass small out, 39907 +github, level 13 with dict dms, advanced one pass small out, 39907 +github, level 13 with dict dds, advanced one pass small out, 39907 +github, level 13 with dict copy, advanced one pass small out, 39958 +github, level 13 with dict load, advanced one pass small out, 43225 +github, level 16, advanced one pass small out, 133013 +github, level 16 with dict, advanced one pass small out, 37893 +github, level 16 with dict dms, advanced one pass small out, 37893 +github, level 16 with dict dds, advanced one pass small out, 37893 +github, level 16 with dict copy, advanced one pass small out, 37892 +github, level 16 with dict load, advanced one pass small out, 42997 +github, level 19, advanced one pass small out, 132883 +github, level 19 with dict, advanced one pass small out, 37907 +github, level 19 with dict dms, advanced one pass small out, 37907 +github, level 19 with dict dds, advanced one pass small out, 37907 +github, level 19 with dict copy, advanced one pass small out, 37906 +github, level 19 with dict load, advanced one pass small out, 40821 +github, no source size, advanced one pass small out, 135908 +github, no source size with dict, advanced one pass small out, 41081 +github, long distance mode, advanced one pass small out, 135908 +github, multithreaded, advanced one pass small out, 135908 +github, multithreaded long distance mode, advanced one pass small out, 135908 +github, small window log, advanced one pass small out, 135908 +github, small hash log, advanced one pass small out, 135741 +github, small chain log, advanced one pass small out, 135592 +github, explicit params, advanced one pass small out, 137722 +github, uncompressed literals, advanced one pass small out, 166319 +github, uncompressed literals optimal, advanced one pass small out, 154095 +github, huffman literals, advanced one pass small out, 142361 +github, multithreaded with advanced params, advanced one pass small out, 166319 +github.tar, level -5, advanced one pass small out, 52372 +github.tar, level -5 with dict, advanced one pass small out, 50839 +github.tar, level -3, advanced one pass small out, 45858 +github.tar, level -3 with dict, advanced one pass small out, 44840 +github.tar, level -1, advanced one pass small out, 42608 +github.tar, level -1 with dict, advanced one pass small out, 41234 +github.tar, level 0, advanced one pass small out, 38869 +github.tar, level 0 with dict, advanced one pass small out, 38057 +github.tar, level 0 with dict dms, advanced one pass small out, 38091 +github.tar, level 0 with dict dds, advanced one pass small out, 38091 +github.tar, level 0 with dict copy, advanced one pass small out, 38057 +github.tar, level 0 with dict load, advanced one pass small out, 37967 +github.tar, level 1, advanced one pass small out, 39407 +github.tar, level 1 with dict, advanced one pass small out, 38175 +github.tar, level 1 with dict dms, advanced one pass small out, 38140 +github.tar, level 1 with dict dds, advanced one pass small out, 38140 +github.tar, level 1 with dict copy, advanced one pass small out, 38175 +github.tar, level 1 with dict load, advanced one pass small out, 38665 +github.tar, level 3, advanced one pass small out, 38869 +github.tar, level 3 with dict, advanced one pass small out, 38057 +github.tar, level 3 with dict dms, advanced one pass small out, 38091 +github.tar, level 3 with dict dds, advanced one pass small out, 38091 +github.tar, level 3 with dict copy, advanced one pass small out, 38057 +github.tar, level 3 with dict load, advanced one pass small out, 37967 +github.tar, level 4, advanced one pass small out, 38869 +github.tar, level 4 with dict, advanced one pass small out, 38035 +github.tar, level 4 with dict dms, advanced one pass small out, 38030 +github.tar, level 4 with dict dds, advanced one pass small out, 38030 +github.tar, level 4 with dict copy, advanced one pass small out, 38035 +github.tar, level 4 with dict load, advanced one pass small out, 37874 +github.tar, level 5 row 1, advanced one pass small out, 39641 +github.tar, level 5 row 1 with dict dms, advanced one pass small out, 39038 +github.tar, level 5 row 1 with dict dds, advanced one pass small out, 39092 +github.tar, level 5 row 1 with dict copy, advanced one pass small out, 38978 +github.tar, level 5 row 1 with dict load, advanced one pass small out, 38981 +github.tar, level 5 row 2, advanced one pass small out, 39696 +github.tar, level 5 row 2 with dict dms, advanced one pass small out, 39404 +github.tar, level 5 row 2 with dict dds, advanced one pass small out, 39269 +github.tar, level 5 row 2 with dict copy, advanced one pass small out, 39706 +github.tar, level 5 row 2 with dict load, advanced one pass small out, 39158 +github.tar, level 5, advanced one pass small out, 39641 +github.tar, level 5 with dict, advanced one pass small out, 38978 +github.tar, level 5 with dict dms, advanced one pass small out, 39038 +github.tar, level 5 with dict dds, advanced one pass small out, 39092 +github.tar, level 5 with dict copy, advanced one pass small out, 38978 +github.tar, level 5 with dict load, advanced one pass small out, 38981 +github.tar, level 6, advanced one pass small out, 39292 +github.tar, level 6 with dict, advanced one pass small out, 38635 +github.tar, level 6 with dict dms, advanced one pass small out, 38649 +github.tar, level 6 with dict dds, advanced one pass small out, 38689 +github.tar, level 6 with dict copy, advanced one pass small out, 38635 +github.tar, level 6 with dict load, advanced one pass small out, 38635 +github.tar, level 7 row 1, advanced one pass small out, 38006 +github.tar, level 7 row 1 with dict dms, advanced one pass small out, 37916 +github.tar, level 7 row 1 with dict dds, advanced one pass small out, 37973 +github.tar, level 7 row 1 with dict copy, advanced one pass small out, 37887 +github.tar, level 7 row 1 with dict load, advanced one pass small out, 37307 +github.tar, level 7 row 2, advanced one pass small out, 38079 +github.tar, level 7 row 2 with dict dms, advanced one pass small out, 38134 +github.tar, level 7 row 2 with dict dds, advanced one pass small out, 38143 +github.tar, level 7 row 2 with dict copy, advanced one pass small out, 38149 +github.tar, level 7 row 2 with dict load, advanced one pass small out, 37403 +github.tar, level 7, advanced one pass small out, 38006 +github.tar, level 7 with dict, advanced one pass small out, 37887 +github.tar, level 7 with dict dms, advanced one pass small out, 37916 +github.tar, level 7 with dict dds, advanced one pass small out, 37973 +github.tar, level 7 with dict copy, advanced one pass small out, 37887 +github.tar, level 7 with dict load, advanced one pass small out, 37307 +github.tar, level 9, advanced one pass small out, 36749 +github.tar, level 9 with dict, advanced one pass small out, 36540 +github.tar, level 9 with dict dms, advanced one pass small out, 36818 +github.tar, level 9 with dict dds, advanced one pass small out, 36912 +github.tar, level 9 with dict copy, advanced one pass small out, 36540 +github.tar, level 9 with dict load, advanced one pass small out, 36334 +github.tar, level 11 row 1, advanced one pass small out, 36061 +github.tar, level 11 row 1 with dict dms, advanced one pass small out, 37018 +github.tar, level 11 row 1 with dict dds, advanced one pass small out, 37018 +github.tar, level 11 row 1 with dict copy, advanced one pass small out, 36648 +github.tar, level 11 row 1 with dict load, advanced one pass small out, 36415 +github.tar, level 11 row 2, advanced one pass small out, 36110 +github.tar, level 11 row 2 with dict dms, advanced one pass small out, 37018 +github.tar, level 11 row 2 with dict dds, advanced one pass small out, 37018 +github.tar, level 11 row 2 with dict copy, advanced one pass small out, 36648 +github.tar, level 11 row 2 with dict load, advanced one pass small out, 36459 +github.tar, level 12 row 1, advanced one pass small out, 36061 +github.tar, level 12 row 1 with dict dms, advanced one pass small out, 36974 +github.tar, level 12 row 1 with dict dds, advanced one pass small out, 36974 +github.tar, level 12 row 1 with dict copy, advanced one pass small out, 36627 +github.tar, level 12 row 1 with dict load, advanced one pass small out, 36415 +github.tar, level 12 row 2, advanced one pass small out, 36110 +github.tar, level 12 row 2 with dict dms, advanced one pass small out, 36974 +github.tar, level 12 row 2 with dict dds, advanced one pass small out, 36974 +github.tar, level 12 row 2 with dict copy, advanced one pass small out, 36627 +github.tar, level 12 row 2 with dict load, advanced one pass small out, 36459 +github.tar, level 13, advanced one pass small out, 35501 +github.tar, level 13 with dict, advanced one pass small out, 37219 +github.tar, level 13 with dict dms, advanced one pass small out, 37245 +github.tar, level 13 with dict dds, advanced one pass small out, 37245 +github.tar, level 13 with dict copy, advanced one pass small out, 37219 +github.tar, level 13 with dict load, advanced one pass small out, 36006 +github.tar, level 16, advanced one pass small out, 40466 +github.tar, level 16 with dict, advanced one pass small out, 33364 +github.tar, level 16 with dict dms, advanced one pass small out, 33177 +github.tar, level 16 with dict dds, advanced one pass small out, 33177 +github.tar, level 16 with dict copy, advanced one pass small out, 33364 +github.tar, level 16 with dict load, advanced one pass small out, 39081 +github.tar, level 19, advanced one pass small out, 32262 +github.tar, level 19 with dict, advanced one pass small out, 32706 +github.tar, level 19 with dict dms, advanced one pass small out, 32563 +github.tar, level 19 with dict dds, advanced one pass small out, 32563 +github.tar, level 19 with dict copy, advanced one pass small out, 32706 +github.tar, level 19 with dict load, advanced one pass small out, 32428 +github.tar, no source size, advanced one pass small out, 38869 +github.tar, no source size with dict, advanced one pass small out, 38057 +github.tar, long distance mode, advanced one pass small out, 40161 +github.tar, multithreaded, advanced one pass small out, 38869 +github.tar, multithreaded long distance mode, advanced one pass small out, 40144 +github.tar, small window log, advanced one pass small out, 198464 +github.tar, small hash log, advanced one pass small out, 139881 +github.tar, small chain log, advanced one pass small out, 41929 +github.tar, explicit params, advanced one pass small out, 41325 +github.tar, uncompressed literals, advanced one pass small out, 41545 +github.tar, uncompressed literals optimal, advanced one pass small out, 35351 +github.tar, huffman literals, advanced one pass small out, 38837 +github.tar, multithreaded with advanced params, advanced one pass small out, 41545 +silesia, level -5, advanced streaming, 6841178 +silesia, level -3, advanced streaming, 6487874 +silesia, level -1, advanced streaming, 6165555 +silesia, level 0, advanced streaming, 4837006 +silesia, level 1, advanced streaming, 5304453 +silesia, level 3, advanced streaming, 4837006 +silesia, level 4, advanced streaming, 4778812 +silesia, level 5 row 1, advanced streaming, 4664945 +silesia, level 5 row 2, advanced streaming, 4668640 +silesia, level 5, advanced streaming, 4664945 +silesia, level 6, advanced streaming, 4601002 +silesia, level 7 row 1, advanced streaming, 4567594 +silesia, level 7 row 2, advanced streaming, 4562045 +silesia, level 7, advanced streaming, 4567594 +silesia, level 9, advanced streaming, 4542619 +silesia, level 11 row 1, advanced streaming, 4502500 +silesia, level 11 row 2, advanced streaming, 4500021 +silesia, level 12 row 1, advanced streaming, 4502500 +silesia, level 12 row 2, advanced streaming, 4500021 +silesia, level 13, advanced streaming, 4490642 +silesia, level 16, advanced streaming, 4358094 +silesia, level 19, advanced streaming, 4265861 +silesia, no source size, advanced streaming, 4836970 +silesia, long distance mode, advanced streaming, 4828392 +silesia, multithreaded, advanced streaming, 4834367 +silesia, multithreaded long distance mode, advanced streaming, 4825826 +silesia, small window log, advanced streaming, 7110057 +silesia, small hash log, advanced streaming, 6523213 +silesia, small chain log, advanced streaming, 4913993 +silesia, explicit params, advanced streaming, 4792360 +silesia, uncompressed literals, advanced streaming, 5119531 +silesia, uncompressed literals optimal, advanced streaming, 4316627 +silesia, huffman literals, advanced streaming, 5313520 +silesia, multithreaded with advanced params, advanced streaming, 5121296 +silesia.tar, level -5, advanced streaming, 6841049 +silesia.tar, level -3, advanced streaming, 6487265 +silesia.tar, level -1, advanced streaming, 6167047 +silesia.tar, level 0, advanced streaming, 4848982 +silesia.tar, level 1, advanced streaming, 5307228 +silesia.tar, level 3, advanced streaming, 4848982 +silesia.tar, level 4, advanced streaming, 4791542 +silesia.tar, level 5 row 1, advanced streaming, 4664857 +silesia.tar, level 5 row 2, advanced streaming, 4669623 +silesia.tar, level 5, advanced streaming, 4664857 +silesia.tar, level 6, advanced streaming, 4599354 +silesia.tar, level 7 row 1, advanced streaming, 4565937 +silesia.tar, level 7 row 2, advanced streaming, 4561093 +silesia.tar, level 7, advanced streaming, 4565937 +silesia.tar, level 9, advanced streaming, 4539555 +silesia.tar, level 11 row 1, advanced streaming, 4498592 +silesia.tar, level 11 row 2, advanced streaming, 4497256 +silesia.tar, level 12 row 1, advanced streaming, 4498287 +silesia.tar, level 12 row 2, advanced streaming, 4497492 +silesia.tar, level 13, advanced streaming, 4486617 +silesia.tar, level 16, advanced streaming, 4358051 +silesia.tar, level 19, advanced streaming, 4258567 +silesia.tar, no source size, advanced streaming, 4848978 +silesia.tar, long distance mode, advanced streaming, 4827655 +silesia.tar, multithreaded, advanced streaming, 4837302 +silesia.tar, multithreaded long distance mode, advanced streaming, 4829932 +silesia.tar, small window log, advanced streaming, 7116189 +silesia.tar, small hash log, advanced streaming, 6527609 +silesia.tar, small chain log, advanced streaming, 4918341 +silesia.tar, explicit params, advanced streaming, 4791598 +silesia.tar, uncompressed literals, advanced streaming, 5127412 +silesia.tar, uncompressed literals optimal, advanced streaming, 4306701 +silesia.tar, huffman literals, advanced streaming, 5317031 +silesia.tar, multithreaded with advanced params, advanced streaming, 5119701 +github, level -5, advanced streaming, 203114 +github, level -5 with dict, advanced streaming, 46188 +github, level -3, advanced streaming, 193442 +github, level -3 with dict, advanced streaming, 44112 +github, level -1, advanced streaming, 175450 +github, level -1 with dict, advanced streaming, 42057 +github, level 0, advanced streaming, 135908 +github, level 0 with dict, advanced streaming, 41081 +github, level 0 with dict dms, advanced streaming, 41081 +github, level 0 with dict dds, advanced streaming, 41081 +github, level 0 with dict copy, advanced streaming, 41086 +github, level 0 with dict load, advanced streaming, 41789 +github, level 1, advanced streaming, 142361 +github, level 1 with dict, advanced streaming, 42800 +github, level 1 with dict dms, advanced streaming, 42800 +github, level 1 with dict dds, advanced streaming, 42800 +github, level 1 with dict copy, advanced streaming, 42806 +github, level 1 with dict load, advanced streaming, 42362 +github, level 3, advanced streaming, 135908 +github, level 3 with dict, advanced streaming, 41081 +github, level 3 with dict dms, advanced streaming, 41081 +github, level 3 with dict dds, advanced streaming, 41081 +github, level 3 with dict copy, advanced streaming, 41086 +github, level 3 with dict load, advanced streaming, 41789 +github, level 4, advanced streaming, 136199 +github, level 4 with dict, advanced streaming, 41157 +github, level 4 with dict dms, advanced streaming, 41157 +github, level 4 with dict dds, advanced streaming, 41157 +github, level 4 with dict copy, advanced streaming, 41165 +github, level 4 with dict load, advanced streaming, 42390 +github, level 5 row 1, advanced streaming, 134584 +github, level 5 row 1 with dict dms, advanced streaming, 38740 +github, level 5 row 1 with dict dds, advanced streaming, 38716 +github, level 5 row 1 with dict copy, advanced streaming, 38738 +github, level 5 row 1 with dict load, advanced streaming, 41321 +github, level 5 row 2, advanced streaming, 135119 +github, level 5 row 2 with dict dms, advanced streaming, 38937 +github, level 5 row 2 with dict dds, advanced streaming, 38731 +github, level 5 row 2 with dict copy, advanced streaming, 38920 +github, level 5 row 2 with dict load, advanced streaming, 41068 +github, level 5, advanced streaming, 135119 +github, level 5 with dict, advanced streaming, 38740 +github, level 5 with dict dms, advanced streaming, 38740 +github, level 5 with dict dds, advanced streaming, 38716 +github, level 5 with dict copy, advanced streaming, 38738 +github, level 5 with dict load, advanced streaming, 41068 +github, level 6, advanced streaming, 135122 +github, level 6 with dict, advanced streaming, 38647 +github, level 6 with dict dms, advanced streaming, 38647 +github, level 6 with dict dds, advanced streaming, 38623 +github, level 6 with dict copy, advanced streaming, 38645 +github, level 6 with dict load, advanced streaming, 40982 +github, level 7 row 1, advanced streaming, 134584 +github, level 7 row 1 with dict dms, advanced streaming, 38763 +github, level 7 row 1 with dict dds, advanced streaming, 38725 +github, level 7 row 1 with dict copy, advanced streaming, 38764 +github, level 7 row 1 with dict load, advanced streaming, 43015 +github, level 7 row 2, advanced streaming, 135122 +github, level 7 row 2 with dict dms, advanced streaming, 38838 +github, level 7 row 2 with dict dds, advanced streaming, 38727 +github, level 7 row 2 with dict copy, advanced streaming, 38841 +github, level 7 row 2 with dict load, advanced streaming, 40982 +github, level 7, advanced streaming, 135122 +github, level 7 with dict, advanced streaming, 38763 +github, level 7 with dict dms, advanced streaming, 38763 +github, level 7 with dict dds, advanced streaming, 38725 +github, level 7 with dict copy, advanced streaming, 38764 +github, level 7 with dict load, advanced streaming, 40982 +github, level 9, advanced streaming, 135122 +github, level 9 with dict, advanced streaming, 39373 +github, level 9 with dict dms, advanced streaming, 39373 +github, level 9 with dict dds, advanced streaming, 39378 +github, level 9 with dict copy, advanced streaming, 39368 +github, level 9 with dict load, advanced streaming, 42684 +github, level 11 row 1, advanced streaming, 135367 +github, level 11 row 1 with dict dms, advanced streaming, 39657 +github, level 11 row 1 with dict dds, advanced streaming, 39657 +github, level 11 row 1 with dict copy, advanced streaming, 39637 +github, level 11 row 1 with dict load, advanced streaming, 42745 +github, level 11 row 2, advanced streaming, 135367 +github, level 11 row 2 with dict dms, advanced streaming, 39657 +github, level 11 row 2 with dict dds, advanced streaming, 39657 +github, level 11 row 2 with dict copy, advanced streaming, 39637 +github, level 11 row 2 with dict load, advanced streaming, 42745 +github, level 12 row 1, advanced streaming, 134395 +github, level 12 row 1 with dict dms, advanced streaming, 39677 +github, level 12 row 1 with dict dds, advanced streaming, 39677 +github, level 12 row 1 with dict copy, advanced streaming, 39677 +github, level 12 row 1 with dict load, advanced streaming, 42425 +github, level 12 row 2, advanced streaming, 134395 +github, level 12 row 2 with dict dms, advanced streaming, 39677 +github, level 12 row 2 with dict dds, advanced streaming, 39677 +github, level 12 row 2 with dict copy, advanced streaming, 39677 +github, level 12 row 2 with dict load, advanced streaming, 42425 +github, level 13, advanced streaming, 132873 +github, level 13 with dict, advanced streaming, 39907 +github, level 13 with dict dms, advanced streaming, 39907 +github, level 13 with dict dds, advanced streaming, 39907 +github, level 13 with dict copy, advanced streaming, 39958 +github, level 13 with dict load, advanced streaming, 43225 +github, level 16, advanced streaming, 133013 +github, level 16 with dict, advanced streaming, 37893 +github, level 16 with dict dms, advanced streaming, 37893 +github, level 16 with dict dds, advanced streaming, 37893 +github, level 16 with dict copy, advanced streaming, 37892 +github, level 16 with dict load, advanced streaming, 42997 +github, level 19, advanced streaming, 132883 +github, level 19 with dict, advanced streaming, 37907 +github, level 19 with dict dms, advanced streaming, 37907 +github, level 19 with dict dds, advanced streaming, 37907 +github, level 19 with dict copy, advanced streaming, 37906 +github, level 19 with dict load, advanced streaming, 40821 +github, no source size, advanced streaming, 135908 +github, no source size with dict, advanced streaming, 41081 +github, long distance mode, advanced streaming, 135908 +github, multithreaded, advanced streaming, 135908 +github, multithreaded long distance mode, advanced streaming, 135908 +github, small window log, advanced streaming, 135908 +github, small hash log, advanced streaming, 135741 +github, small chain log, advanced streaming, 135592 +github, explicit params, advanced streaming, 137722 +github, uncompressed literals, advanced streaming, 166319 +github, uncompressed literals optimal, advanced streaming, 154095 +github, huffman literals, advanced streaming, 142361 +github, multithreaded with advanced params, advanced streaming, 166319 +github.tar, level -5, advanced streaming, 52454 +github.tar, level -5 with dict, advanced streaming, 50929 +github.tar, level -3, advanced streaming, 45911 +github.tar, level -3 with dict, advanced streaming, 44938 +github.tar, level -1, advanced streaming, 42647 +github.tar, level -1 with dict, advanced streaming, 41290 +github.tar, level 0, advanced streaming, 38869 +github.tar, level 0 with dict, advanced streaming, 38057 +github.tar, level 0 with dict dms, advanced streaming, 38091 +github.tar, level 0 with dict dds, advanced streaming, 38091 +github.tar, level 0 with dict copy, advanced streaming, 38057 +github.tar, level 0 with dict load, advanced streaming, 37967 +github.tar, level 1, advanced streaming, 39468 +github.tar, level 1 with dict, advanced streaming, 38248 +github.tar, level 1 with dict dms, advanced streaming, 38287 +github.tar, level 1 with dict dds, advanced streaming, 38287 +github.tar, level 1 with dict copy, advanced streaming, 38248 +github.tar, level 1 with dict load, advanced streaming, 38809 +github.tar, level 3, advanced streaming, 38869 +github.tar, level 3 with dict, advanced streaming, 38057 +github.tar, level 3 with dict dms, advanced streaming, 38091 +github.tar, level 3 with dict dds, advanced streaming, 38091 +github.tar, level 3 with dict copy, advanced streaming, 38057 +github.tar, level 3 with dict load, advanced streaming, 37967 +github.tar, level 4, advanced streaming, 38869 +github.tar, level 4 with dict, advanced streaming, 38035 +github.tar, level 4 with dict dms, advanced streaming, 38030 +github.tar, level 4 with dict dds, advanced streaming, 38030 +github.tar, level 4 with dict copy, advanced streaming, 38035 +github.tar, level 4 with dict load, advanced streaming, 37874 +github.tar, level 5 row 1, advanced streaming, 39641 +github.tar, level 5 row 1 with dict dms, advanced streaming, 39038 +github.tar, level 5 row 1 with dict dds, advanced streaming, 39092 +github.tar, level 5 row 1 with dict copy, advanced streaming, 38978 +github.tar, level 5 row 1 with dict load, advanced streaming, 38981 +github.tar, level 5 row 2, advanced streaming, 39696 +github.tar, level 5 row 2 with dict dms, advanced streaming, 39404 +github.tar, level 5 row 2 with dict dds, advanced streaming, 39269 +github.tar, level 5 row 2 with dict copy, advanced streaming, 39706 +github.tar, level 5 row 2 with dict load, advanced streaming, 39158 +github.tar, level 5, advanced streaming, 39641 +github.tar, level 5 with dict, advanced streaming, 38978 +github.tar, level 5 with dict dms, advanced streaming, 39038 +github.tar, level 5 with dict dds, advanced streaming, 39092 +github.tar, level 5 with dict copy, advanced streaming, 38978 +github.tar, level 5 with dict load, advanced streaming, 38981 +github.tar, level 6, advanced streaming, 39292 +github.tar, level 6 with dict, advanced streaming, 38635 +github.tar, level 6 with dict dms, advanced streaming, 38649 +github.tar, level 6 with dict dds, advanced streaming, 38689 +github.tar, level 6 with dict copy, advanced streaming, 38635 +github.tar, level 6 with dict load, advanced streaming, 38635 +github.tar, level 7 row 1, advanced streaming, 38006 +github.tar, level 7 row 1 with dict dms, advanced streaming, 37916 +github.tar, level 7 row 1 with dict dds, advanced streaming, 37973 +github.tar, level 7 row 1 with dict copy, advanced streaming, 37887 +github.tar, level 7 row 1 with dict load, advanced streaming, 37307 +github.tar, level 7 row 2, advanced streaming, 38079 +github.tar, level 7 row 2 with dict dms, advanced streaming, 38134 +github.tar, level 7 row 2 with dict dds, advanced streaming, 38143 +github.tar, level 7 row 2 with dict copy, advanced streaming, 38149 +github.tar, level 7 row 2 with dict load, advanced streaming, 37403 +github.tar, level 7, advanced streaming, 38006 +github.tar, level 7 with dict, advanced streaming, 37887 +github.tar, level 7 with dict dms, advanced streaming, 37916 +github.tar, level 7 with dict dds, advanced streaming, 37973 +github.tar, level 7 with dict copy, advanced streaming, 37887 +github.tar, level 7 with dict load, advanced streaming, 37307 +github.tar, level 9, advanced streaming, 36749 +github.tar, level 9 with dict, advanced streaming, 36540 +github.tar, level 9 with dict dms, advanced streaming, 36818 +github.tar, level 9 with dict dds, advanced streaming, 36912 +github.tar, level 9 with dict copy, advanced streaming, 36540 +github.tar, level 9 with dict load, advanced streaming, 36334 +github.tar, level 11 row 1, advanced streaming, 36061 +github.tar, level 11 row 1 with dict dms, advanced streaming, 37018 +github.tar, level 11 row 1 with dict dds, advanced streaming, 37018 +github.tar, level 11 row 1 with dict copy, advanced streaming, 36648 +github.tar, level 11 row 1 with dict load, advanced streaming, 36415 +github.tar, level 11 row 2, advanced streaming, 36110 +github.tar, level 11 row 2 with dict dms, advanced streaming, 37018 +github.tar, level 11 row 2 with dict dds, advanced streaming, 37018 +github.tar, level 11 row 2 with dict copy, advanced streaming, 36648 +github.tar, level 11 row 2 with dict load, advanced streaming, 36459 +github.tar, level 12 row 1, advanced streaming, 36061 +github.tar, level 12 row 1 with dict dms, advanced streaming, 36974 +github.tar, level 12 row 1 with dict dds, advanced streaming, 36974 +github.tar, level 12 row 1 with dict copy, advanced streaming, 36627 +github.tar, level 12 row 1 with dict load, advanced streaming, 36415 +github.tar, level 12 row 2, advanced streaming, 36110 +github.tar, level 12 row 2 with dict dms, advanced streaming, 36974 +github.tar, level 12 row 2 with dict dds, advanced streaming, 36974 +github.tar, level 12 row 2 with dict copy, advanced streaming, 36627 +github.tar, level 12 row 2 with dict load, advanced streaming, 36459 +github.tar, level 13, advanced streaming, 35501 +github.tar, level 13 with dict, advanced streaming, 37219 +github.tar, level 13 with dict dms, advanced streaming, 37245 +github.tar, level 13 with dict dds, advanced streaming, 37245 +github.tar, level 13 with dict copy, advanced streaming, 37219 +github.tar, level 13 with dict load, advanced streaming, 36006 +github.tar, level 16, advanced streaming, 40466 +github.tar, level 16 with dict, advanced streaming, 33364 +github.tar, level 16 with dict dms, advanced streaming, 33177 +github.tar, level 16 with dict dds, advanced streaming, 33177 +github.tar, level 16 with dict copy, advanced streaming, 33364 +github.tar, level 16 with dict load, advanced streaming, 39081 +github.tar, level 19, advanced streaming, 32262 +github.tar, level 19 with dict, advanced streaming, 32706 +github.tar, level 19 with dict dms, advanced streaming, 32563 +github.tar, level 19 with dict dds, advanced streaming, 32563 +github.tar, level 19 with dict copy, advanced streaming, 32706 +github.tar, level 19 with dict load, advanced streaming, 32428 +github.tar, no source size, advanced streaming, 38866 +github.tar, no source size with dict, advanced streaming, 38088 +github.tar, long distance mode, advanced streaming, 40161 +github.tar, multithreaded, advanced streaming, 38869 +github.tar, multithreaded long distance mode, advanced streaming, 40144 +github.tar, small window log, advanced streaming, 199491 +github.tar, small hash log, advanced streaming, 139881 +github.tar, small chain log, advanced streaming, 41929 +github.tar, explicit params, advanced streaming, 41326 +github.tar, uncompressed literals, advanced streaming, 41545 +github.tar, uncompressed literals optimal, advanced streaming, 35351 +github.tar, huffman literals, advanced streaming, 38893 +github.tar, multithreaded with advanced params, advanced streaming, 41545 +silesia, level -5, old streaming, 6841178 +silesia, level -3, old streaming, 6487874 +silesia, level -1, old streaming, 6165555 +silesia, level 0, old streaming, 4837006 +silesia, level 1, old streaming, 5304453 +silesia, level 3, old streaming, 4837006 +silesia, level 4, old streaming, 4778812 +silesia, level 5, old streaming, 4664945 +silesia, level 6, old streaming, 4601002 +silesia, level 7, old streaming, 4567594 +silesia, level 9, old streaming, 4542619 +silesia, level 13, old streaming, 4490642 +silesia, level 16, old streaming, 4358094 +silesia, level 19, old streaming, 4265861 +silesia, no source size, old streaming, 4836970 +silesia, uncompressed literals, old streaming, 4837006 +silesia, uncompressed literals optimal, old streaming, 4265861 +silesia, huffman literals, old streaming, 6165555 +silesia.tar, level -5, old streaming, 6841049 +silesia.tar, level -3, old streaming, 6487265 +silesia.tar, level -1, old streaming, 6167047 +silesia.tar, level 0, old streaming, 4848982 +silesia.tar, level 1, old streaming, 5307228 +silesia.tar, level 3, old streaming, 4848982 +silesia.tar, level 4, old streaming, 4791542 +silesia.tar, level 5, old streaming, 4664857 +silesia.tar, level 6, old streaming, 4599354 +silesia.tar, level 7, old streaming, 4565937 +silesia.tar, level 9, old streaming, 4539555 +silesia.tar, level 13, old streaming, 4486617 +silesia.tar, level 16, old streaming, 4358051 +silesia.tar, level 19, old streaming, 4258567 +silesia.tar, no source size, old streaming, 4848978 +silesia.tar, uncompressed literals, old streaming, 4848982 +silesia.tar, uncompressed literals optimal, old streaming, 4258567 +silesia.tar, huffman literals, old streaming, 6167047 +github, level -5, old streaming, 203114 +github, level -5 with dict, old streaming, 46188 +github, level -3, old streaming, 193442 +github, level -3 with dict, old streaming, 44112 +github, level -1, old streaming, 175450 +github, level -1 with dict, old streaming, 42057 +github, level 0, old streaming, 135908 +github, level 0 with dict, old streaming, 41081 +github, level 1, old streaming, 142361 +github, level 1 with dict, old streaming, 42800 +github, level 3, old streaming, 135908 +github, level 3 with dict, old streaming, 41081 +github, level 4, old streaming, 136199 +github, level 4 with dict, old streaming, 41157 +github, level 5, old streaming, 135119 +github, level 5 with dict, old streaming, 38740 +github, level 6, old streaming, 135122 +github, level 6 with dict, old streaming, 38647 +github, level 7, old streaming, 135122 +github, level 7 with dict, old streaming, 38763 +github, level 9, old streaming, 135122 +github, level 9 with dict, old streaming, 39373 +github, level 13, old streaming, 132873 +github, level 13 with dict, old streaming, 39907 +github, level 16, old streaming, 133013 +github, level 16 with dict, old streaming, 37893 +github, level 19, old streaming, 132883 +github, level 19 with dict, old streaming, 37907 +github, no source size, old streaming, 140599 +github, no source size with dict, old streaming, 40617 +github, uncompressed literals, old streaming, 135908 +github, uncompressed literals optimal, old streaming, 132883 +github, huffman literals, old streaming, 175450 +github.tar, level -5, old streaming, 52454 +github.tar, level -5 with dict, old streaming, 50929 +github.tar, level -3, old streaming, 45911 +github.tar, level -3 with dict, old streaming, 44938 +github.tar, level -1, old streaming, 42647 +github.tar, level -1 with dict, old streaming, 41290 +github.tar, level 0, old streaming, 38869 +github.tar, level 0 with dict, old streaming, 38057 +github.tar, level 1, old streaming, 39468 +github.tar, level 1 with dict, old streaming, 38248 +github.tar, level 3, old streaming, 38869 +github.tar, level 3 with dict, old streaming, 38057 +github.tar, level 4, old streaming, 38869 +github.tar, level 4 with dict, old streaming, 38035 +github.tar, level 5, old streaming, 39641 +github.tar, level 5 with dict, old streaming, 38978 +github.tar, level 6, old streaming, 39292 +github.tar, level 6 with dict, old streaming, 38635 +github.tar, level 7, old streaming, 38006 +github.tar, level 7 with dict, old streaming, 37887 +github.tar, level 9, old streaming, 36749 +github.tar, level 9 with dict, old streaming, 36540 +github.tar, level 13, old streaming, 35501 +github.tar, level 13 with dict, old streaming, 37219 +github.tar, level 16, old streaming, 40466 +github.tar, level 16 with dict, old streaming, 33364 +github.tar, level 19, old streaming, 32262 +github.tar, level 19 with dict, old streaming, 32706 +github.tar, no source size, old streaming, 38866 +github.tar, no source size with dict, old streaming, 38088 +github.tar, uncompressed literals, old streaming, 38869 +github.tar, uncompressed literals optimal, old streaming, 32262 +github.tar, huffman literals, old streaming, 42647 +silesia, level -5, old streaming advanced, 6841178 +silesia, level -3, old streaming advanced, 6487874 +silesia, level -1, old streaming advanced, 6165555 +silesia, level 0, old streaming advanced, 4837006 +silesia, level 1, old streaming advanced, 5304453 +silesia, level 3, old streaming advanced, 4837006 +silesia, level 4, old streaming advanced, 4778812 +silesia, level 5, old streaming advanced, 4664945 +silesia, level 6, old streaming advanced, 4601002 +silesia, level 7, old streaming advanced, 4567594 +silesia, level 9, old streaming advanced, 4542619 +silesia, level 13, old streaming advanced, 4490642 +silesia, level 16, old streaming advanced, 4358094 +silesia, level 19, old streaming advanced, 4265861 +silesia, no source size, old streaming advanced, 4836970 +silesia, long distance mode, old streaming advanced, 4837006 +silesia, multithreaded, old streaming advanced, 4837006 +silesia, multithreaded long distance mode, old streaming advanced, 4837006 +silesia, small window log, old streaming advanced, 7110057 +silesia, small hash log, old streaming advanced, 6523213 +silesia, small chain log, old streaming advanced, 4913993 +silesia, explicit params, old streaming advanced, 4792360 +silesia, uncompressed literals, old streaming advanced, 4837006 +silesia, uncompressed literals optimal, old streaming advanced, 4265861 +silesia, huffman literals, old streaming advanced, 6165555 +silesia, multithreaded with advanced params, old streaming advanced, 4837006 +silesia.tar, level -5, old streaming advanced, 6841049 +silesia.tar, level -3, old streaming advanced, 6487265 +silesia.tar, level -1, old streaming advanced, 6167047 +silesia.tar, level 0, old streaming advanced, 4848982 +silesia.tar, level 1, old streaming advanced, 5307228 +silesia.tar, level 3, old streaming advanced, 4848982 +silesia.tar, level 4, old streaming advanced, 4791542 +silesia.tar, level 5, old streaming advanced, 4664857 +silesia.tar, level 6, old streaming advanced, 4599354 +silesia.tar, level 7, old streaming advanced, 4565937 +silesia.tar, level 9, old streaming advanced, 4539555 +silesia.tar, level 13, old streaming advanced, 4486617 +silesia.tar, level 16, old streaming advanced, 4358051 +silesia.tar, level 19, old streaming advanced, 4258567 +silesia.tar, no source size, old streaming advanced, 4848978 +silesia.tar, long distance mode, old streaming advanced, 4848982 +silesia.tar, multithreaded, old streaming advanced, 4848982 +silesia.tar, multithreaded long distance mode, old streaming advanced, 4848982 +silesia.tar, small window log, old streaming advanced, 7116192 +silesia.tar, small hash log, old streaming advanced, 6527609 +silesia.tar, small chain log, old streaming advanced, 4918341 +silesia.tar, explicit params, old streaming advanced, 4791598 +silesia.tar, uncompressed literals, old streaming advanced, 4848982 +silesia.tar, uncompressed literals optimal, old streaming advanced, 4258567 +silesia.tar, huffman literals, old streaming advanced, 6167047 +silesia.tar, multithreaded with advanced params, old streaming advanced, 4848982 +github, level -5, old streaming advanced, 213394 +github, level -5 with dict, old streaming advanced, 47674 +github, level -3, old streaming advanced, 196085 +github, level -3 with dict, old streaming advanced, 45993 +github, level -1, old streaming advanced, 181076 +github, level -1 with dict, old streaming advanced, 43599 +github, level 0, old streaming advanced, 141080 +github, level 0 with dict, old streaming advanced, 41063 +github, level 1, old streaming advanced, 143686 +github, level 1 with dict, old streaming advanced, 42299 +github, level 3, old streaming advanced, 141080 +github, level 3 with dict, old streaming advanced, 41063 +github, level 4, old streaming advanced, 141080 +github, level 4 with dict, old streaming advanced, 41043 +github, level 5, old streaming advanced, 139402 +github, level 5 with dict, old streaming advanced, 38747 +github, level 6, old streaming advanced, 138676 +github, level 6 with dict, old streaming advanced, 38774 +github, level 7, old streaming advanced, 138676 +github, level 7 with dict, old streaming advanced, 38889 +github, level 9, old streaming advanced, 138676 +github, level 9 with dict, old streaming advanced, 38952 +github, level 13, old streaming advanced, 138676 +github, level 13 with dict, old streaming advanced, 39724 +github, level 16, old streaming advanced, 138575 +github, level 16 with dict, old streaming advanced, 40804 +github, level 19, old streaming advanced, 132883 +github, level 19 with dict, old streaming advanced, 37907 +github, no source size, old streaming advanced, 140599 +github, no source size with dict, old streaming advanced, 40601 +github, long distance mode, old streaming advanced, 141080 +github, multithreaded, old streaming advanced, 141080 +github, multithreaded long distance mode, old streaming advanced, 141080 +github, small window log, old streaming advanced, 141080 +github, small hash log, old streaming advanced, 145406 +github, small chain log, old streaming advanced, 139651 +github, explicit params, old streaming advanced, 140930 +github, uncompressed literals, old streaming advanced, 141080 +github, uncompressed literals optimal, old streaming advanced, 132883 +github, huffman literals, old streaming advanced, 181076 +github, multithreaded with advanced params, old streaming advanced, 141080 +github.tar, level -5, old streaming advanced, 52454 +github.tar, level -5 with dict, old streaming advanced, 51374 +github.tar, level -3, old streaming advanced, 45911 +github.tar, level -3 with dict, old streaming advanced, 45416 +github.tar, level -1, old streaming advanced, 42647 +github.tar, level -1 with dict, old streaming advanced, 41753 +github.tar, level 0, old streaming advanced, 38869 +github.tar, level 0 with dict, old streaming advanced, 38105 +github.tar, level 1, old streaming advanced, 39468 +github.tar, level 1 with dict, old streaming advanced, 38841 +github.tar, level 3, old streaming advanced, 38869 +github.tar, level 3 with dict, old streaming advanced, 38105 +github.tar, level 4, old streaming advanced, 38869 +github.tar, level 4 with dict, old streaming advanced, 38032 +github.tar, level 5, old streaming advanced, 39641 +github.tar, level 5 with dict, old streaming advanced, 38987 +github.tar, level 6, old streaming advanced, 39292 +github.tar, level 6 with dict, old streaming advanced, 38625 +github.tar, level 7, old streaming advanced, 38006 +github.tar, level 7 with dict, old streaming advanced, 37332 +github.tar, level 9, old streaming advanced, 36749 +github.tar, level 9 with dict, old streaming advanced, 36379 +github.tar, level 13, old streaming advanced, 35501 +github.tar, level 13 with dict, old streaming advanced, 35759 +github.tar, level 16, old streaming advanced, 40466 +github.tar, level 16 with dict, old streaming advanced, 38578 +github.tar, level 19, old streaming advanced, 32262 +github.tar, level 19 with dict, old streaming advanced, 32694 +github.tar, no source size, old streaming advanced, 38866 +github.tar, no source size with dict, old streaming advanced, 38071 +github.tar, long distance mode, old streaming advanced, 38869 +github.tar, multithreaded, old streaming advanced, 38869 +github.tar, multithreaded long distance mode, old streaming advanced, 38869 +github.tar, small window log, old streaming advanced, 199494 +github.tar, small hash log, old streaming advanced, 139881 +github.tar, small chain log, old streaming advanced, 41929 +github.tar, explicit params, old streaming advanced, 41326 +github.tar, uncompressed literals, old streaming advanced, 38869 +github.tar, uncompressed literals optimal, old streaming advanced, 32262 +github.tar, huffman literals, old streaming advanced, 42647 +github.tar, multithreaded with advanced params, old streaming advanced, 38869 +github, level -5 with dict, old streaming cdict, 46188 +github, level -3 with dict, old streaming cdict, 44112 +github, level -1 with dict, old streaming cdict, 42057 +github, level 0 with dict, old streaming cdict, 41081 +github, level 1 with dict, old streaming cdict, 42800 +github, level 3 with dict, old streaming cdict, 41081 +github, level 4 with dict, old streaming cdict, 41157 +github, level 5 with dict, old streaming cdict, 38740 +github, level 6 with dict, old streaming cdict, 38647 +github, level 7 with dict, old streaming cdict, 38763 +github, level 9 with dict, old streaming cdict, 39373 +github, level 13 with dict, old streaming cdict, 39907 +github, level 16 with dict, old streaming cdict, 37893 +github, level 19 with dict, old streaming cdict, 37907 +github, no source size with dict, old streaming cdict, 40617 +github.tar, level -5 with dict, old streaming cdict, 51318 +github.tar, level -3 with dict, old streaming cdict, 45398 +github.tar, level -1 with dict, old streaming cdict, 42030 +github.tar, level 0 with dict, old streaming cdict, 37967 +github.tar, level 1 with dict, old streaming cdict, 38809 +github.tar, level 3 with dict, old streaming cdict, 37967 +github.tar, level 4 with dict, old streaming cdict, 37874 +github.tar, level 5 with dict, old streaming cdict, 38981 +github.tar, level 6 with dict, old streaming cdict, 38635 +github.tar, level 7 with dict, old streaming cdict, 37307 +github.tar, level 9 with dict, old streaming cdict, 36334 +github.tar, level 13 with dict, old streaming cdict, 36006 +github.tar, level 16 with dict, old streaming cdict, 39081 +github.tar, level 19 with dict, old streaming cdict, 32428 +github.tar, no source size with dict, old streaming cdict, 38088 +github, level -5 with dict, old streaming advanced cdict, 47674 +github, level -3 with dict, old streaming advanced cdict, 45993 +github, level -1 with dict, old streaming advanced cdict, 43599 +github, level 0 with dict, old streaming advanced cdict, 41063 +github, level 1 with dict, old streaming advanced cdict, 42299 +github, level 3 with dict, old streaming advanced cdict, 41063 +github, level 4 with dict, old streaming advanced cdict, 41043 +github, level 5 with dict, old streaming advanced cdict, 38747 +github, level 6 with dict, old streaming advanced cdict, 38774 +github, level 7 with dict, old streaming advanced cdict, 38889 +github, level 9 with dict, old streaming advanced cdict, 38952 +github, level 13 with dict, old streaming advanced cdict, 39724 +github, level 16 with dict, old streaming advanced cdict, 40804 +github, level 19 with dict, old streaming advanced cdict, 37907 +github, no source size with dict, old streaming advanced cdict, 40601 +github.tar, level -5 with dict, old streaming advanced cdict, 51184 +github.tar, level -3 with dict, old streaming advanced cdict, 45282 +github.tar, level -1 with dict, old streaming advanced cdict, 41719 +github.tar, level 0 with dict, old streaming advanced cdict, 38105 +github.tar, level 1 with dict, old streaming advanced cdict, 38701 +github.tar, level 3 with dict, old streaming advanced cdict, 38105 +github.tar, level 4 with dict, old streaming advanced cdict, 38032 +github.tar, level 5 with dict, old streaming advanced cdict, 38987 +github.tar, level 6 with dict, old streaming advanced cdict, 38625 +github.tar, level 7 with dict, old streaming advanced cdict, 37332 +github.tar, level 9 with dict, old streaming advanced cdict, 36379 +github.tar, level 13 with dict, old streaming advanced cdict, 35759 +github.tar, level 16 with dict, old streaming advanced cdict, 38578 +github.tar, level 19 with dict, old streaming advanced cdict, 32694 +github.tar, no source size with dict, old streaming advanced cdict, 38071 From c3f04cd409c2753504eb2e89dc4604db3d5a4604 Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Fri, 6 Mar 2026 13:43:17 +0000 Subject: [PATCH 2/3] Use U32 for extract index --- lib/compress/zstd_compress_internal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 42eedc46254..f285ca9bbe4 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -1096,8 +1096,8 @@ MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractHash(size_t hashAndTag, U32 tagB return hashAndTag & (((U64)1 << hashBits) - 1); } -MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { - return indexAndTag & (((U32)1 << (32 - tagBits)) - 1); +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { + return (U32)(indexAndTag & (((U32)1 << (32 - tagBits)) - 1)); } MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { @@ -1122,8 +1122,8 @@ MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractHash(size_t hashAndTag, U32 tagB return hashAndTag >> tagBits; } -MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { - return ZSTD_extractHash(indexAndTag, tagBits, 0); +MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractIndex(size_t indexAndTag, U32 tagBits) { + return (U32)ZSTD_extractHash(indexAndTag, tagBits, 0); } MEM_STATIC FORCE_INLINE_ATTR U32 ZSTD_extractTagFromHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { From 9e7ba8466a9824dae16941a3c0ff5be778f1d6c5 Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Fri, 6 Mar 2026 13:46:57 +0000 Subject: [PATCH 3/3] Fix some macro usage --- lib/compress/zstd_compress_internal.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index f285ca9bbe4..55f30369b62 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -26,7 +26,11 @@ #include "../common/bits.h" /* ZSTD_highbit32, ZSTD_NbCommonBytes */ #include "zstd_preSplit.h" /* ZSTD_SLIPBLOCK_WORKSPACESIZE */ -#if !defined(ZSTD_NO_INTRINSICS) && defined(ZSTD_HASH_USE_CRC32C) +#if defined(ZSTD_NO_INTRINSICS) && defined(ZSTD_HASH_USE_CRC32C) +#undef ZSTD_HASH_USE_CRC32C +#endif + +#if defined(ZSTD_HASH_USE_CRC32C) /* 32-bit builds with SSE 4.2 do not have _mm_crc32_u64, so the __x86_64__ condition is necessary. @@ -994,7 +998,7 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match, MEM_STATIC U32 ZSTD_reduceHash32(U32 hash, U32 bits) { assert(bits <= 32); -#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) +#if defined(ZSTD_HASH_USE_CRC32C) return hash & ((1ULL << bits) - 1); #else return hash >> (32 - bits); @@ -1003,7 +1007,7 @@ MEM_STATIC U32 ZSTD_reduceHash32(U32 hash, U32 bits) { MEM_STATIC size_t ZSTD_reduceHash64(U64 hash, U32 bits) { assert(bits <= 32); -#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) +#if defined(ZSTD_HASH_USE_CRC32C) return (size_t)(hash & ((1ULL << bits) - 1)); #else return (size_t)(hash >> (64 - bits)); @@ -1089,7 +1093,7 @@ size_t ZSTD_hashPtrSalted(const void* p, U32 hBits, U32 mls, const U64 hashSalt) } } -#if defined(ZSTD_HASH_INTERNAL_CRC32_U64) +#if defined(ZSTD_HASH_USE_CRC32C) MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_extractHash(size_t hashAndTag, U32 tagBits, U32 hashBits) { (void)tagBits;