Skip to content

Commit

Permalink
Move adler32 C fallbacks to arch/generic
Browse files Browse the repository at this point in the history
  • Loading branch information
Dead2 committed Jan 19, 2024
1 parent 6f38b4c commit 4e132cc
Show file tree
Hide file tree
Showing 19 changed files with 131 additions and 74 deletions.
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -977,6 +977,7 @@ set(ZLIB_PUBLIC_HDRS
${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h
)
set(ZLIB_PRIVATE_HDRS
arch/generic/adler32_fold_c.h
adler32_p.h
chunkset_tpl.h
compare256_rle.h
Expand All @@ -1003,8 +1004,9 @@ set(ZLIB_PRIVATE_HDRS
zutil.h
)
set(ZLIB_SRCS
arch/generic/adler32_c.c
arch/generic/adler32_fold_c.c
adler32.c
adler32_fold.c
chunkset.c
compare256.c
compress.c
Expand Down
12 changes: 10 additions & 2 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,9 @@ man3dir = ${mandir}/man3
pkgconfigdir = ${libdir}/pkgconfig

OBJZ = \
arch/generic/adler32_c.o \
arch/generic/adler32_fold_c.o \
adler32.o \
adler32_fold.o \
chunkset.o \
compare256.o \
compress.o \
Expand Down Expand Up @@ -112,8 +113,9 @@ TESTOBJG =
OBJC = $(OBJZ) $(OBJG)

PIC_OBJZ = \
arch/generic/adler32_c.lo \
arch/generic/adler32_fold_c.lo \
adler32.lo \
adler32_fold.lo \
chunkset.lo \
compare256.lo \
compress.lo \
Expand Down Expand Up @@ -169,6 +171,12 @@ $(ARCHDIR)/%.o: $(SRCDIR)/$(ARCHDIR)/%.c
$(ARCHDIR)/%.lo: $(SRCDIR)/$(ARCHDIR)/%.c
$(MAKE) -C $(ARCHDIR) $(notdir $@)

arch/generic/%.o: $(SRCDIR)/arch/generic/%.c
$(MAKE) -C arch/generic $(notdir $@)

arch/generic/%.lo: $(SRCDIR)/arch/generic/%.c
$(MAKE) -C arch/generic $(notdir $@)

%.o: $(ARCHDIR)/%.o
-cp $< $@

Expand Down
46 changes: 0 additions & 46 deletions adler32.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,6 @@
#include "functable.h"
#include "adler32_p.h"

/* ========================================================================= */
Z_INTERNAL uint32_t adler32_c(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t sum2;
unsigned n;

/* split Adler-32 into component sums */
sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;

/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(adler, buf, sum2);

/* initial Adler-32 value (deferred check for len == 1 speed) */
if (UNLIKELY(buf == NULL))
return 1L;

/* in case short lengths are provided, keep it somewhat fast */
if (UNLIKELY(len < 16))
return adler32_len_16(adler, buf, len, sum2);

/* do length NMAX blocks -- requires just one modulo operation */
while (len >= NMAX) {
len -= NMAX;
#ifdef UNROLL_MORE
n = NMAX / 16; /* NMAX is divisible by 16 */
#else
n = NMAX / 8; /* NMAX is divisible by 8 */
#endif
do {
#ifdef UNROLL_MORE
DO16(adler, sum2, buf); /* 16 sums unrolled */
buf += 16;
#else
DO8(adler, sum2, buf, 0); /* 8 sums unrolled */
buf += 8;
#endif
} while (--n);
adler %= BASE;
sum2 %= BASE;
}

/* do remaining bytes (less than NMAX, still just one modulo) */
return adler32_len_64(adler, buf, len, sum2);
}

#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(adler32_z)(unsigned long adler, const unsigned char *buf, size_t len) {
return (unsigned long)functable.adler32((uint32_t)adler, buf, len);
Expand Down
22 changes: 19 additions & 3 deletions arch/generic/Makefile.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Makefile for zlib
# Makefile for zlib-ng
# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler
# Copyright (C) 2024 Hans Kristian Rosbach
# For conditions of distribution and use, see copyright notice in zlib.h

CC=
Expand All @@ -11,12 +12,27 @@ SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)

all:
all: \
adler32_c.o adler32_c.lo \
adler32_fold_c.o adler32_fold_c.lo


adler32_c.o: $(SRCDIR)/adler32_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/adler32_p.h
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_c.c

adler32_c.lo: $(SRCDIR)/adler32_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/adler32_p.h
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_c.c

adler32_fold_c.o: $(SRCDIR)/adler32_fold_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/functable.h $(SRCDIR)/adler32_fold_c.h
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_fold_c.c

adler32_fold_c.lo: $(SRCDIR)/adler32_fold_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/functable.h $(SRCDIR)/adler32_fold_c.h
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_fold_c.c


mostlyclean: clean
clean:
rm -f *.o *.lo *~ \
rm -f *.o *.lo *~
rm -rf objs
rm -f *.gcda *.gcno *.gcov

Expand Down
54 changes: 54 additions & 0 deletions arch/generic/adler32_c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011, 2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/

#include "zbuild.h"
#include "functable.h"
#include "adler32_p.h"

/* ========================================================================= */
Z_INTERNAL uint32_t adler32_c(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t sum2;
unsigned n;

/* split Adler-32 into component sums */
sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;

/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(adler, buf, sum2);

/* initial Adler-32 value (deferred check for len == 1 speed) */
if (UNLIKELY(buf == NULL))
return 1L;

/* in case short lengths are provided, keep it somewhat fast */
if (UNLIKELY(len < 16))
return adler32_len_16(adler, buf, len, sum2);

/* do length NMAX blocks -- requires just one modulo operation */
while (len >= NMAX) {
len -= NMAX;
#ifdef UNROLL_MORE
n = NMAX / 16; /* NMAX is divisible by 16 */
#else
n = NMAX / 8; /* NMAX is divisible by 8 */
#endif
do {
#ifdef UNROLL_MORE
DO16(adler, sum2, buf); /* 16 sums unrolled */
buf += 16;
#else
DO8(adler, sum2, buf, 0); /* 8 sums unrolled */
buf += 8;
#endif
} while (--n);
adler %= BASE;
sum2 %= BASE;
}

/* do remaining bytes (less than NMAX, still just one modulo) */
return adler32_len_64(adler, buf, len, sum2);
}
2 changes: 1 addition & 1 deletion adler32_fold.c → arch/generic/adler32_fold_c.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#include "zbuild.h"
#include "functable.h"
#include "adler32_fold.h"
#include "adler32_fold_c.h"

#include <limits.h>

Expand Down
4 changes: 2 additions & 2 deletions adler32_fold.h → arch/generic/adler32_fold_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
* For conditions of distribution and use, see copyright notice in zlib.h
*/

#ifndef ADLER32_FOLD_H_
#define ADLER32_FOLD_H_
#ifndef ADLER32_FOLD_C_H_
#define ADLER32_FOLD_C_H_

Z_INTERNAL uint32_t adler32_fold_copy_c(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);

Expand Down
1 change: 0 additions & 1 deletion arch/x86/adler32_avx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

#include "zbuild.h"
#include <immintrin.h>
#include "adler32_fold.h"
#include "adler32_p.h"
#include "adler32_avx2_p.h"
#include "x86_intrins.h"
Expand Down
1 change: 0 additions & 1 deletion arch/x86/adler32_avx512.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#include "zbuild.h"
#include "adler32_p.h"
#include "adler32_fold.h"
#include "cpu_features.h"
#include <immintrin.h>
#include "x86_intrins.h"
Expand Down
1 change: 0 additions & 1 deletion arch/x86/adler32_avx512_vnni.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include "adler32_p.h"
#include "cpu_features.h"
#include <immintrin.h>
#include "adler32_fold.h"
#include "x86_intrins.h"
#include "adler32_avx512_p.h"
#include "adler32_avx2_p.h"
Expand Down
1 change: 0 additions & 1 deletion arch/x86/adler32_sse42.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

#include "zbuild.h"
#include "adler32_p.h"
#include "adler32_fold.h"
#include "adler32_ssse3_p.h"
#include <immintrin.h>

Expand Down
15 changes: 15 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -2109,6 +2109,21 @@ for file in $SRCDIR/$ARCHDIR/*.c; do
fi
done

# Generate Makefile in generic arch dir
mkdir -p arch/generic

sed < $SRCDIR/arch/generic/Makefile.in "
/^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s#=.*#=$CFLAGS#
/^SFLAGS *=/s#=.*#=$SFLAGS#
/^INCLUDES *=/s#=.*#=$INCLUDES#
/^SRCDIR *=/s#=.*#=$SRCDIR/arch/generic#
/^SRCTOP *=/s#=.*#=$SRCDIR#
/^BUILDDIR *=/s#=.*#=$BUILDDIR#
" > arch/generic/Makefile

## TODO: Process header dependencies

# Emscripten does not support large amounts of data via stdin/out
# https://github.com/emscripten-core/emscripten/issues/16755#issuecomment-1102732849
if test "$CHOST" != "wasm32"; then
Expand Down
1 change: 0 additions & 1 deletion cpu_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
#ifndef CPU_FEATURES_H_
#define CPU_FEATURES_H_

#include "adler32_fold.h"
#include "crc32_fold.h"

#if defined(X86_FEATURES)
Expand Down
1 change: 0 additions & 1 deletion deflate.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

#include "zutil.h"
#include "zendian.h"
#include "adler32_fold.h"
#include "crc32_fold.h"

/* define NO_GZIP when compiling if you want to disable gzip header and
Expand Down
2 changes: 1 addition & 1 deletion functable.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include "deflate.h"
#include "crc32_fold.h"
#include "adler32_fold.h"
#include "adler32_fold_c.h"

#ifdef ZLIB_COMPAT
typedef struct z_stream_s z_stream;
Expand Down
1 change: 0 additions & 1 deletion inflate.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#ifndef INFLATE_H_
#define INFLATE_H_

#include "adler32_fold.h"
#include "crc32_fold.h"

/* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate().
Expand Down
11 changes: 8 additions & 3 deletions win32/Makefile.a64
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ SUFFIX =

OBJS = \
adler32.obj \
adler32_fold.obj \
adler32_c.obj \
adler32_fold_c.obj \
arm_features.obj \
chunkset.obj \
compare256.obj \
Expand Down Expand Up @@ -169,15 +170,19 @@ gzwrite2.obj: gzwrite.c
{$(TOP)/arch/arm}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $<

{$(TOP)/arch/generic}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $<

{$(TOP)/test}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $<

$(TOP)/zconf$(SUFFIX).h: zconf

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
adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
adler32_c.obj: $(SRCDIR)/arch/generic/adler32_c.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
adler32_fold_c.obj: $(SRCDIR)/arch/generic/adler32_fold_c.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/arch/generic/adler32_fold_c.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
Expand Down
11 changes: 8 additions & 3 deletions win32/Makefile.arm
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ SUFFIX =

OBJS = \
adler32.obj \
adler32_fold.obj \
adler32_c.obj \
adler32_fold_c.obj \
arm_features.obj \
chunkset.obj \
compare256.obj \
Expand Down Expand Up @@ -190,15 +191,19 @@ gzwrite2.obj: gzwrite.c
{$(TOP)/arch/arm}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $<

{$(TOP)/arch/generic}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $<

{$(TOP)/test}.c.obj:
$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $<

$(TOP)/zconf$(SUFFIX).h: zconf

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
adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
adler32_c.obj: $(SRCDIR)/arch/generic/adler32_c.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
adler32_fold_c.obj: $(SRCDIR)/arch/generic/adler32_fold_c.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/arch/generic/adler32_fold_c.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
Expand Down
Loading

0 comments on commit 4e132cc

Please sign in to comment.