)
set(ZLIB_SRCS
adler32.c
+ adler32_fold.c
chunkset.c
compare256.c
compress.c
OBJZ = \
adler32.o \
+ adler32_fold.o \
chunkset.o \
compare256.o \
compress.o \
PIC_OBJZ = \
adler32.lo \
+ adler32_fold.lo \
chunkset.lo \
compare256.lo \
compress.lo \
--- /dev/null
+/* crc32_fold.c -- adler32 folding interface
+ * Copyright (C) 2022 Adam Stylinski
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zbuild.h"
+#include "functable.h"
+#include "adler32_fold.h"
+
+Z_INTERNAL void adler32_fold_reset_c(adler32_fold *adler, uint32_t init_adler) {
+ /* So, for the "C" version, we'll just stash the value into nsums.
+ * This is mostly a compatibility shim, these functions in the functable
+ * will have more optimal versions that make use of adler and sum2. In order
+ * to make each implementation bisectable, each new implementation will be a
+ * new commit */
+ adler->nsums = init_adler;
+}
+
+Z_INTERNAL void adler32_fold_copy_c(adler32_fold *adler, uint8_t *dst, const uint8_t *src, size_t len) {
+ adler->nsums = functable.adler32(adler->nsums, src, len);
+ memcpy(dst, src, len);
+}
+
+Z_INTERNAL void adler32_fold_c(adler32_fold *adler, const uint8_t *src, size_t len) {
+ adler->nsums = functable.adler32(adler->nsums, src, len);
+}
+
+Z_INTERNAL uint32_t adler32_fold_final_c(adler32_fold *adler) {
+ return adler->nsums;
+}
--- /dev/null
+/* adler32_fold.h -- adler32 folding interface
+ * Copyright (C) 2022 Adam Stylinski
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#ifndef ADLER32_FOLD_H_
+#define ADLER32_FOLD_H_
+
+#include <stdint.h>
+
+typedef struct adler32_fold_s {
+ uint8_t adler[64]; // First half of component sums
+ uint8_t sum2[64]; // Second half of component sums
+ uint32_t nsums; // The number of scalar sums performed
+} adler32_fold;
+
+Z_INTERNAL void adler32_fold_reset_c(adler32_fold *adler, uint32_t init_adler);
+Z_INTERNAL void adler32_fold_copy_c(adler32_fold *adler, uint8_t *dst, const uint8_t *src, size_t len);
+Z_INTERNAL void adler32_fold_c(adler32_fold *adler, const uint8_t *src, size_t len);
+Z_INTERNAL uint32_t adler32_fold_final_c(adler32_fold *adler);
+
+#endif
return functable.adler32(adler, buf, len);
}
+Z_INTERNAL void adler32_fold_reset_stub(adler32_fold *adler, uint32_t init_adler) {
+ functable.adler32_fold_reset = &adler32_fold_reset_c;
+ functable.adler32_fold_reset(adler, init_adler);
+}
+
+Z_INTERNAL void adler32_fold_copy_stub(adler32_fold *adler, uint8_t *dst, const uint8_t *src, size_t len) {
+ functable.adler32_fold_copy = &adler32_fold_copy_c;
+ functable.adler32_fold_copy(adler, dst, src, len);
+}
+
+Z_INTERNAL void adler32_fold_stub(adler32_fold *adler, const uint8_t *src, size_t len) {
+ functable.adler32_fold = &adler32_fold_c;
+ functable.adler32_fold(adler, src, len);
+}
+
+Z_INTERNAL uint32_t adler32_fold_final_stub(adler32_fold *adler) {
+ functable.adler32_fold_final = &adler32_fold_final_c;
+ return functable.adler32_fold_final(adler);
+}
+
Z_INTERNAL uint32_t crc32_fold_reset_stub(crc32_fold *crc) {
functable.crc32_fold_reset = &crc32_fold_reset_c;
cpu_check_features();
/* functable init */
Z_INTERNAL Z_TLS struct functable_s functable = {
adler32_stub,
+ adler32_fold_reset_stub,
+ adler32_fold_copy_stub,
+ adler32_fold_stub,
+ adler32_fold_final_stub,
crc32_stub,
crc32_fold_reset_stub,
crc32_fold_copy_stub,
#include "deflate.h"
#include "crc32_fold.h"
+#include "adler32_fold.h"
struct functable_s {
uint32_t (* adler32) (uint32_t adler, const unsigned char *buf, size_t len);
+ void (* adler32_fold_reset) (adler32_fold *adler, uint32_t init_adler);
+ void (* adler32_fold_copy) (adler32_fold *adler, uint8_t *dst, const uint8_t *src, size_t len);
+ void (* adler32_fold) (adler32_fold *adler, const uint8_t *src, size_t len);
+ uint32_t (* adler32_fold_final) (adler32_fold *adler);
uint32_t (* crc32) (uint32_t crc, const unsigned char *buf, uint64_t len);
uint32_t (* crc32_fold_reset) (crc32_fold *crc);
void (* crc32_fold_copy) (crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
} else
#endif
{
- strm->adler = state->check = functable.adler32(state->check, src, copy);
- memcpy(dst, src, copy);
+ /*strm->adler = state->check = functable.adler32(state->check, src, copy);
+ memcpy(dst, src, copy);*/
+ functable.adler32_fold_copy(&state->adler_fold, dst, src, copy);
}
}
} else
#endif
{
- strm->adler = state->check = functable.adler32(state->check, src, len);
+ //strm->adler = state->check = functable.adler32(state->check, src, len);
+ functable.adler32_fold(&state->adler_fold, src, len);
}
}
state->dmax = 1U << len;
state->flags = 0; /* indicate zlib header */
Tracev((stderr, "inflate: zlib header ok\n"));
+ functable.adler32_fold_reset(&state->adler_fold, ADLER32_INITIAL_VALUE);
strm->adler = state->check = ADLER32_INITIAL_VALUE;
state->mode = hold & 0x200 ? DICTID : TYPE;
INITBITS();
#endif
case DICTID:
NEEDBITS(32);
+ //strm->adler = state->check = ZSWAP32(hold);
strm->adler = state->check = ZSWAP32(hold);
+ functable.adler32_fold_reset(&state->adler_fold, strm->adler);
INITBITS();
state->mode = DICT;
return Z_NEED_DICT;
}
strm->adler = state->check = ADLER32_INITIAL_VALUE;
+ functable.adler32_fold_reset(&state->adler_fold, ADLER32_INITIAL_VALUE);
state->mode = TYPE;
case TYPE:
#ifdef GUNZIP
if (state->flags)
strm->adler = state->check = functable.crc32_fold_final(&state->crc_fold);
+ else
+ strm->adler = state->check = functable.adler32_fold_final(&state->adler_fold);
#endif
}
out = left;
#define INFLATE_H_
#include "crc32_fold.h"
+#include "adler32_fold.h"
/* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate().
NO_GZIP would be used to avoid linking in the crc code when it is not needed.
uint32_t wnext; /* window write index */
unsigned char *window; /* allocated sliding window, if needed */
+ struct adler32_fold_s ALIGNED_(64) adler_fold;
struct crc32_fold_s ALIGNED_(16) crc_fold;
/* bit accumulator */
OBJS = \
adler32.obj \
+ adler32_fold.obj \
arm_features.obj \
chunkset.obj \
compare256.obj \
SRCDIR = $(TOP)
# Keep the dependences in sync with top-level Makefile.in
adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
+adler32_fold.obj: $(SRCDIR)/adler32_fold.c $(SRCDIR)/zbuild.h $(SRCDIR)/adler32_fold.h $(SRCDIR)/functable.h
chunkset.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h
functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86_features.h
gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
OBJS = \
adler32.obj \
+ adler32_fold.obj \
arm_features.obj \
chunkset.obj \
compare256.obj \
SRCDIR = $(TOP)
# Keep the dependences in sync with top-level Makefile.in
adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
+adler32_fold.obj: $(SRCDIR)/adler32_fold.c $(SRCDIR)/zbuild.h $(SRCDIR)/adler32_fold.h $(SRCDIR)/functable.h
functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86_features.h
gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
OBJS = \
adler32.obj \
+ adler32_fold.obj \
chunkset.obj \
chunkset_avx.obj \
chunkset_sse2.obj \
SRCDIR = $(TOP)
# Keep the dependences in sync with top-level Makefile.in
adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
+adler32_fold.obj: $(SRCDIR)/adler32_fold.c $(SRCDIR)/zbuild.h $(SRCDIR)/adler32_fold.h $(SRCDIR)/functable.h
functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86_features.h
gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h