zlib replacement with optimizations for "next generation" systems.
Find a file
2026-03-06 16:39:11 +01:00
.github [CI] Add workflow to test MSVC 18 2026. 2026-03-06 16:39:11 +01:00
arch Relax alignment requirement in NEON_accum32. 2026-03-06 14:07:33 +01:00
cmake CMake: UBSAN: Don't enable 'unsigned-integer-overflow' and 'unsigned-shift-base' checks. 2026-03-05 23:30:43 +01:00
doc Update terms in txtvsbin.txt 2025-10-07 12:47:44 +02:00
test Add POWER8 VSX and S390 VX CRC32 copy tests 2026-02-18 15:05:03 +01:00
tools Change bi_reverse to use uint16_t code arg. 2025-12-14 15:57:33 +01:00
win32 Remove NMake build projects 2025-04-14 23:18:18 +02:00
.codecov.yaml Fix codecov parameter placement warnings. 2026-01-21 00:13:00 +01:00
.gitattributes Fix lint trailing whitespace error. 2024-05-30 20:03:51 +02:00
.gitignore Add .vscode to .gitignore 2026-02-17 15:28:07 +01:00
.shellcheckrc Import default codecfactor.io .shellcheckrc file. 2020-03-09 14:13:36 +01:00
adler32.c Remove unnecessary (unsigned long) cast on BASE in adler32_combine 2026-02-17 17:29:13 +01:00
adler32_p.h Refactor and unify adler32 short length processing. 2026-02-18 13:26:48 +01:00
arch_functions.h Split CRC32 Braid and Chorba word types 2026-02-17 23:23:12 +01:00
chunkset_tpl.h Simplify types used in chunkset code 2026-02-17 20:06:33 +01:00
CMakeLists.txt Split CRC32 Braid and Chorba word types 2026-02-17 23:23:12 +01:00
compare256_rle.h Cleanup compare256 and compare256_rle implementations. 2026-02-06 14:52:54 +01:00
compress.c Fix type mismatch on platforms where int32_t and uint32_t use long instead of int 2025-10-22 13:17:13 +02:00
configure [configure] Add initial support for NVHPC toolchain. 2026-02-12 12:57:38 +01:00
cpu_features.c Add LoongArch64 CRC32 implementation 2025-07-11 16:12:18 +02:00
cpu_features.h Add LoongArch64 CRC32 implementation 2025-07-11 16:12:18 +02:00
crc32.c Remove extra indirection calling into crc32_z functions. 2026-01-13 18:43:50 +01:00
crc32_braid_comb.c Move crc32 C fallbacks to arch/generic 2024-01-19 15:22:34 +01:00
crc32_braid_comb_p.h Correct comment for x2nmodp. 2022-05-25 12:04:35 +02:00
crc32_braid_p.h Split CRC32 Braid and Chorba word types 2026-02-17 23:23:12 +01:00
crc32_braid_tbl.h Clean up crc32_braid. 2025-02-18 23:59:16 +01:00
crc32_chorba_p.h Cleanup pointer style and parameter names in crc32 chorba functions 2026-02-18 20:15:09 +01:00
crc32_p.h Use index-based CRC macros and inline memcpy. 2026-01-29 13:29:39 +01:00
deflate.c Optimize symbol buffer access based on platform unaligned access 2026-02-18 13:57:07 +01:00
deflate.h Optimize symbol buffer access based on platform unaligned access 2026-02-18 13:57:07 +01:00
deflate_fast.c Replace conditional byte swapping with portable host/LE conversion 2026-01-23 18:24:07 +01:00
deflate_huff.c zlib 1.3.1 2024-02-07 19:15:56 +01:00
deflate_medium.c deflate_medium: more readability initialize structs match 2026-02-16 22:44:35 +01:00
deflate_p.h Optimize symbol buffer access based on platform unaligned access 2026-02-18 13:57:07 +01:00
deflate_quick.c Replace conditional byte swapping with portable host/LE conversion 2026-01-23 18:24:07 +01:00
deflate_rle.c Cleanup compare256 and compare256_rle implementations. 2026-02-06 14:52:54 +01:00
deflate_slow.c Use uint32_t for hash_head in update_hash/insert_string 2025-12-22 22:58:06 +01:00
deflate_stored.c Change zng_tr_stored_block/zng_tr_flush_block buf param to unsigned char * 2026-02-17 17:29:13 +01:00
fallback_builtins.h Cleanup and rename bitreverse16 after ctz builtin refactoring 2026-02-06 14:52:54 +01:00
FAQ.zlib Remove mentions of an official zlib DLL distribution. 2024-02-07 19:15:56 +01:00
functable.c Fix missing address-of operators for s390 functable assignments 2026-02-18 16:29:08 +01:00
functable.h Split CRC32 Braid and Chorba word types 2026-02-17 23:23:12 +01:00
gzguts.h Fix symbol mangling so symbols in shared library are exported correctly 2026-01-14 08:14:56 +01:00
gzlib.c Remove unnecessary casts on malloc return values 2026-02-17 17:29:13 +01:00
gzread.c Use MIN macro in a few more instances throughout the code 2026-01-24 15:22:09 +01:00
gzread_mangle.h.in Simplify the gzread.c name mangling workaround by splitting out just 2026-01-12 00:58:42 +01:00
gzwrite.c Fix symbol mangling so symbols in shared library are exported correctly 2026-01-14 08:14:56 +01:00
INDEX.md Remove misleading manpage. 2021-03-09 16:44:07 +01:00
infback.c Combine Huffman code and extra bits into single shift operation 2026-01-28 15:15:03 +01:00
inffast_tpl.h Add branch hints to inflate_fast. 2026-02-18 22:28:24 +01:00
inffixed_tbl.h Combine Huffman code and extra bits into single shift operation 2026-01-28 15:15:03 +01:00
inflate.c Remove unnecessary void */char * casts on memcpy/memset arguments 2026-02-17 17:29:13 +01:00
inflate.h Split CRC32 Braid and Chorba word types 2026-02-17 23:23:12 +01:00
inflate_p.h Simplify types used in chunkset code 2026-02-17 20:06:33 +01:00
inftrees.c Cleanup and rename bitreverse16 after ctz builtin refactoring 2026-02-06 14:52:54 +01:00
inftrees.h Combine Huffman code and extra bits into single shift operation 2026-01-28 15:15:03 +01:00
insert_string.c Inline all uses of quick_insert_string*/quick_insert_value*. 2025-12-07 12:41:30 +01:00
insert_string_p.h Move cleanup undefs to insert_string_tpl.h 2026-01-21 23:03:44 +01:00
insert_string_tpl.h Replace conditional byte swapping with portable host/LE conversion 2026-01-23 18:24:07 +01:00
LICENSE.md Update copyright years in other source files. 2024-02-07 19:15:56 +01:00
Makefile.in Set version for the develop branch to 2.3.90 2026-02-20 10:04:44 +01:00
match_tpl.h Make deflate output deterministic if PREFIX3(stream) is reused after deflateReset 2026-01-20 12:32:09 +01:00
PORTING.md Update PORTING.md to document zlib-ng memory allocation details. 2024-05-28 16:35:13 +02:00
README.md Integrate ARMv8 PMULL+EOR3 crc32 algorithm from Peter Cawley 2025-12-29 15:51:52 +01:00
trees.c Keep bi_buf/bi_valid in registers across compress_block loop 2026-02-20 11:02:12 +01:00
trees.h Renamed trees_p.h to trees.h. 2020-08-27 19:19:30 +02:00
trees_emit.h Keep bi_buf/bi_valid in registers across compress_block loop 2026-02-20 11:02:12 +01:00
trees_tbl.h Separate MIN_MATCH into STD_MIN_MATCH and WANT_MIN_MATCH 2021-06-13 20:55:01 +02:00
uncompr.c Fix type mismatch on platforms where int32_t and uint32_t use long instead of int 2025-10-22 13:17:13 +02:00
zarch.h Add e2k support 2026-02-06 15:51:57 +01:00
zbuild.h Add MSVC support for Z_UNREACHABLE macro 2026-03-06 14:50:13 +01:00
zconf-ng.h.in [zconf] Fix LFS support on Windows 2026-02-11 22:43:36 +01:00
zconf.h.in [zconf] Fix LFS support on Windows 2026-02-11 22:43:36 +01:00
zendian.h Replace conditional byte swapping with portable host/LE conversion 2026-01-23 18:24:07 +01:00
zlib-config.cmake.in rename cmake config target files to avoid illegal overwrite of PACKAGE_VERSION 2025-10-28 23:35:53 +01:00
zlib-ng-config.cmake.in rename cmake config target files to avoid illegal overwrite of PACKAGE_VERSION 2025-10-28 23:35:53 +01:00
zlib-ng.h.in Set version for the develop branch to 2.3.90 2026-02-20 10:04:44 +01:00
zlib-ng.map.in Fix symbol mangling so symbols in shared library are exported correctly 2026-01-14 08:14:56 +01:00
zlib.h.in Set version for the develop branch to 2.3.90 2026-02-20 10:04:44 +01:00
zlib.map.in Fix symbol mangling so symbols in shared library are exported correctly 2026-01-14 08:14:56 +01:00
zlib.pc.cmakein Add bindir into zlib.pc.in for compatibility with Cygwin and Msys2 2025-06-16 19:50:19 +02:00
zlib.pc.in Add bindir into zlib.pc.in for compatibility with Cygwin and Msys2 2025-06-16 19:50:19 +02:00
zlib_name_mangling-ng.h.in Fix various incorrect name mangling 2023-02-09 01:54:19 +01:00
zlib_name_mangling.h.empty Add support for name mangling 2021-10-09 09:19:55 +02:00
zlib_name_mangling.h.in Fix various incorrect name mangling 2023-02-09 01:54:19 +01:00
zmemory.h Continued cleanup of old UNALIGNED_OK checks 2024-12-26 22:14:46 +01:00
zutil.c Set version for the develop branch to 2.3.90 2026-02-20 10:04:44 +01:00
zutil.h Reorganize initialization and use a single malloc call for both 2025-08-23 17:25:17 +02:00
zutil_p.h Remove unnecessary casts on malloc return values 2026-02-17 17:29:13 +01:00

CI Stable Develop
GitHub Actions Stable CMake
Stable Configure
Develop CMake
Develop Configure
CodeFactor CodeFactor CodeFactor
OSS-Fuzz Fuzzing Status Fuzzing Status
Codecov codecov codecov

zlib-ng

zlib data compression library for the next generation systems

Maintained by Hans Kristian Rosbach aka Dead2 (zlib-ng àt circlestorm dót org)

Features

  • Zlib compatible API with support for dual-linking
  • Modernized native API based on zlib API for ease of porting
  • Modern C11 syntax and a clean code layout
  • Deflate medium and quick algorithms based on Intels zlib fork
  • Support for CPU intrinsics when available
    • Adler32 implementation using SSSE3, SSE4.2, AVX2, AVX512, AVX512-VNNI, Neon, VMX & VSX, LSX, LASX, RVV
    • CRC32-B implementation using SSE2, SSE4.1, (V)PCLMULQDQ, ARMv8, ARMv8.2 PMULL+EOR3, Power8, IBM Z, LoongArch, ZBC
    • Slide hash implementations using SSE2, AVX2, ARMv6, Neon, Power8, VMX & VSX, LSX, LASX
    • Compare256 implementations using SSE2, AVX2, AVX512, Neon, Power9, LSX, LASX, RVV
    • Inflate chunk copying using SSE2, SSSE3, AVX2, AVX512, Neon, Power8, VSX, LSX, LASX, RVV
    • Support for hardware-accelerated deflate using IBM Z DFLTCC
  • Safe unaligned memory read/writes and large bit buffer improvements
  • Includes improvements from Cloudflare and Intel forks
  • Configure and CMake build system support
  • Comprehensive set of CMake unit tests
  • Code sanitizers, fuzzing, and coverage
  • GitHub Actions continuous integration on Windows, macOS, and Linux
    • Emulated CI for ARM, AARCH64, LoongArch, PPC, PPC64, RISCV, SPARC64, S390x using qemu

History

The motivation for this fork was seeing several 3rd party contributions with new optimizations not getting implemented into the official zlib repository.

Mark Adler has been maintaining zlib for a very long time, and he has done a great job and hopefully he will continue for a long time yet. The idea of zlib-ng is not to replace zlib, but to co-exist as a drop-in replacement with a lower threshold for code change.

zlib has a long history and is incredibly portable, even supporting many systems that predate the Internet.
That is great, but it can complicate further development and maintainability. The zlib code contains many workarounds for really old compilers or to accommodate systems with limitations such as operating in a 16-bit environment.

Many of these workarounds are only maintenance burdens, some of them are pretty huge code-wise. With many workarounds cluttered throughout the code, it makes it harder for new programmers with an idea/interest for zlib to contribute.

I decided to make a fork, merge all the Intel optimizations, some of the Cloudflare optimizations, plus a couple other smaller patches. Then started cleaning out workarounds, various dead code, all contrib and example code.
The result is a better performing and easier to maintain zlib-ng.

A lot of improvements have gone into zlib-ng since its start, and numerous people and companies have contributed both small and big improvements, or valuable testing.

Build

Please read LICENSE.md, it is very simple and very liberal.

There are two ways to build zlib-ng:

Cmake

To build zlib-ng using the cross-platform makefile generator cmake.

cmake .
cmake --build . --config Release
ctest --verbose -C Release

Alternatively, you can use the cmake configuration GUI tool ccmake:

ccmake .

Configure

To build zlib-ng using the bash configure script:

./configure
make
make test

Build Options

CMake configure Description Default
ZLIB_COMPAT --zlib-compat Compile with zlib compatible API OFF
ZLIB_ALIASES Provide zlib compatible CMake targets ON
WITH_GZFILEOP --without-gzfileops Compile with support for gzFile related functions ON
WITH_OPTIM --without-optimizations Build with optimisations ON
WITH_NEW_STRATEGIES --without-new-strategies Use new strategies ON
WITH_CRC32_CHORBA Build with Chorba optimized CRC32 ON
WITH_REDUCED_MEM --with-reduced-mem Reduce zlib-ng memory usage, affects performance and compression ratio OFF
WITH_GTEST Build tests using GTest framework ON
WITH_BENCHMARKS Build benchmarks using Google Benchmark framework OFF
INSTALL_UTILS Copy minigzip and minideflate during install OFF
BUILD_TESTING Build test binaries ON

Install

WARNING: We do not recommend manually installing unless you really know what you are doing, because this can potentially override the system default zlib library, and any incompatibility or wrong configuration of zlib-ng can make the whole system unusable, requiring recovery or reinstall. If you still want a manual install, we recommend using the /opt/ path prefix.

For Linux distros, an alternative way to use zlib-ng (if compiled in zlib-compat mode) instead of zlib, is through the use of the LD_PRELOAD environment variable. If the program is dynamically linked with zlib, then the program will temporarily attempt to use zlib-ng instead, without risking system-wide instability.

LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.13.zlib-ng /usr/bin/program

Cmake

To install zlib-ng system-wide using cmake:

cmake --build . --target install

Configure

To install zlib-ng system-wide using the configure script:

make install

CPack

After building with cmake, an installation package can be created using cpack. By default a tgz package is created, but you can append -G <format> to each command to generate alternative packages types (TGZ, ZIP, RPM, DEB). To easily create a rpm or deb package, you would use -G RPM or -G DEB respectively.

cd build
cpack --config CPackConfig.cmake
cpack --config CPackSourceConfig.cmake

Vcpkg

Alternatively, you can build and install zlib-ng using the vcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # "./bootstrap-vcpkg.bat" for powershell
./vcpkg integrate install
./vcpkg install zlib-ng

The zlib-ng port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Contributing

Zlib-ng is aiming to be open to contributions, and we would be delighted to receive pull requests on github. Help with testing and reviewing pull requests etc is also very much appreciated.

Please check the Wiki for more info: Contributing

Acknowledgments

Thanks go out to all the people and companies who have taken the time to contribute code reviews, testing and/or patches. Zlib-ng would not have been nearly as good without you.

The deflate format used by zlib was defined by Phil Katz.
The deflate and zlib specifications were written by L. Peter Deutsch.

zlib was originally created by Jean-loup Gailly (compression) and Mark Adler (decompression).

Advanced Build Options

CMake configure Description Default
WITH_NATIVE_INSTRUCTIONS Compiles with full instruction set supported on this host (gcc/clang -march=native) OFF
WITH_RUNTIME_CPU_DETECTION Compiles with runtime CPU detection ON
WITH_SSE2 x86: Build with SSE2 intrinsics ON
WITH_SSSE3 x86: Build with SSSE3 intrinsics ON
WITH_SSE41 x86: Build with SSE41 intrinsics ON
WITH_SSE42 x86: Build with SSE42 intrinsics ON
WITH_PCLMULQDQ x86: Build with PCLMULQDQ intrinsics ON
WITH_AVX2 x86: Build with AVX2 intrinsics ON
WITH_AVX512 x86: Build with AVX512 intrinsics ON
WITH_AVX512VNNI x86: Build with AVX512VNNI intrinsics ON
WITH_VPCLMULQDQ x86: Build with VPCLMULQDQ intrinsics ON
WITH_ARMV6 --without-armv6 arm: Build with ARMv6 intrinsics ON
WITH_ARMV8 --without-armv8 arm: Build with ARMv8 intrinsics ON
WITH_NEON --without-neon arm: Build with NEON intrinsics ON
WITH_ALTIVEC --without-altivec ppc: Build with AltiVec (VMX) intrinsics ON
WITH_POWER8 --without-power8 ppc: Build with POWER8 intrinsics ON
WITH_POWER9 --without-power9 ppc: Build with POWER9 intrinsics ON
WITH_RVV --without-rvv riscv: Build with RVV intrinsics ON
WITH_RISCV_ZBC --without-zbc riscv: Build with RiscV ZBC intrinsics ON
WITH_CRC32_VX --without-crc32-vx s390x: Build with vectorized CRC32 on IBM Z ON
WITH_DFLTCC_DEFLATE --with-dfltcc-deflate s390x: Build with DFLTCC intrinsics for compression on IBM Z OFF
WITH_DFLTCC_INFLATE --with-dfltcc-inflate s390x: Build with DFLTCC intrinsics for decompression on IBM Z OFF
WITH_LSX loongarch: Build with LSX intrinsics ON
WITH_CRC32_LA --without-crc32-la loongarch: Build with vectorized CRC32 ON
WITH_INFLATE_STRICT Build with strict inflate distance checking OFF
WITH_INFLATE_ALLOW_INVALID_DIST Build with zero fill for inflate invalid distances OFF
WITH_BENCHMARK_APPS Build benchmark apps (currently libpng) OFF
WITH_ALL_FALLBACKS Build with all c-fallbacks (useful for Gbench comparisons) OFF
WITH_MAINTAINER_WARNINGS Build with project maintainer warnings OFF
WITH_SANITIZER Build with sanitizer (memory, address, undefined) OFF
WITH_FUZZERS Build test/fuzz OFF
WITH_CODE_COVERAGE Enable code coverage reporting OFF