]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Use arch-specific versions of inflate_fast.
authorNathan Moinvaziri <nathan@nathanm.com>
Mon, 29 Aug 2022 03:27:37 +0000 (20:27 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sun, 5 Feb 2023 16:51:46 +0000 (17:51 +0100)
This should reduce the cost of indirection that occurs when calling functable
chunk copying functions inside inflate_fast. It should also allow the compiler
to optimize the inflate fast path for the specific architecture.

19 files changed:
CMakeLists.txt
Makefile.in
arch/arm/chunkset_neon.c
arch/power/chunkset_power8.c
arch/x86/chunkset_avx.c
arch/x86/chunkset_sse2.c
arch/x86/chunkset_sse41.c
chunkset.c
cpu_features.h
functable.c
functable.h
infback.c
inffast.h [deleted file]
inffast_tpl.h [moved from inffast.c with 95% similarity]
inflate.c
inflate_p.h
win32/Makefile.a64
win32/Makefile.arm
win32/Makefile.msc

index 1f667e8fe88fdc6055a5d5d713ab3e5130c39e73..48e09d521308bfeb60f5b428f8a876b47873684b 100644 (file)
@@ -967,7 +967,7 @@ set(ZLIB_PRIVATE_HDRS
     deflate.h
     deflate_p.h
     functable.h
-    inffast.h
+    inffast_tpl.h
     inffixed_tbl.h
     inflate.h
     inflate_p.h
@@ -1001,7 +1001,6 @@ set(ZLIB_SRCS
     deflate_stored.c
     functable.c
     infback.c
-    inffast.c
     inflate.c
     inftrees.c
     insert_string.c
index 98b9042eb4f00b6edb6aac1775902b16fe32698b..4bfb6313e272efb833dacc3f7cd410b728a9fc59 100644 (file)
@@ -93,7 +93,6 @@ OBJZ = \
        deflate_stored.o \
        functable.o \
        infback.o \
-       inffast.o \
        inflate.o \
        inftrees.o \
        insert_string.o \
@@ -132,7 +131,6 @@ PIC_OBJZ = \
        deflate_stored.lo \
        functable.lo \
        infback.lo \
-       inffast.lo \
        inflate.lo \
        inftrees.lo \
        insert_string.lo \
index 2c64ce59e3c8436f5283f38f22661cf97707e179..b119f212455d261b0935cb2fa2bd4d1b0bd1dfe8 100644 (file)
@@ -94,4 +94,8 @@ static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t
 
 #include "chunkset_tpl.h"
 
+#define INFLATE_FAST     inflate_fast_neon
+
+#include "inffast_tpl.h"
+
 #endif
index 83928308d614843f2a487d59849054418330ca57..abc5f5e2148a43c1843a566dd4a587a71bb74e2f 100644 (file)
@@ -48,4 +48,8 @@ static inline void storechunk(uint8_t *out, chunk_t *chunk) {
 
 #include "chunkset_tpl.h"
 
+#define INFLATE_FAST     inflate_fast_power8
+
+#include "inffast_tpl.h"
+
 #endif
index c4a4d9b052ffae5d2a1153a9765a8e180d08e751..e128e8f7081978c3fee10ea513c9b920e599f378 100644 (file)
@@ -128,4 +128,8 @@ static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t
 
 #include "chunkset_tpl.h"
 
+#define INFLATE_FAST     inflate_fast_avx
+
+#include "inffast_tpl.h"
+
 #endif
index eddf5d98952a37026a0c4ac48a00bdd30360780d..c402c0ee18f6d165c55db2235e68910b04b52e24 100644 (file)
@@ -49,4 +49,8 @@ static inline void storechunk(uint8_t *out, chunk_t *chunk) {
 
 #include "chunkset_tpl.h"
 
+#define INFLATE_FAST     inflate_fast_sse2
+
+#include "inffast_tpl.h"
+
 #endif
index c148db09243beacba6feedb1cfe905c610bec546..9a9558856c7a8470b8ca1f172abcc767a4591e10 100644 (file)
@@ -95,4 +95,8 @@ extern uint8_t* chunkcopy_sse2(uint8_t *out, uint8_t const *from, unsigned len);
 
 #include "chunkset_tpl.h"
 
+#define INFLATE_FAST     inflate_fast_sse41
+
+#include "inffast_tpl.h"
+
 #endif
index 169e4112339e6cc384cfeeb789c7b08076c58e99..7b2bb7ba3676a730d16273bd8cd80a653a7a3e0d 100644 (file)
@@ -36,3 +36,7 @@ static inline void storechunk(uint8_t *out, chunk_t *chunk) {
 #define CHUNKMEMSET_SAFE chunkmemset_safe_c
 
 #include "chunkset_tpl.h"
+
+#define INFLATE_FAST     inflate_fast_c
+
+#include "inffast_tpl.h"
index 72e40a16523671200143625c00a3a484a9dbb542..d211cb112e2cca31b06e76e14801f5a7bacb3971 100644 (file)
@@ -110,6 +110,24 @@ extern uint8_t* chunkmemset_power8(uint8_t *out, unsigned dist, unsigned len);
 extern uint8_t* chunkmemset_safe_power8(uint8_t *out, unsigned dist, unsigned len, unsigned left);
 #endif
 
+/* inflate fast loop */
+extern void inflate_fast_c(void *strm, uint32_t start);
+#ifdef X86_SSE2_CHUNKSET
+extern void inflate_fast_sse2(void *strm, uint32_t start);
+#endif
+#ifdef X86_SSE41
+extern void inflate_fast_sse41(void *strm, uint32_t start);
+#endif
+#ifdef X86_AVX_CHUNKSET
+extern void inflate_fast_avx(void *strm, uint32_t start);
+#endif
+#ifdef ARM_NEON_CHUNKSET
+extern void inflate_fast_neon(void *strm, uint32_t start);
+#endif
+#ifdef POWER8_VSX_CHUNKSET
+extern void inflate_fast_power8(void *strm, uint32_t start);
+#endif
+
 /* CRC32 */
 typedef uint32_t (*crc32_func)(uint32_t crc32, const uint8_t *buf, size_t len);
 
index 35474878d5a92b2f27acf0ce7a79ff3b1877870b..1bdba15390dea9b2a3c30f7b97db41de8cf3bdf3 100644 (file)
@@ -482,6 +482,35 @@ static uint32_t compare256_stub(const uint8_t* src0, const uint8_t* src1) {
     return functable.compare256(src0, src1);
 }
 
+Z_INTERNAL void inflate_fast_stub(void *strm, uint32_t start) {
+    functable.inflate_fast = &inflate_fast_c;
+
+#ifdef X86_SSE2_CHUNKSET
+# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2)
+    if (x86_cpu_has_sse2)
+# endif
+        functable.inflate_fast = &inflate_fast_sse2;
+#endif
+#if defined(X86_SSE41) && defined(X86_SSE2)
+    if (x86_cpu_has_sse41)
+        functable.inflate_fast = &inflate_fast_sse41;
+#endif
+#ifdef X86_AVX_CHUNKSET
+    if (x86_cpu_has_avx2)
+        functable.inflate_fast = &inflate_fast_avx;
+#endif
+#ifdef ARM_NEON_CHUNKSET
+    if (arm_cpu_has_neon)
+        functable.inflate_fast = &inflate_fast_neon;
+#endif
+#ifdef POWER8_VSX_CHUNKSET
+    if (power_cpu_has_arch_2_07)
+        functable.inflate_fast = &inflate_fast_power8;
+#endif
+
+    functable.inflate_fast(strm, start);
+}
+
 /* functable init */
 Z_INTERNAL Z_TLS struct functable_s functable = {
     adler32_stub,
@@ -497,6 +526,7 @@ Z_INTERNAL Z_TLS struct functable_s functable = {
     chunkunroll_stub,
     chunkmemset_stub,
     chunkmemset_safe_stub,
+    inflate_fast_stub,
     insert_string_stub,
     longest_match_stub,
     longest_match_slow_stub,
index 531f3a1cef86b5059142619b84d6030e3ccd99a4..4319b4c11b74fe9ff749cc0b4b755680c1c25cc0 100644 (file)
@@ -24,6 +24,7 @@ struct functable_s {
     uint8_t* (* chunkunroll)        (uint8_t *out, unsigned *dist, unsigned *len);
     uint8_t* (* chunkmemset)        (uint8_t *out, unsigned dist, unsigned len);
     uint8_t* (* chunkmemset_safe)   (uint8_t *out, unsigned dist, unsigned len, unsigned left);
+    void     (* inflate_fast)       (void *strm, uint32_t start);
     void     (* insert_string)      (deflate_state *const s, uint32_t str, uint32_t count);
     uint32_t (* longest_match)      (deflate_state *const s, Pos cur_match);
     uint32_t (* longest_match_slow) (deflate_state *const s, Pos cur_match);
index a7af88f2e2a4d0353c36642f0d0a179bfd8bdb8c..7d4d88920e3f305e2033fddd8f7417d763425b91 100644 (file)
--- a/infback.c
+++ b/infback.c
@@ -14,7 +14,6 @@
 #include "zutil.h"
 #include "inftrees.h"
 #include "inflate.h"
-#include "inffast.h"
 #include "inflate_p.h"
 #include "functable.h"
 
@@ -358,7 +357,7 @@ int32_t Z_EXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in
                 RESTORE();
                 if (state->whave < state->wsize)
                     state->whave = state->wsize - left;
-                zng_inflate_fast(strm, state->wsize);
+                functable.inflate_fast(strm, state->wsize);
                 LOAD();
                 break;
             }
diff --git a/inffast.h b/inffast.h
deleted file mode 100644 (file)
index 179a65d..0000000
--- a/inffast.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef INFFAST_H_
-#define INFFAST_H_
-/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995-2003, 2010 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start);
-
-#define INFLATE_FAST_MIN_HAVE 8
-#define INFLATE_FAST_MIN_LEFT 258
-
-#endif /* INFFAST_H_ */
similarity index 95%
rename from inffast.c
rename to inffast_tpl.h
index bfb1c83134590438082792e4ed8d7884fa6033a5..6977a560a225310701ea1984e1d2938d1b0d3d89 100644 (file)
--- a/inffast.c
@@ -4,24 +4,13 @@
  */
 
 #include "zbuild.h"
+#include "zendian.h"
 #include "zutil.h"
 #include "inftrees.h"
 #include "inflate.h"
-#include "inffast.h"
 #include "inflate_p.h"
 #include "functable.h"
 
-/* Load 64 bits from IN and place the bytes at offset BITS in the result. */
-static inline uint64_t load_64_bits(const unsigned char *in, unsigned bits) {
-    uint64_t chunk;
-    memcpy(&chunk, in, sizeof(chunk));
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-    return chunk << bits;
-#else
-    return ZSWAP64(chunk) << bits;
-#endif
-}
 /*
    Decode literal, length, and distance codes and write out the resulting
    literal and match bytes until either not enough input or output is
@@ -61,7 +50,7 @@ static inline uint64_t load_64_bits(const unsigned char *in, unsigned bits) {
       requires strm->avail_out >= 258 for each loop to avoid checking for
       output space.
  */
-void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start) {
+void Z_INTERNAL INFLATE_FAST(PREFIX3(stream) *strm, uint32_t start) {
     /* start: inflate()'s starting value for strm->avail_out */
     struct inflate_state *state;
     z_const unsigned char *in;  /* local strm->next_in */
@@ -259,7 +248,7 @@ void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start) {
                     if (op < len) {             /* still need some from output */
                         len -= op;
                         out = chunkcopy_safe(out, from, op, safe);
-                        out = functable.chunkunroll(out, &dist, &len);
+                        out = CHUNKUNROLL(out, &dist, &len);
                         out = chunkcopy_safe(out, out - dist, len, safe);
                     } else {
                         out = chunkcopy_safe(out, from, len, safe);
@@ -269,7 +258,7 @@ void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start) {
                     if (dist >= len || dist >= state->chunksize)
                         out = chunkcopy_safe(out, out - dist, len, safe);
                     else
-                        out = functable.chunkmemset_safe(out, dist, len, (unsigned)((safe - out) + 1));
+                        out = CHUNKMEMSET_SAFE(out, dist, len, (unsigned)((safe - out) + 1));
                 } else {
                     /* Whole reference is in range of current output.  No range checks are
                        necessary because we start with room for at least 258 bytes of output,
@@ -277,9 +266,9 @@ void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start) {
                        as they stay within 258 bytes of `out`.
                     */
                     if (dist >= len || dist >= state->chunksize)
-                        out = functable.chunkcopy(out, out - dist, len);
+                        out = CHUNKCOPY(out, out - dist, len);
                     else
-                        out = functable.chunkmemset(out, dist, len);
+                        out = CHUNKMEMSET(out, dist, len);
                 }
             } else if ((op & 64) == 0) {          /* 2nd level distance code */
                 here = dcode + here->val + BITS(op);
index 7949120997a0aa024ffb3c1f1f6d8651237f26aa..eaf78ebfb15018b8472cca78909652b9ffd6c071 100644 (file)
--- a/inflate.c
+++ b/inflate.c
@@ -8,7 +8,6 @@
 #include "cpu_features.h"
 #include "inftrees.h"
 #include "inflate.h"
-#include "inffast.h"
 #include "inflate_p.h"
 #include "inffixed_tbl.h"
 #include "functable.h"
@@ -866,7 +865,7 @@ int32_t Z_EXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int32_t flush) {
             /* use inflate_fast() if we have enough input and output */
             if (have >= INFLATE_FAST_MIN_HAVE && left >= INFLATE_FAST_MIN_LEFT) {
                 RESTORE();
-                zng_inflate_fast(strm, out);
+                functable.inflate_fast(strm, out);
                 LOAD();
                 if (state->mode == TYPE)
                     state->back = -1;
index 27b61027783f4285bc0484856202b09d9263fc19..2b57b317e7ae51a3ebca1978439fef212fac4f67 100644 (file)
         strm->msg = (char *)errmsg; \
     } while (0)
 
+#define INFLATE_FAST_MIN_HAVE 8
+#define INFLATE_FAST_MIN_LEFT 258
+
+/* Load 64 bits from IN and place the bytes at offset BITS in the result. */
+static inline uint64_t load_64_bits(const unsigned char *in, unsigned bits) {
+    uint64_t chunk;
+    memcpy(&chunk, in, sizeof(chunk));
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+    return chunk << bits;
+#else
+    return ZSWAP64(chunk) << bits;
+#endif
+}
+
 /* Behave like chunkcopy, but avoid writing beyond of legal output. */
 static inline uint8_t* chunkcopy_safe(uint8_t *out, uint8_t *from, uint64_t len, uint8_t *safe) {
     uint64_t safelen = (safe - out) + 1;
index efcb0a64cc361421115b5206f1ab8cd948957a55..8537bd5fe982c68928f4d539bf7ae564837806fa 100644 (file)
@@ -64,7 +64,6 @@ OBJS = \
        infback.obj \
        inflate.obj \
        inftrees.obj \
-       inffast.obj \
        insert_string.obj \
        insert_string_roll.obj \
        slide_hash.obj \
@@ -200,9 +199,8 @@ deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/defl
 deflate_rle.obj: $(SRCDIR)/deflate_rle.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_stored.obj: $(SRCDIR)/deflate_stored.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
-infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h
-inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h
-inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
+infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h
+inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
 inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h
 slide_hash.obj: $(SRCDIR)/slide_hash.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
 slide_hash_neon.obj: $(SRCDIR)/arch/arm/slide_hash_neon.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
index 34dff1a7004e0ddb7ef4dff861fc321bff9228d6..58a7fc8661b1cb513e17530e2db3e4e22f6e1481 100644 (file)
@@ -68,7 +68,6 @@ OBJS = \
        infback.obj \
        inflate.obj \
        inftrees.obj \
-       inffast.obj \
        insert_string.obj \
        insert_string_roll.obj \
        slide_hash.obj \
@@ -213,9 +212,8 @@ deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflat
 deflate_rle.obj: $(SRCDIR)/deflate_rle.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_stored.obj: $(SRCDIR)/deflate_stored.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
-infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h
-inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h
-inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
+infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h
+inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
 inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h
 slide_hash.obj: $(SRCDIR)/slide_hash.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
 trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees_tbl.h
index 445b673bc356aa1fe862d68fb699c4bf928063f8..9c00737a8f8b192b999c0a0e44e08de1feda7741 100644 (file)
@@ -81,7 +81,6 @@ OBJS = \
        infback.obj \
        inflate.obj \
        inftrees.obj \
-       inffast.obj \
        insert_string.obj \
        insert_string_roll.obj \
        insert_string_sse42.obj \
@@ -220,9 +219,8 @@ deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflat
 deflate_rle.obj: $(SRCDIR)/deflate_rle.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
 deflate_stored.obj: $(SRCDIR)/deflate_stored.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
-infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h
-inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h
-inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
+infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h
+inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
 inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h
 slide_hash.obj: $(SRCDIR)/slide_hash.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
 slide_hash_avx2.obj: $(SRCDIR)/arch/x86/slide_hash_avx2.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h