arch/generic/chunkset_c.c
arch/generic/compare256_c.c
arch/generic/crc32_braid_c.c
- arch/generic/crc32_fold_c.c
arch/generic/slide_hash_c.c
)
list(APPEND ZLIB_GENERIC_SRCS
arch/generic/adler32_c.c
arch/generic/crc32_braid_c.c
- arch/generic/crc32_fold_c.c
)
# x86_64 does not need compare256 fallback if we have BUILTIN_CTZ
arch/generic/chunkset_c.o \
arch/generic/compare256_c.o \
arch/generic/crc32_braid_c.o \
- arch/generic/crc32_fold_c.o \
arch/generic/slide_hash_c.o \
adler32.o \
compress.o \
arch/generic/chunkset_c.lo \
arch/generic/compare256_c.lo \
arch/generic/crc32_braid_c.lo \
- arch/generic/crc32_fold_c.lo \
arch/generic/slide_hash_c.lo \
adler32.lo \
compress.lo \
#ifdef ARM_CRC32
uint32_t crc32_armv8(uint32_t crc, const uint8_t *buf, size_t len);
-void crc32_fold_copy_armv8(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-void crc32_fold_armv8(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
+uint32_t crc32_copy_armv8(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef ARM_SIMD
# if (defined(ARM_CRC32) && defined(__ARM_FEATURE_CRC32))
# undef native_crc32
# define native_crc32 crc32_armv8
-# undef native_crc32_fold
-# define native_crc32_fold crc32_fold_armv8
-# undef native_crc32_fold_copy
-# define native_crc32_fold_copy crc32_fold_copy_armv8
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_armv8
# endif
#endif
return c;
}
-/* Note: Based on generic crc32_fold_* implementation with functable call replaced by direct call. */
-Z_INTERNAL Z_TARGET_CRC void crc32_fold_copy_armv8(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
- crc->value = crc32_armv8(crc->value, src, len);
+Z_INTERNAL Z_TARGET_CRC uint32_t crc32_copy_armv8(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_armv8(crc, src, len);
memcpy(dst, src, len);
+ return crc;
}
-
-Z_INTERNAL Z_TARGET_CRC void crc32_fold_armv8(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
- Z_UNUSED(init_crc);
- crc->value = crc32_armv8(crc->value, src, len);
-}
-
#endif
compare256_c.o compare256_c.lo \
crc32_braid_c.o crc32_braid_c.lo \
crc32_chorba_c.o crc32_chorba_c.lo \
- crc32_fold_c.o crc32_fold_c.lo \
slide_hash_c.o slide_hash_c.lo
crc32_chorba_c.lo: $(SRCDIR)/crc32_chorba_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/crc32_braid_p.h $(SRCTOP)/crc32_braid_tbl.h
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_chorba_c.c
-crc32_fold_c.o: $(SRCDIR)/crc32_fold_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/functable.h
- $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_fold_c.c
-
-crc32_fold_c.lo: $(SRCDIR)/crc32_fold_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/functable.h
- $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_fold_c.c
-
slide_hash_c.o: $(SRCDIR)/slide_hash_c.c $(SRCTOP)/zbuild.h $(SRCTOP)/deflate.h
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_c.c
return c;
}
-Z_INTERNAL uint32_t crc32_braid(uint32_t c, const uint8_t *buf, size_t len) {
- c = (~c) & 0xffffffff;
+Z_INTERNAL uint32_t crc32_braid(uint32_t crc, const uint8_t *buf, size_t len) {
+ crc = (~crc) & 0xffffffff;
- c = crc32_braid_internal(c, buf, len);
+ crc = crc32_braid_internal(crc, buf, len);
/* Return the CRC, post-conditioned. */
- return c ^ 0xffffffff;
+ return crc ^ 0xffffffff;
+}
+
+Z_INTERNAL uint32_t crc32_copy_braid(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_braid(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
}
/* Return the CRC, post-conditioned. */
return c ^ 0xffffffff;
}
+
+uint32_t crc32_copy_chorba(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_chorba(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
+++ /dev/null
-/* crc32_fold.c -- crc32 folding interface
- * Copyright (C) 2021 Nathan Moinvaziri
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-#include "zbuild.h"
-#include "zutil.h"
-#include "functable.h"
-#include "crc32.h"
-
-Z_INTERNAL uint32_t crc32_fold_reset_c(crc32_fold *crc) {
- crc->value = CRC32_INITIAL_VALUE;
- return crc->value;
-}
-
-Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
- crc->value = FUNCTABLE_CALL(crc32)(crc->value, src, len);
- memcpy(dst, src, len);
-}
-
-Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
- /* Note: while this is basically the same thing as the vanilla CRC function, we still need
- * a functable entry for it so that we can generically dispatch to this function with the
- * same arguments for the versions that _do_ do a folding CRC but we don't want a copy. The
- * init_crc is an unused argument in this context */
- Z_UNUSED(init_crc);
- crc->value = FUNCTABLE_CALL(crc32)(crc->value, src, len);
-}
-
-Z_INTERNAL uint32_t crc32_fold_final_c(crc32_fold *crc) {
- return crc->value;
-}
typedef uint32_t (*adler32_func)(uint32_t adler, const uint8_t *buf, size_t len);
typedef uint32_t (*compare256_func)(const uint8_t *src0, const uint8_t *src1);
-typedef uint32_t (*crc32_func)(uint32_t crc32, const uint8_t *buf, size_t len);
-typedef uint32_t (*crc32_fold_reset_func)(crc32_fold *crc);
-typedef void (*crc32_fold_copy_func)(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-typedef uint32_t (*crc32_fold_final_func)(crc32_fold *crc);
+typedef uint32_t (*crc32_func)(uint32_t crc, const uint8_t *buf, size_t len);
+typedef uint32_t (*crc32_copy_func)(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
typedef void (*slide_hash_func)(deflate_state *s);
uint32_t compare256_c(const uint8_t *src0, const uint8_t *src1);
-uint32_t crc32_braid(uint32_t c, const uint8_t *buf, size_t len);
+uint32_t crc32_braid(uint32_t crc, const uint8_t *buf, size_t len);
uint32_t crc32_braid_internal(uint32_t c, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_braid(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#ifndef WITHOUT_CHORBA
uint32_t crc32_chorba(uint32_t crc, const uint8_t *buf, size_t len);
uint32_t crc32_chorba_32768_nondestructive (uint32_t crc, const uint64_t* buf, size_t len);
uint32_t crc32_chorba_small_nondestructive (uint32_t crc, const uint64_t* buf, size_t len);
uint32_t crc32_chorba_small_nondestructive_32bit (uint32_t crc, const uint32_t* buf, size_t len);
+ uint32_t crc32_copy_chorba(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
-uint32_t crc32_fold_reset_c(crc32_fold *crc);
-void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
-uint32_t crc32_fold_final_c(crc32_fold *crc);
-
void inflate_fast_c(PREFIX3(stream) *strm, uint32_t start);
uint32_t longest_match_c(deflate_state *const s, uint32_t cur_match);
# define native_chunkmemset_safe chunkmemset_safe_c
#ifndef WITHOUT_CHORBA
# define native_crc32 crc32_chorba
+# define native_crc32_copy crc32_copy_chorba
#else
# define native_crc32 crc32_braid
+# define native_crc32_copy crc32_copy_braid
#endif
-# define native_crc32_fold crc32_fold_c
-# define native_crc32_fold_copy crc32_fold_copy_c
-# define native_crc32_fold_final crc32_fold_final_c
-# define native_crc32_fold_reset crc32_fold_reset_c
# define native_inflate_fast inflate_fast_c
# define native_slide_hash slide_hash_c
# define native_longest_match longest_match_c
return c;
}
-/* Note: Based on generic crc32_fold_* implementation with functable call replaced by direct call. */
-Z_INTERNAL void crc32_fold_copy_loongarch64(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
- crc->value = crc32_loongarch64(crc->value, src, len);
+Z_INTERNAL uint32_t crc32_copy_loongarch64(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_loongarch64(crc, src, len);
memcpy(dst, src, len);
+ return crc;
}
-
-Z_INTERNAL void crc32_fold_loongarch64(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
- Z_UNUSED(init_crc);
- crc->value = crc32_loongarch64(crc->value, src, len);
-}
-
#endif
#ifdef LOONGARCH_CRC
uint32_t crc32_loongarch64(uint32_t crc, const uint8_t *buf, size_t len);
-void crc32_fold_copy_loongarch64(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-void crc32_fold_loongarch64(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
+uint32_t crc32_copy_loongarch64(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef LOONGARCH_LSX
# if defined(LOONGARCH_CRC)
# undef native_crc32
# define native_crc32 crc32_loongarch64
-# undef native_crc32_fold
-# define native_crc32_fold crc32_fold_loongarch64
-# undef native_crc32_fold_copy
-# define native_crc32_fold_copy crc32_fold_copy_loongarch64
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_loongarch64
# endif
# if defined(LOONGARCH_LSX) && defined(__loongarch_sx)
# undef native_adler32
return crc;
}
+Z_INTERNAL uint32_t crc32_copy_power8(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_power8(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
+
/* When we have a load-store in a single-dispatch group and address overlap
* such that forward is not allowed (load-hit-store) the group must be flushed.
* A group ending NOP prevents the flush.
uint32_t adler32_power8(uint32_t adler, const uint8_t *buf, size_t len);
uint8_t* chunkmemset_safe_power8(uint8_t *out, uint8_t *from, unsigned len, unsigned left);
uint32_t crc32_power8(uint32_t crc, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_power8(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
void slide_hash_power8(deflate_state *s);
void inflate_fast_power8(PREFIX3(stream) *strm, uint32_t start);
#endif
# if defined(POWER8_VSX_CRC32) && defined(_ARCH_PWR8) && defined(__VSX__)
# undef native_crc32
# define native_crc32 crc32_power8
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_power8
# endif
// Power9
# if defined(POWER9) && defined(_ARCH_PWR9)
return crc ^ 0xFFFFFFFF;
}
+Z_INTERNAL uint32_t crc32_copy_riscv64_zbc(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_riscv64_zbc(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
#endif
#ifdef RISCV_CRC32_ZBC
uint32_t crc32_riscv64_zbc(uint32_t crc, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_riscv64_zbc(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef DISABLE_RUNTIME_CPU_DETECTION
# if (defined(RISCV_CRC32_ZBC) && defined (__riscv_zbc))
# undef native_crc32
# define native_crc32 crc32_riscv64_zbc
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_riscv64_zbc
# endif
#endif
return crc;
}
+
+Z_INTERNAL uint32_t crc32_copy_s390_vx(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_s390_vx(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
#ifdef S390_CRC32_VX
uint32_t crc32_s390_vx(uint32_t crc, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_s390_vx(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#ifdef __clang__
# if ((__clang_major__ == 18) || (__clang_major__ == 19 && (__clang_minor__ < 1 || (__clang_minor__ == 1 && __clang_patchlevel__ < 2))))
# if defined(S390_CRC32_VX) && defined(__zarch__) && __ARCH__ >= 11 && defined(__VX__)
# undef native_crc32
# define native_crc32 crc32_s390_vx
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_s390_vx
# endif
#endif
/* Return the CRC, post-conditioned. */
return c ^ 0xffffffff;
}
+
+Z_INTERNAL uint32_t crc32_copy_chorba_sse2(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_chorba_sse2(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
#endif
/* Return the CRC, post-conditioned. */
return c ^ 0xffffffff;
}
+
+Z_INTERNAL uint32_t crc32_copy_chorba_sse41(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
+ crc = crc32_chorba_sse41(crc, src, len);
+ memcpy(dst, src, len);
+ return crc;
+}
#endif
return c ^ 0xffffffff;
}
+static inline uint32_t crc32_small_copy(uint32_t crc, uint8_t *dst, const uint8_t *buf, size_t len) {
+ uint32_t c = (~crc) & 0xffffffff;
+
+ while (len) {
+ len--;
+ *dst++ = *buf;
+ CRC_DO1;
+ }
+
+ return c ^ 0xffffffff;
+}
+
static inline void crc32_fold_load(__m128i *fold, __m128i *fold0, __m128i *fold1, __m128i *fold2, __m128i *fold3) {
*fold0 = _mm_load_si128(fold + 0);
*fold1 = _mm_load_si128(fold + 1);
#include "crc32_fold_pclmulqdq_tpl.h"
-Z_INTERNAL uint32_t crc32_fold_pclmulqdq_reset(crc32_fold *crc) {
- return crc32_fold_reset(crc);
-}
-
-Z_INTERNAL uint32_t crc32_fold_pclmulqdq_final(crc32_fold *crc) {
- return crc32_fold_final(crc);
-}
-
-Z_INTERNAL void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
- crc32_fold_copy(crc, NULL, src, len, init_crc, 0);
-}
+Z_INTERNAL uint32_t crc32_pclmulqdq(uint32_t crc, const uint8_t *buf, size_t len) {
+ /* For lens smaller than ~12, crc32_small method is faster.
+ * But there are also minimum requirements for the pclmul functions due to alignment */
+ if (len < 16)
+ return crc32_small(crc, buf, len);
-Z_INTERNAL void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
- crc32_fold_copy(crc, dst, src, len, 0, 1);
+ crc32_fold ALIGNED_(16) crc_state;
+ crc32_fold_reset(&crc_state);
+ crc32_fold_copy(&crc_state, NULL, buf, len, crc, 0);
+ return crc32_fold_final(&crc_state);
}
-Z_INTERNAL uint32_t crc32_pclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len) {
+Z_INTERNAL uint32_t crc32_copy_pclmulqdq(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
/* For lens smaller than ~12, crc32_small method is faster.
* But there are also minimum requirements for the pclmul functions due to alignment */
if (len < 16)
- return crc32_small(crc32, buf, len);
+ return crc32_small_copy(crc, dst, src, len);
crc32_fold ALIGNED_(16) crc_state;
crc32_fold_reset(&crc_state);
- crc32_fold_copy(&crc_state, NULL, buf, len, crc32, 0);
+ crc32_fold_copy(&crc_state, dst, src, len, crc, 1);
return crc32_fold_final(&crc_state);
}
#endif
#define X86_VPCLMULQDQ
#include "crc32_fold_pclmulqdq_tpl.h"
-Z_INTERNAL uint32_t crc32_fold_vpclmulqdq_reset(crc32_fold *crc) {
- return crc32_fold_reset(crc);
-}
-
-Z_INTERNAL uint32_t crc32_fold_vpclmulqdq_final(crc32_fold *crc) {
- return crc32_fold_final(crc);
-}
-
-Z_INTERNAL void crc32_fold_vpclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
- crc32_fold_copy(crc, NULL, src, len, init_crc, 0);
-}
+Z_INTERNAL uint32_t crc32_vpclmulqdq(uint32_t crc, const uint8_t *buf, size_t len) {
+ /* For lens smaller than ~12, crc32_small method is faster.
+ * But there are also minimum requirements for the pclmul functions due to alignment */
+ if (len < 16)
+ return crc32_small(crc, buf, len);
-Z_INTERNAL void crc32_fold_vpclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
- crc32_fold_copy(crc, dst, src, len, 0, 1);
+ crc32_fold ALIGNED_(16) crc_state;
+ crc32_fold_reset(&crc_state);
+ crc32_fold_copy(&crc_state, NULL, buf, len, crc, 0);
+ return crc32_fold_final(&crc_state);
}
-Z_INTERNAL uint32_t crc32_vpclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len) {
+Z_INTERNAL uint32_t crc32_copy_vpclmulqdq(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
/* For lens smaller than ~12, crc32_small method is faster.
* But there are also minimum requirements for the pclmul functions due to alignment */
if (len < 16)
- return crc32_small(crc32, buf, len);
+ return crc32_small_copy(crc, dst, src, len);
crc32_fold ALIGNED_(16) crc_state;
crc32_fold_reset(&crc_state);
- crc32_fold_copy(&crc_state, NULL, buf, len, crc32, 0);
+ crc32_fold_copy(&crc_state, dst, src, len, crc, 1);
return crc32_fold_final(&crc_state);
}
-
#endif
void slide_hash_sse2(deflate_state *s);
void inflate_fast_sse2(PREFIX3(stream)* strm, uint32_t start);
# if !defined(WITHOUT_CHORBA_SSE)
- uint32_t crc32_chorba_sse2(uint32_t crc32, const uint8_t *buf, size_t len);
+ uint32_t crc32_chorba_sse2(uint32_t crc, const uint8_t *buf, size_t len);
+ uint32_t crc32_copy_chorba_sse2(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
uint32_t chorba_small_nondestructive_sse2(uint32_t c, const uint64_t *aligned_buf, size_t aligned_len);
# endif
#endif
#endif
#if defined(X86_SSE41) && !defined(WITHOUT_CHORBA_SSE)
- uint32_t crc32_chorba_sse41(uint32_t crc32, const uint8_t *buf, size_t len);
+ uint32_t crc32_chorba_sse41(uint32_t crc, const uint8_t *buf, size_t len);
+ uint32_t crc32_copy_chorba_sse41(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_SSE42
#endif
#ifdef X86_PCLMULQDQ_CRC
-uint32_t crc32_fold_pclmulqdq_reset(crc32_fold *crc);
-void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
-uint32_t crc32_fold_pclmulqdq_final(crc32_fold *crc);
-uint32_t crc32_pclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len);
+uint32_t crc32_pclmulqdq(uint32_t crc, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_pclmulqdq(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_VPCLMULQDQ_CRC
-uint32_t crc32_fold_vpclmulqdq_reset(crc32_fold *crc);
-void crc32_fold_vpclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
-void crc32_fold_vpclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
-uint32_t crc32_fold_vpclmulqdq_final(crc32_fold *crc);
-uint32_t crc32_vpclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len);
+uint32_t crc32_vpclmulqdq(uint32_t crc, const uint8_t *buf, size_t len);
+uint32_t crc32_copy_vpclmulqdq(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef DISABLE_RUNTIME_CPU_DETECTION
# if defined(X86_SSE41) && defined(__SSE4_1__) && !defined(WITHOUT_CHORBA_SSE)
# undef native_crc32
# define native_crc32 crc32_chorba_sse41
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_chorba_sse41
# endif
// X86 - SSE4.2
# if defined(X86_SSE42) && defined(__SSE4_2__)
# if defined(X86_PCLMULQDQ_CRC) && defined(__PCLMUL__)
# undef native_crc32
# define native_crc32 crc32_pclmulqdq
-# undef native_crc32_fold
-# define native_crc32_fold crc32_fold_pclmulqdq
-# undef native_crc32_fold_copy
-# define native_crc32_fold_copy crc32_fold_pclmulqdq_copy
-# undef native_crc32_fold_final
-# define native_crc32_fold_final crc32_fold_pclmulqdq_final
-# undef native_crc32_fold_reset
-# define native_crc32_fold_reset crc32_fold_pclmulqdq_reset
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_pclmulqdq
# endif
// X86 - AVX2
# if defined(X86_AVX2) && defined(__AVX2__)
# if defined(__PCLMUL__) && defined(__AVX512F__) && defined(__VPCLMULQDQ__)
# undef native_crc32
# define native_crc32 crc32_vpclmulqdq
-# undef native_crc32_fold
-# define native_crc32_fold crc32_fold_vpclmulqdq
-# undef native_crc32_fold_copy
-# define native_crc32_fold_copy crc32_fold_vpclmulqdq_copy
-# undef native_crc32_fold_final
-# define native_crc32_fold_final crc32_fold_vpclmulqdq_final
-# undef native_crc32_fold_reset
-# define native_crc32_fold_reset crc32_fold_vpclmulqdq_reset
+# undef native_crc32_copy
+# define native_crc32_copy crc32_copy_vpclmulqdq
# endif
# endif
#endif
#ifdef GZIP
if (s->wrap == 2) {
- strm->adler = FUNCTABLE_CALL(crc32_fold_reset)(&s->crc_fold);
+ strm->adler = CRC32_INITIAL_VALUE;
} else
#endif
strm->adler = ADLER32_INITIAL_VALUE;
#ifdef GZIP
if (s->status == GZIP_STATE) {
/* gzip header */
- FUNCTABLE_CALL(crc32_fold_reset)(&s->crc_fold);
+ strm->adler = CRC32_INITIAL_VALUE;
put_byte(s, 31);
put_byte(s, 139);
put_byte(s, 8);
}
}
put_short(s, (uint16_t)strm->adler);
- FUNCTABLE_CALL(crc32_fold_reset)(&s->crc_fold);
+ strm->adler = CRC32_INITIAL_VALUE;
}
s->status = BUSY_STATE;
/* Write the trailer */
#ifdef GZIP
if (s->wrap == 2) {
- strm->adler = FUNCTABLE_CALL(crc32_fold_final)(&s->crc_fold);
-
put_uint32(s, strm->adler);
put_uint32(s, (uint32_t)strm->total_in);
} else
memcpy(buf, strm->next_in, len);
#ifdef GZIP
} else if (s->wrap == 2) {
- FUNCTABLE_CALL(crc32_fold_copy)(&s->crc_fold, buf, strm->next_in, len);
+ strm->adler = FUNCTABLE_CALL(crc32_copy)(strm->adler, buf, strm->next_in, len);
#endif
} else if (s->wrap == 1) {
strm->adler = FUNCTABLE_CALL(adler32_copy)(strm->adler, buf, strm->next_in, len);
ft.adler32 = &adler32_c;
ft.adler32_copy = &adler32_copy_c;
ft.crc32 = &crc32_braid;
- ft.crc32_fold = &crc32_fold_c;
- ft.crc32_fold_copy = &crc32_fold_copy_c;
- ft.crc32_fold_final = &crc32_fold_final_c;
- ft.crc32_fold_reset = &crc32_fold_reset_c;
+ ft.crc32_copy = &crc32_copy_braid;
# ifndef HAVE_BUILTIN_CTZ
ft.longest_match = &longest_match_c;
ft.longest_match_slow = &longest_match_slow_c;
ft.adler32_copy = &adler32_copy_c;
ft.chunkmemset_safe = &chunkmemset_safe_c;
ft.crc32 = &crc32_braid;
- ft.crc32_fold = &crc32_fold_c;
- ft.crc32_fold_copy = &crc32_fold_copy_c;
- ft.crc32_fold_final = &crc32_fold_final_c;
- ft.crc32_fold_reset = &crc32_fold_reset_c;
+ ft.crc32_copy = &crc32_copy_braid;
ft.inflate_fast = &inflate_fast_c;
ft.slide_hash = &slide_hash_c;
ft.longest_match = &longest_match_c;
// Chorba generic C fallback
#ifndef WITHOUT_CHORBA
ft.crc32 = &crc32_chorba;
+ ft.crc32_copy = &crc32_copy_chorba;
#endif
// X86 - SSE2
ft.chunkmemset_safe = &chunkmemset_safe_sse2;
# if !defined(WITHOUT_CHORBA_SSE)
ft.crc32 = &crc32_chorba_sse2;
+ ft.crc32_copy = &crc32_copy_chorba_sse2;
# endif
ft.inflate_fast = &inflate_fast_sse2;
ft.slide_hash = &slide_hash_sse2;
#if defined(X86_SSE41) && !defined(WITHOUT_CHORBA_SSE)
if (cf.x86.has_sse41) {
ft.crc32 = &crc32_chorba_sse41;
+ ft.crc32_copy = &crc32_copy_chorba_sse41;
}
#endif
#ifdef X86_PCLMULQDQ_CRC
if (cf.x86.has_pclmulqdq) {
ft.crc32 = &crc32_pclmulqdq;
- ft.crc32_fold = &crc32_fold_pclmulqdq;
- ft.crc32_fold_copy = &crc32_fold_pclmulqdq_copy;
- ft.crc32_fold_final = &crc32_fold_pclmulqdq_final;
- ft.crc32_fold_reset = &crc32_fold_pclmulqdq_reset;
+ ft.crc32_copy = &crc32_copy_pclmulqdq;
}
#endif
// X86 - AVX
#ifdef X86_VPCLMULQDQ_CRC
if (cf.x86.has_pclmulqdq && cf.x86.has_avx512_common && cf.x86.has_vpclmulqdq) {
ft.crc32 = &crc32_vpclmulqdq;
- ft.crc32_fold = &crc32_fold_vpclmulqdq;
- ft.crc32_fold_copy = &crc32_fold_vpclmulqdq_copy;
- ft.crc32_fold_final = &crc32_fold_vpclmulqdq_final;
- ft.crc32_fold_reset = &crc32_fold_vpclmulqdq_reset;
+ ft.crc32_copy = &crc32_copy_vpclmulqdq;
}
#endif
#ifdef ARM_CRC32
if (cf.arm.has_crc32) {
ft.crc32 = &crc32_armv8;
- ft.crc32_fold = &crc32_fold_armv8;
- ft.crc32_fold_copy = &crc32_fold_copy_armv8;
+ ft.crc32_copy = &crc32_copy_armv8;
}
#endif
}
#endif
#ifdef POWER8_VSX_CRC32
- if (cf.power.has_arch_2_07)
+ if (cf.power.has_arch_2_07) {
ft.crc32 = &crc32_power8;
+ ft.crc32_copy = &crc32_copy_power8;
+ }
#endif
// Power9
#ifdef POWER9
#ifdef RISCV_CRC32_ZBC
if (cf.riscv.has_zbc) {
ft.crc32 = &crc32_riscv64_zbc;
+ ft.crc32_copy = &crc32_copy_riscv64_zbc;
}
#endif
// S390
#ifdef S390_CRC32_VX
- if (cf.s390.has_vx)
+ if (cf.s390.has_vx) {
ft.crc32 = crc32_s390_vx;
+ ft.crc32_copy = crc32_copy_s390_vx;
+ }
#endif
// LOONGARCH
#ifdef LOONGARCH_CRC
if (cf.loongarch.has_crc) {
ft.crc32 = crc32_loongarch64;
- ft.crc32_fold = &crc32_fold_loongarch64;
- ft.crc32_fold_copy = &crc32_fold_copy_loongarch64;
+ ft.crc32_copy = crc32_copy_loongarch64;
}
#endif
#ifdef LOONGARCH_LSX
FUNCTABLE_VERIFY_ASSIGN(ft, chunkmemset_safe);
FUNCTABLE_VERIFY_ASSIGN(ft, compare256);
FUNCTABLE_VERIFY_ASSIGN(ft, crc32);
- FUNCTABLE_VERIFY_ASSIGN(ft, crc32_fold);
- FUNCTABLE_VERIFY_ASSIGN(ft, crc32_fold_copy);
- FUNCTABLE_VERIFY_ASSIGN(ft, crc32_fold_final);
- FUNCTABLE_VERIFY_ASSIGN(ft, crc32_fold_reset);
+ FUNCTABLE_VERIFY_ASSIGN(ft, crc32_copy);
FUNCTABLE_VERIFY_ASSIGN(ft, inflate_fast);
FUNCTABLE_VERIFY_ASSIGN(ft, longest_match);
FUNCTABLE_VERIFY_ASSIGN(ft, longest_match_slow);
return functable.crc32(crc, buf, len);
}
-static void crc32_fold_stub(crc32_fold* crc, const uint8_t* src, size_t len, uint32_t init_crc) {
- FUNCTABLE_INIT_ABORT;
- functable.crc32_fold(crc, src, len, init_crc);
-}
-
-static void crc32_fold_copy_stub(crc32_fold* crc, uint8_t* dst, const uint8_t* src, size_t len) {
- FUNCTABLE_INIT_ABORT;
- functable.crc32_fold_copy(crc, dst, src, len);
-}
-
-static uint32_t crc32_fold_final_stub(crc32_fold* crc) {
- FUNCTABLE_INIT_ABORT;
- return functable.crc32_fold_final(crc);
-}
-
-static uint32_t crc32_fold_reset_stub(crc32_fold* crc) {
+static uint32_t crc32_copy_stub(uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len) {
FUNCTABLE_INIT_ABORT;
- return functable.crc32_fold_reset(crc);
+ return functable.crc32_copy(crc, dst, src, len);
}
static void inflate_fast_stub(PREFIX3(stream) *strm, uint32_t start) {
chunkmemset_safe_stub,
compare256_stub,
crc32_stub,
- crc32_fold_stub,
- crc32_fold_copy_stub,
- crc32_fold_final_stub,
- crc32_fold_reset_stub,
+ crc32_copy_stub,
inflate_fast_stub,
longest_match_stub,
longest_match_slow_stub,
uint8_t* (* chunkmemset_safe) (uint8_t *out, uint8_t *from, unsigned len, unsigned left);
uint32_t (* compare256) (const uint8_t *src0, const uint8_t *src1);
uint32_t (* crc32) (uint32_t crc, const uint8_t *buf, size_t len);
- void (* crc32_fold) (struct crc32_fold_s *crc, const uint8_t *src, size_t len, uint32_t init_crc);
- void (* crc32_fold_copy) (struct crc32_fold_s *crc, uint8_t *dst, const uint8_t *src, size_t len);
- uint32_t (* crc32_fold_final) (struct crc32_fold_s *crc);
- uint32_t (* crc32_fold_reset) (struct crc32_fold_s *crc);
+ uint32_t (* crc32_copy) (uint32_t crc, uint8_t *dst, const uint8_t *src, size_t len);
void (* inflate_fast) (PREFIX3(stream) *strm, uint32_t start);
uint32_t (* longest_match) (deflate_state *const s, uint32_t cur_match);
uint32_t (* longest_match_slow) (deflate_state *const s, uint32_t cur_match);
struct inflate_state *state = (struct inflate_state*)strm->state;
#ifdef GUNZIP
if (state->flags) {
- FUNCTABLE_CALL(crc32_fold_copy)(&state->crc_fold, dst, src, copy);
+ strm->adler = state->check = FUNCTABLE_CALL(crc32_copy)(state->check, dst, src, copy);
} else
#endif
{
struct inflate_state *state = (struct inflate_state*)strm->state;
#ifdef GUNZIP
if (state->flags) {
- FUNCTABLE_CALL(crc32_fold)(&state->crc_fold, src, len, 0);
+ strm->adler = state->check = FUNCTABLE_CALL(crc32)(state->check, src, len);
} else
#endif
{
}
/* compute crc32 checksum if not in raw mode */
if ((state->wrap & 4) && state->flags)
- strm->adler = state->check = FUNCTABLE_CALL(crc32_fold_reset)(&state->crc_fold);
+ strm->adler = state->check = CRC32_INITIAL_VALUE;
state->mode = TYPE;
break;
#endif
if (out) {
inf_chksum(strm, put - out, out);
}
-#ifdef GUNZIP
- if (state->flags)
- strm->adler = state->check = FUNCTABLE_CALL(crc32_fold_final)(&state->crc_fold);
-#endif
}
out = left;
if ((state->wrap & 4) && (
test_compare256.cc # compare256_neon(), etc
test_compare256_rle.cc # compare256_rle(), etc
test_crc32.cc # crc32_armv8(), etc
- test_crc32_fold_copy.cc # crc32_fold_copy implementations
+ test_crc32_copy.cc # crc32_copy implementations
test_inflate_sync.cc # expects a certain compressed block layout
test_main.cc # cpu_check_features()
test_version.cc # expects a fixed version string
benchmark_compare256_rle.cc
benchmark_compress.cc
benchmark_crc32.cc
- benchmark_crc32_fold_copy.cc
+ benchmark_crc32_copy.cc
benchmark_insert_string.cc
benchmark_main.cc
benchmark_slidehash.cc
TEST_CRC32(chorba_sse41, crc32_chorba_sse41, test_cpu_features.x86.has_sse41)
# endif
#endif
-#if defined(LOONGARCH_CRC)
+#ifdef LOONGARCH_CRC
INSTANTIATE_TEST_SUITE_P(crc32_alignment, crc32_align, testing::ValuesIn(align_offsets));
TEST_CRC32(loongarch64, crc32_loongarch64, test_cpu_features.loongarch.has_crc)
TEST_CRC32_ALIGN(loongarch64_align, crc32_loongarch64, test_cpu_features.loongarch.has_crc)