From 19c758b4d8fdb7bf7b1410cf5392314f3b2e9efe Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 22 Jan 2022 05:53:58 +0000 Subject: [PATCH 01/28] - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- zlib.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zlib.spec b/zlib.spec index 31619eb..80abf10 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.11 -Release: 30%{?dist} +Release: 31%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -180,6 +180,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Sat Jan 22 2022 Fedora Release Engineering - 1.2.11-31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + * Thu Jul 29 2021 Dan Horák - 1.2.11-30 - Fix for IBM CRC32 optimalization rhbz#1959423 From 531848943bac3bd936cac51ca8cd071146e4ef0d Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Thu, 3 Mar 2022 13:16:39 +0000 Subject: [PATCH 02/28] Fix for IBM Z compressBound() Source from https://gitlab.com/redhat/centos-stream/rpms/zlib/-/merge_requests/9 Resolves: #2057484 --- ...accelrated-deflate-compressBound-fix.patch | 93 +++++++++++++++++++ zlib.spec | 10 +- 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch diff --git a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch b/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch new file mode 100644 index 0000000..27454ab --- /dev/null +++ b/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch @@ -0,0 +1,93 @@ +Source from https://gitlab.com/redhat/centos-stream/rpms/zlib/-/merge_requests/9 +Author: Ilya Leoshkevich + +--- a/compress.c ++++ b/compress.c +@@ -5,9 +5,15 @@ + + /* @(#) $Id$ */ + +-#define ZLIB_INTERNAL ++#include "zutil.h" + #include "zlib.h" + ++#ifdef DFLTCC ++# include "contrib/s390/dfltcc.h" ++#else ++#define DEFLATE_BOUND_COMPLEN(source_len) 0 ++#endif ++ + /* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte +@@ -81,6 +87,12 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) + uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; + { ++ uLong complen = DEFLATE_BOUND_COMPLEN(sourceLen); ++ ++ if (complen > 0) ++ /* Architecture-specific code provided an upper bound. */ ++ return complen + ZLIB_WRAPLEN; ++ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; + } +--- a/contrib/s390/dfltcc.h ++++ b/contrib/s390/dfltcc.h +@@ -12,6 +12,28 @@ void ZLIB_INTERNAL dfltcc_reset OF((z_streamp strm, uInt size)); + voidpf ZLIB_INTERNAL dfltcc_alloc_window OF((z_streamp strm, uInt items, + uInt size)); + void ZLIB_INTERNAL dfltcc_free_window OF((z_streamp strm, voidpf w)); ++#define DFLTCC_BLOCK_HEADER_BITS 3 ++#define DFLTCC_HLITS_COUNT_BITS 5 ++#define DFLTCC_HDISTS_COUNT_BITS 5 ++#define DFLTCC_HCLENS_COUNT_BITS 4 ++#define DFLTCC_MAX_HCLENS 19 ++#define DFLTCC_HCLEN_BITS 3 ++#define DFLTCC_MAX_HLITS 286 ++#define DFLTCC_MAX_HDISTS 30 ++#define DFLTCC_MAX_HLIT_HDIST_BITS 7 ++#define DFLTCC_MAX_SYMBOL_BITS 16 ++#define DFLTCC_MAX_EOBS_BITS 15 ++#define DFLTCC_MAX_PADDING_BITS 7 ++#define DEFLATE_BOUND_COMPLEN(source_len) \ ++ ((DFLTCC_BLOCK_HEADER_BITS + \ ++ DFLTCC_HLITS_COUNT_BITS + \ ++ DFLTCC_HDISTS_COUNT_BITS + \ ++ DFLTCC_HCLENS_COUNT_BITS + \ ++ DFLTCC_MAX_HCLENS * DFLTCC_HCLEN_BITS + \ ++ (DFLTCC_MAX_HLITS + DFLTCC_MAX_HDISTS) * DFLTCC_MAX_HLIT_HDIST_BITS + \ ++ (source_len) * DFLTCC_MAX_SYMBOL_BITS + \ ++ DFLTCC_MAX_EOBS_BITS + \ ++ DFLTCC_MAX_PADDING_BITS) >> 3) + int ZLIB_INTERNAL dfltcc_can_inflate OF((z_streamp strm)); + typedef enum { + DFLTCC_INFLATE_CONTINUE, +diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h +index 03f7f53..46acfc5 100644 +--- a/contrib/s390/dfltcc_deflate.h ++++ b/contrib/s390/dfltcc_deflate.h +@@ -46,8 +46,7 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary OF((z_streamp strm, + #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ + do { \ + if (dfltcc_can_deflate((strm))) \ +- (complen) = (3 + 5 + 5 + 4 + 19 * 3 + (286 + 30) * 7 + \ +- (source_len) * 16 + 15 + 7) >> 3; \ ++ (complen) = DEFLATE_BOUND_COMPLEN(source_len); \ + } while (0) + #define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) (dfltcc_can_deflate((strm))) + #define DEFLATE_HOOK dfltcc_deflate +diff --git a/zutil.h b/zutil.h +index 14277bc..cf90e49 100644 +--- a/zutil.h ++++ b/zutil.h +@@ -87,6 +87,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + + #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + ++#define ZLIB_WRAPLEN 6 /* zlib format overhead */ ++ + /* target dependencies */ + + #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) diff --git a/zlib.spec b/zlib.spec index 80abf10..776f4b9 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.11 -Release: 31%{?dist} +Release: 32%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -35,6 +35,8 @@ Patch14: zlib-1.2.11-inflateSyncPoint-return-value-fix.patch Patch15: zlib-1.2.11-covscan-issues-rhel9.patch # Fix for s390x vectorize CRC32 Patch16: zlib-1.2.11-s390x-vectorize-crc32.patch +# Fix the compressBound() on z15 +Patch17: zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -103,6 +105,7 @@ developing applications which use minizip. %patch14 -p1 %patch15 -p1 %patch16 -p1 +%patch17 -p1 iconv -f iso-8859-2 -t utf-8 < ChangeLog > ChangeLog.tmp @@ -180,6 +183,11 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Mon Feb 28 2022 Lukas Javorsky - 1.2.11-32 +- Apply IBM patch for compressBound() function +- Source from https://github.com/madler/zlib/issues/410#issuecomment-947212824 +- Resolves: #2057484 + * Sat Jan 22 2022 Fedora Release Engineering - 1.2.11-31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild From e6d794cc6e0fe2836fb40a8a191d5f40307d9e5d Mon Sep 17 00:00:00 2001 From: Jakub Heger Date: Tue, 8 Mar 2022 10:08:53 +0000 Subject: [PATCH 03/28] Add CI to the zlib package This should automatically test zlib when a new PR is created --- .fmf/version | 1 + ci.fmf | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 .fmf/version create mode 100644 ci.fmf diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/ci.fmf b/ci.fmf new file mode 100644 index 0000000..1b25926 --- /dev/null +++ b/ci.fmf @@ -0,0 +1,7 @@ +summary: CI plan +discover: + how: fmf + url: https://src.fedoraproject.org/tests/zlib.git + ref: main +execute: + how: tmt From 63d5e2b83dfe4f6e8a43575aebceafe8a14905e2 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:04:21 +0000 Subject: [PATCH 04/28] [1/6] Rebase to 1.2.12 Resolves: CVE-2018-25032, BZ#2069002 --- .gitignore | 2 ++ sources | 2 +- zlib.spec | 8 ++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index c338974..0c00884 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /zlib-1.2.11.tar.xz +/zlib-1.2.12.tar.gz +/zlib-1.2.12.tar.xz diff --git a/sources b/sources index 90377f8..b24ca65 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (zlib-1.2.11.tar.xz) = b7f50ada138c7f93eb7eb1631efccd1d9f03a5e77b6c13c8b757017b2d462e19d2d3e01c50fad60a4ae1bc86d431f6f94c72c11ff410c25121e571953017cb67 +SHA512 (zlib-1.2.12.tar.xz) = 12940e81e988f7661da52fa20bdc333314ae86a621fdb748804a20840b065a1d6d984430f2d41f3a057de0effc6ff9bcf42f9ee9510b88219085f59cbbd082bd diff --git a/zlib.spec b/zlib.spec index 776f4b9..254067f 100644 --- a/zlib.spec +++ b/zlib.spec @@ -1,8 +1,8 @@ %bcond_without minizip Name: zlib -Version: 1.2.11 -Release: 32%{?dist} +Version: 1.2.12 +Release: 1%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -183,6 +183,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Tue Apr 05 2022 Lukas Javorsky - 1.2.12-1 +- Rebase to 1.2.12 +- Resolves: CVE-2018-25032 + * Mon Feb 28 2022 Lukas Javorsky - 1.2.11-32 - Apply IBM patch for compressBound() function - Source from https://github.com/madler/zlib/issues/410#issuecomment-947212824 From 410c955f9f9f329ea6853b96d757c64a8737a7a6 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:27:43 +0000 Subject: [PATCH 05/28] [2/6] Unify IBM-Z-hw-accelerated patch Source: https://github.com/madler/zlib/pull/410 --- ...C-compression-level-switching-issues.patch | 206 ----- ...accelrated-deflate-compressBound-fix.patch | 93 --- ...2.11-IBM-Z-hw-accelrated-deflate-fix.patch | 516 ------------- ...11-inflateSyncPoint-return-value-fix.patch | 45 -- zlib-1.2.11-permit-deflateParams-change.patch | 70 -- ...-1.2.12-IBM-Z-hw-accelerated-deflate.patch | 727 ++++++++++++------ 6 files changed, 511 insertions(+), 1146 deletions(-) delete mode 100644 zlib-1.2.11-IBM-DFLTCC-compression-level-switching-issues.patch delete mode 100644 zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch delete mode 100644 zlib-1.2.11-IBM-Z-hw-accelrated-deflate-fix.patch delete mode 100644 zlib-1.2.11-inflateSyncPoint-return-value-fix.patch delete mode 100644 zlib-1.2.11-permit-deflateParams-change.patch rename zlib-1.2.11-IBM-Z-hw-accelrated-deflate-s390x.patch => zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch (74%) diff --git a/zlib-1.2.11-IBM-DFLTCC-compression-level-switching-issues.patch b/zlib-1.2.11-IBM-DFLTCC-compression-level-switching-issues.patch deleted file mode 100644 index c69d9bc..0000000 --- a/zlib-1.2.11-IBM-DFLTCC-compression-level-switching-issues.patch +++ /dev/null @@ -1,206 +0,0 @@ -Subject: [PATCH] Fixed DFLTCC compression level switching issues - ---- - configure | 4 +-- - contrib/s390/dfltcc.c | 52 ++++++++++++++++++++++++++++++----- - contrib/s390/dfltcc_deflate.h | 2 ++ - deflate.c | 12 ++++---- - test/infcover.c | 2 +- - 5 files changed, 57 insertions(+), 15 deletions(-) - -diff --git a/configure b/configure -index bfe4386..70ed86b 100755 ---- a/configure -+++ b/configure -@@ -139,7 +139,7 @@ case "$1" in - -w* | --warn) warn=1; shift ;; - -d* | --debug) debug=1; shift ;; - --dfltcc) -- CFLAGS="$CFLAGS -DDFLTCC" -+ CFLAGS="$CFLAGS -DDFLTCC -DDFLTCC_LEVEL_MASK=0x7e" - OBJC="$OBJC dfltcc.o" - PIC_OBJC="$PIC_OBJC dfltcc.lo" - shift -@@ -838,7 +838,7 @@ cat > $test.c << EOF - #include - int main() { return 0; } - EOF --if try ${CC} ${CFLAGS} $test.c; then -+ if try $CC -c $CFLAGS $test.c; then - echo "Checking for sys/sdt.h ... Yes." | tee -a configure.log - CFLAGS="$CFLAGS -DHAVE_SYS_SDT_H" - SFLAGS="$SFLAGS -DHAVE_SYS_SDT_H" -diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c -index d88a0d6..94a196f 100644 ---- a/contrib/s390/dfltcc.c -+++ b/contrib/s390/dfltcc.c -@@ -350,8 +350,12 @@ int ZLIB_INTERNAL dfltcc_deflate(strm, flush, result) - int soft_bcc; - int no_flush; - -- if (!dfltcc_can_deflate(strm)) -+ if (!dfltcc_can_deflate(strm)) { -+ /* Clear history. */ -+ if (flush == Z_FULL_FLUSH) -+ param->hl = 0; - return 0; -+ } - - again: - masked_avail_in = 0; -@@ -376,7 +380,8 @@ again: - /* Clear history. */ - if (flush == Z_FULL_FLUSH) - param->hl = 0; -- *result = need_more; -+ /* Trigger block post-processing if necessary. */ -+ *result = no_flush ? need_more : block_done; - return 1; - } - -@@ -403,13 +408,18 @@ again: - param->bcf = 0; - dfltcc_state->block_threshold = - strm->total_in + dfltcc_state->block_size; -- if (strm->avail_out == 0) { -- *result = need_more; -- return 1; -- } - } - } - -+ /* No space for compressed data. If we proceed, dfltcc_cmpr() will return -+ * DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still -+ * set BCF=1, which is wrong. Avoid complications and return early. -+ */ -+ if (strm->avail_out == 0) { -+ *result = need_more; -+ return 1; -+ } -+ - /* The caller gave us too much data. Pass only one block worth of - * uncompressed data to DFLTCC and mask the rest, so that on the next - * iteration we start a new block. -@@ -737,10 +747,15 @@ __attribute__((constructor)) local void init_globals(void) - * compiling with -m31, gcc defaults to ESA mode, however, since the kernel - * is 64-bit, it's always z/Architecture mode at runtime. - */ -- __asm__ volatile(".machinemode push\n" -+ __asm__ volatile( -+#ifndef __clang__ -+ ".machinemode push\n" - ".machinemode zarch\n" -+#endif - "stfle %[facilities]\n" -+#ifndef __clang__ - ".machinemode pop\n" -+#endif - : [facilities] "=Q" (cpu_facilities) - , [r0] "+r" (r0) - : -@@ -872,6 +887,28 @@ int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy, flush) - return Z_OK; - } - -+int ZLIB_INTERNAL dfltcc_deflate_done(strm, flush) -+ z_streamp strm; -+ int flush; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ -+ /* When deflate(Z_FULL_FLUSH) is called with small avail_out, it might -+ * close the block without resetting the compression state. Detect this -+ * situation and return that deflation is not done. -+ */ -+ if (flush == Z_FULL_FLUSH && strm->avail_out == 0) -+ return 0; -+ -+ /* Return that deflation is not done if DFLTCC is used and either it -+ * buffered some data (Continuation Flag is set), or has not written EOBS -+ * yet (Block-Continuation Flag is set). -+ */ -+ return !dfltcc_can_deflate(strm) || (!param->cf && !param->bcf); -+} -+ - /* - Preloading history. - */ -@@ -925,6 +962,7 @@ int ZLIB_INTERNAL dfltcc_deflate_set_dictionary(strm, dictionary, dict_length) - - append_history(param, state->window, dictionary, dict_length); - state->strstart = 1; /* Add FDICT to zlib header */ -+ state->block_start = state->strstart; /* Make deflate_stored happy */ - return Z_OK; - } - -diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h -index de36784..914daa4 100644 ---- a/contrib/s390/dfltcc_deflate.h -+++ b/contrib/s390/dfltcc_deflate.h -@@ -11,6 +11,7 @@ int ZLIB_INTERNAL dfltcc_deflate_params OF((z_streamp strm, - int level, - int strategy, - int *flush)); -+int ZLIB_INTERNAL dfltcc_deflate_done OF((z_streamp strm, int flush)); - int ZLIB_INTERNAL dfltcc_deflate_set_dictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dict_length)); -@@ -41,6 +42,7 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary OF((z_streamp strm, - if (err == Z_STREAM_ERROR) \ - return err; \ - } while (0) -+#define DEFLATE_DONE dfltcc_deflate_done - #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ - do { \ - if (dfltcc_can_deflate((strm))) \ -diff --git a/deflate.c b/deflate.c -index d907a1b..085abbe 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -75,6 +75,7 @@ const char deflate_copyright[] = - #define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) - #define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0) - #define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0) -+#define DEFLATE_DONE(strm, flush) 1 - #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0) - #define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0 - #define DEFLATE_HOOK(strm, flush, bstate) 0 -@@ -605,14 +606,15 @@ int ZEXPORT deflateParams(strm, level, strategy) - DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); - func = configuration_table[s->level].func; - -- if ((strategy != s->strategy || func != configuration_table[level].func || -- hook_flush != Z_NO_FLUSH) && s->last_flush != -2) { -+ if (((strategy != s->strategy || func != configuration_table[level].func) && -+ s->last_flush != -2) || hook_flush != Z_NO_FLUSH) { - /* Flush the last buffer: */ -- int err = deflate(strm, RANK(hook_flush) > RANK(Z_BLOCK) ? -- hook_flush : Z_BLOCK); -+ int flush = RANK(hook_flush) > RANK(Z_BLOCK) ? hook_flush : Z_BLOCK; -+ int err = deflate(strm, flush); - if (err == Z_STREAM_ERROR) - return err; -- if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) -+ if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead || -+ !DEFLATE_DONE(strm, flush)) - return Z_BUF_ERROR; - } - if (s->level != level) { -diff --git a/test/infcover.c b/test/infcover.c -index a34cd17..a208219 100644 ---- a/test/infcover.c -+++ b/test/infcover.c -@@ -373,7 +373,7 @@ local void cover_support(void) - mem_setup(&strm); - strm.avail_in = 0; - strm.next_in = Z_NULL; -- ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); -+ ret = inflateInit_(&strm, &ZLIB_VERSION[1], (int)sizeof(z_stream)); - assert(ret == Z_VERSION_ERROR); - mem_done(&strm, "wrong version"); - --- -2.26.0 - diff --git a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch b/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch deleted file mode 100644 index 27454ab..0000000 --- a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch +++ /dev/null @@ -1,93 +0,0 @@ -Source from https://gitlab.com/redhat/centos-stream/rpms/zlib/-/merge_requests/9 -Author: Ilya Leoshkevich - ---- a/compress.c -+++ b/compress.c -@@ -5,9 +5,15 @@ - - /* @(#) $Id$ */ - --#define ZLIB_INTERNAL -+#include "zutil.h" - #include "zlib.h" - -+#ifdef DFLTCC -+# include "contrib/s390/dfltcc.h" -+#else -+#define DEFLATE_BOUND_COMPLEN(source_len) 0 -+#endif -+ - /* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte -@@ -81,6 +87,12 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) - uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; - { -+ uLong complen = DEFLATE_BOUND_COMPLEN(sourceLen); -+ -+ if (complen > 0) -+ /* Architecture-specific code provided an upper bound. */ -+ return complen + ZLIB_WRAPLEN; -+ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13; - } ---- a/contrib/s390/dfltcc.h -+++ b/contrib/s390/dfltcc.h -@@ -12,6 +12,28 @@ void ZLIB_INTERNAL dfltcc_reset OF((z_streamp strm, uInt size)); - voidpf ZLIB_INTERNAL dfltcc_alloc_window OF((z_streamp strm, uInt items, - uInt size)); - void ZLIB_INTERNAL dfltcc_free_window OF((z_streamp strm, voidpf w)); -+#define DFLTCC_BLOCK_HEADER_BITS 3 -+#define DFLTCC_HLITS_COUNT_BITS 5 -+#define DFLTCC_HDISTS_COUNT_BITS 5 -+#define DFLTCC_HCLENS_COUNT_BITS 4 -+#define DFLTCC_MAX_HCLENS 19 -+#define DFLTCC_HCLEN_BITS 3 -+#define DFLTCC_MAX_HLITS 286 -+#define DFLTCC_MAX_HDISTS 30 -+#define DFLTCC_MAX_HLIT_HDIST_BITS 7 -+#define DFLTCC_MAX_SYMBOL_BITS 16 -+#define DFLTCC_MAX_EOBS_BITS 15 -+#define DFLTCC_MAX_PADDING_BITS 7 -+#define DEFLATE_BOUND_COMPLEN(source_len) \ -+ ((DFLTCC_BLOCK_HEADER_BITS + \ -+ DFLTCC_HLITS_COUNT_BITS + \ -+ DFLTCC_HDISTS_COUNT_BITS + \ -+ DFLTCC_HCLENS_COUNT_BITS + \ -+ DFLTCC_MAX_HCLENS * DFLTCC_HCLEN_BITS + \ -+ (DFLTCC_MAX_HLITS + DFLTCC_MAX_HDISTS) * DFLTCC_MAX_HLIT_HDIST_BITS + \ -+ (source_len) * DFLTCC_MAX_SYMBOL_BITS + \ -+ DFLTCC_MAX_EOBS_BITS + \ -+ DFLTCC_MAX_PADDING_BITS) >> 3) - int ZLIB_INTERNAL dfltcc_can_inflate OF((z_streamp strm)); - typedef enum { - DFLTCC_INFLATE_CONTINUE, -diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h -index 03f7f53..46acfc5 100644 ---- a/contrib/s390/dfltcc_deflate.h -+++ b/contrib/s390/dfltcc_deflate.h -@@ -46,8 +46,7 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary OF((z_streamp strm, - #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ - do { \ - if (dfltcc_can_deflate((strm))) \ -- (complen) = (3 + 5 + 5 + 4 + 19 * 3 + (286 + 30) * 7 + \ -- (source_len) * 16 + 15 + 7) >> 3; \ -+ (complen) = DEFLATE_BOUND_COMPLEN(source_len); \ - } while (0) - #define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) (dfltcc_can_deflate((strm))) - #define DEFLATE_HOOK dfltcc_deflate -diff --git a/zutil.h b/zutil.h -index 14277bc..cf90e49 100644 ---- a/zutil.h -+++ b/zutil.h -@@ -87,6 +87,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ - - #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - -+#define ZLIB_WRAPLEN 6 /* zlib format overhead */ -+ - /* target dependencies */ - - #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) diff --git a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-fix.patch b/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-fix.patch deleted file mode 100644 index a9e5e29..0000000 --- a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-fix.patch +++ /dev/null @@ -1,516 +0,0 @@ -From 608b71008c16ce6fbf2305145c5ffb69cd88ef59 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Fri, 7 Aug 2020 07:12:50 +0200 -Subject: [PATCH] Fix for Z hardware-accelerated deflate for s390x - ---- - configure | 7 + - contrib/s390/dfltcc.c | 244 +++++++++++++++++++++------------- - contrib/s390/dfltcc_deflate.h | 10 +- - deflate.c | 21 +-- - 4 files changed, 177 insertions(+), 105 deletions(-) - -diff --git a/configure b/configure -index 66caece..bfe4386 100755 ---- a/configure -+++ b/configure -@@ -114,6 +114,7 @@ case "$1" in - echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log - echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log - echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log -+ echo ' [--dfltcc]' | tee -a configure.log - exit 0 ;; - -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; - -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; -@@ -137,6 +138,12 @@ case "$1" in - -c* | --const) zconst=1; shift ;; - -w* | --warn) warn=1; shift ;; - -d* | --debug) debug=1; shift ;; -+ --dfltcc) -+ CFLAGS="$CFLAGS -DDFLTCC" -+ OBJC="$OBJC dfltcc.o" -+ PIC_OBJC="$PIC_OBJC dfltcc.lo" -+ shift -+ ;; - *) - echo "unknown option: $1" | tee -a configure.log - echo "$0 --help for help" | tee -a configure.log -diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c -index d187796..d88a0d6 100644 ---- a/contrib/s390/dfltcc.c -+++ b/contrib/s390/dfltcc.c -@@ -2,12 +2,13 @@ - - /* - Use the following commands to build zlib with DFLTCC support: -- $ CFLAGS=-DDFLTCC ./configure -- $ make OBJA=dfltcc.o PIC_OBJA=dfltcc.lo -+ $ ./configure --dfltcc -+ $ make - */ - - #define _GNU_SOURCE - #include -+#include - #include - #include - #include -@@ -230,31 +231,28 @@ struct dfltcc_state { - /* - Compress. - */ --local inline int dfltcc_are_params_ok(int level, -- uInt window_bits, -- int strategy, -- uLong level_mask); --local inline int dfltcc_are_params_ok(level, window_bits, strategy, level_mask) -+local inline int dfltcc_can_deflate_with_params(z_streamp strm, -+ int level, -+ uInt window_bits, -+ int strategy); -+local inline int dfltcc_can_deflate_with_params(strm, -+ level, -+ window_bits, -+ strategy) -+ z_streamp strm; - int level; - uInt window_bits; - int strategy; -- uLong level_mask; --{ -- return (level_mask & (1 << level)) != 0 && -- (window_bits == HB_BITS) && -- (strategy == Z_FIXED || strategy == Z_DEFAULT_STRATEGY); --} -- -- --int ZLIB_INTERNAL dfltcc_can_deflate(strm) -- z_streamp strm; - { - deflate_state FAR *state = (deflate_state FAR *)strm->state; - struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); - - /* Unsupported compression settings */ -- if (!dfltcc_are_params_ok(state->level, state->w_bits, state->strategy, -- dfltcc_state->level_mask)) -+ if ((dfltcc_state->level_mask & (1 << level)) == 0) -+ return 0; -+ if (window_bits != HB_BITS) -+ return 0; -+ if (strategy != Z_FIXED && strategy != Z_DEFAULT_STRATEGY) - return 0; - - /* Unsupported hardware */ -@@ -266,6 +264,17 @@ int ZLIB_INTERNAL dfltcc_can_deflate(strm) - return 1; - } - -+int ZLIB_INTERNAL dfltcc_can_deflate(strm) -+ z_streamp strm; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ -+ return dfltcc_can_deflate_with_params(strm, -+ state->level, -+ state->w_bits, -+ state->strategy); -+} -+ - local void dfltcc_gdht OF((z_streamp strm)); - local void dfltcc_gdht(strm) - z_streamp strm; -@@ -349,22 +358,24 @@ again: - soft_bcc = 0; - no_flush = flush == Z_NO_FLUSH; - -- /* Trailing empty block. Switch to software, except when Continuation Flag -- * is set, which means that DFLTCC has buffered some output in the -- * parameter block and needs to be called again in order to flush it. -+ /* No input data. Return, except when Continuation Flag is set, which means -+ * that DFLTCC has buffered some output in the parameter block and needs to -+ * be called again in order to flush it. - */ -- if (flush == Z_FINISH && strm->avail_in == 0 && !param->cf) { -- if (param->bcf) { -- /* A block is still open, and the hardware does not support closing -- * blocks without adding data. Thus, close it manually. -- */ -+ if (strm->avail_in == 0 && !param->cf) { -+ /* A block is still open, and the hardware does not support closing -+ * blocks without adding data. Thus, close it manually. -+ */ -+ if (!no_flush && param->bcf) { - send_eobs(strm, param); - param->bcf = 0; - } -- return 0; -- } -- -- if (strm->avail_in == 0 && !param->cf) { -+ /* Let one of deflate_* functions write a trailing empty block. */ -+ if (flush == Z_FINISH) -+ return 0; -+ /* Clear history. */ -+ if (flush == Z_FULL_FLUSH) -+ param->hl = 0; - *result = need_more; - return 1; - } -@@ -418,7 +429,7 @@ again: - param->cvt = state->wrap == 2 ? CVT_CRC32 : CVT_ADLER32; - if (!no_flush) - /* We need to close a block. Always do this in software - when there is -- * no input data, the hardware will not nohor BCC. */ -+ * no input data, the hardware will not honor BCC. */ - soft_bcc = 1; - if (flush == Z_FINISH && !param->bcf) - /* We are about to open a BFINAL block, set Block Header Final bit -@@ -433,8 +444,8 @@ again: - param->sbb = (unsigned int)state->bi_valid; - if (param->sbb > 0) - *strm->next_out = (Bytef)state->bi_buf; -- if (param->hl) -- param->nt = 0; /* Honor history */ -+ /* Honor history and check value */ -+ param->nt = 0; - param->cv = state->wrap == 2 ? ZSWAP32(strm->adler) : strm->adler; - - /* When opening a block, choose a Huffman-Table Type */ -@@ -642,27 +653,86 @@ int ZLIB_INTERNAL dfltcc_inflate_disable(strm) - return 0; - } - --/* -- Memory management. -- DFLTCC requires parameter blocks and window to be aligned. zlib allows -- users to specify their own allocation functions, so using e.g. -- `posix_memalign' is not an option. Thus, we overallocate and take the -- aligned portion of the buffer. --*/ -+local int env_dfltcc_disabled; -+local int env_source_date_epoch; -+local unsigned long env_level_mask; -+local unsigned long env_block_size; -+local unsigned long env_block_threshold; -+local unsigned long env_dht_threshold; -+local unsigned long env_ribm; -+local uint64_t cpu_facilities[(DFLTCC_FACILITY / 64) + 1]; -+local struct dfltcc_qaf_param cpu_af __attribute__((aligned(8))); -+ - local inline int is_dfltcc_enabled OF((void)); - local inline int is_dfltcc_enabled(void) -+{ -+ if (env_dfltcc_disabled) -+ /* User has explicitly disabled DFLTCC. */ -+ return 0; -+ -+ return is_bit_set((const char *)cpu_facilities, DFLTCC_FACILITY); -+} -+ -+local unsigned long xstrtoul OF((const char *s, unsigned long _default)); -+local unsigned long xstrtoul(s, _default) -+ const char *s; -+ unsigned long _default; -+{ -+ char *endptr; -+ unsigned long result; -+ -+ if (!(s && *s)) -+ return _default; -+ errno = 0; -+ result = strtoul(s, &endptr, 0); -+ return (errno || *endptr) ? _default : result; -+} -+ -+__attribute__((constructor)) local void init_globals OF((void)); -+__attribute__((constructor)) local void init_globals(void) - { - const char *env; -- uint64_t facilities[(DFLTCC_FACILITY / 64) + 1]; - register char r0 __asm__("r0"); - - env = secure_getenv("DFLTCC"); -- if (env && !strcmp(env, "0")) -- /* User has explicitly disabled DFLTCC. */ -- return 0; -+ -+ -+ env_dfltcc_disabled = env && !strcmp(env, "0"); -+ -+ env = secure_getenv("SOURCE_DATE_EPOCH"); -+ env_source_date_epoch = !!env; -+ -+#ifndef DFLTCC_LEVEL_MASK -+#define DFLTCC_LEVEL_MASK 0x2 -+#endif -+ env_level_mask = xstrtoul(secure_getenv("DFLTCC_LEVEL_MASK"), -+ DFLTCC_LEVEL_MASK); -+ -+#ifndef DFLTCC_BLOCK_SIZE -+#define DFLTCC_BLOCK_SIZE 1048576 -+#endif -+ env_block_size = xstrtoul(secure_getenv("DFLTCC_BLOCK_SIZE"), -+ DFLTCC_BLOCK_SIZE); - -- memset(facilities, 0, sizeof(facilities)); -- r0 = sizeof(facilities) / sizeof(facilities[0]) - 1; -+#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE -+#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 -+#endif -+ env_block_threshold = xstrtoul(secure_getenv("DFLTCC_FIRST_FHT_BLOCK_SIZE"), -+ DFLTCC_FIRST_FHT_BLOCK_SIZE); -+ -+#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE -+#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 -+#endif -+ env_dht_threshold = xstrtoul(secure_getenv("DFLTCC_DHT_MIN_SAMPLE_SIZE"), -+ DFLTCC_DHT_MIN_SAMPLE_SIZE); -+ -+#ifndef DFLTCC_RIBM -+#define DFLTCC_RIBM 0 -+#endif -+ env_ribm = xstrtoul(secure_getenv("DFLTCC_RIBM"), DFLTCC_RIBM); -+ -+ memset(cpu_facilities, 0, sizeof(cpu_facilities)); -+ r0 = sizeof(cpu_facilities) / sizeof(cpu_facilities[0]) - 1; - /* STFLE is supported since z9-109 and only in z/Architecture mode. When - * compiling with -m31, gcc defaults to ESA mode, however, since the kernel - * is 64-bit, it's always z/Architecture mode at runtime. -@@ -671,31 +741,35 @@ local inline int is_dfltcc_enabled(void) - ".machinemode zarch\n" - "stfle %[facilities]\n" - ".machinemode pop\n" -- : [facilities] "=Q" (facilities) -+ : [facilities] "=Q" (cpu_facilities) - , [r0] "+r" (r0) - : - : "cc"); -- return is_bit_set((const char *)facilities, DFLTCC_FACILITY); -+ /* Initialize available functions */ -+ if (is_dfltcc_enabled()) -+ dfltcc(DFLTCC_QAF, &cpu_af, NULL, NULL, NULL, NULL, NULL); -+ else -+ memset(&cpu_af, 0, sizeof(cpu_af)); - } - -+/* -+ Memory management. -+ -+ DFLTCC requires parameter blocks and window to be aligned. zlib allows -+ users to specify their own allocation functions, so using e.g. -+ `posix_memalign' is not an option. Thus, we overallocate and take the -+ aligned portion of the buffer. -+*/ - void ZLIB_INTERNAL dfltcc_reset(strm, size) - z_streamp strm; - uInt size; - { - struct dfltcc_state *dfltcc_state = - (struct dfltcc_state *)((char FAR *)strm->state + ALIGN_UP(size, 8)); -- struct dfltcc_qaf_param *param = -- (struct dfltcc_qaf_param *)&dfltcc_state->param; -- const char *s; - -- /* Initialize available functions */ -- if (is_dfltcc_enabled()) { -- dfltcc(DFLTCC_QAF, param, NULL, NULL, NULL, NULL, NULL); -- memmove(&dfltcc_state->af, param, sizeof(dfltcc_state->af)); -- } else -- memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af)); -+ memcpy(&dfltcc_state->af, &cpu_af, sizeof(dfltcc_state->af)); - -- if (secure_getenv("SOURCE_DATE_EPOCH")) -+ if (env_source_date_epoch) - /* User needs reproducible results, but the output of DFLTCC_CMPR - * depends on buffers' page offsets. - */ -@@ -706,36 +780,11 @@ void ZLIB_INTERNAL dfltcc_reset(strm, size) - dfltcc_state->param.nt = 1; - - /* Initialize tuning parameters */ --#ifndef DFLTCC_LEVEL_MASK --#define DFLTCC_LEVEL_MASK 0x2 --#endif -- s = secure_getenv("DFLTCC_LEVEL_MASK"); -- dfltcc_state->level_mask = (s && *s) ? strtoul(s, NULL, 0) : -- DFLTCC_LEVEL_MASK; --#ifndef DFLTCC_BLOCK_SIZE --#define DFLTCC_BLOCK_SIZE 1048576 --#endif -- s = secure_getenv("DFLTCC_BLOCK_SIZE"); -- dfltcc_state->block_size = (s && *s) ? strtoul(s, NULL, 0) : -- DFLTCC_BLOCK_SIZE; --#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE --#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 --#endif -- s = secure_getenv("DFLTCC_FIRST_FHT_BLOCK_SIZE"); -- dfltcc_state->block_threshold = (s && *s) ? strtoul(s, NULL, 0) : -- DFLTCC_FIRST_FHT_BLOCK_SIZE; --#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE --#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 --#endif -- s = secure_getenv("DFLTCC_DHT_MIN_SAMPLE_SIZE"); -- dfltcc_state->dht_threshold = (s && *s) ? strtoul(s, NULL, 0) : -- DFLTCC_DHT_MIN_SAMPLE_SIZE; --#ifndef DFLTCC_RIBM --#define DFLTCC_RIBM 0 --#endif -- s = secure_getenv("DFLTCC_RIBM"); -- dfltcc_state->param.ribm = (s && *s) ? strtoul(s, NULL, 0) : -- DFLTCC_RIBM; -+ dfltcc_state->level_mask = env_level_mask; -+ dfltcc_state->block_size = env_block_size; -+ dfltcc_state->block_threshold = env_block_threshold; -+ dfltcc_state->dht_threshold = env_dht_threshold; -+ dfltcc_state->param.ribm = env_ribm; - } - - voidpf ZLIB_INTERNAL dfltcc_alloc_state(strm, items, size) -@@ -787,22 +836,26 @@ void ZLIB_INTERNAL dfltcc_free_window(strm, w) - - /* - Switching between hardware and software compression. -+ - DFLTCC does not support all zlib settings, e.g. generation of non-compressed - blocks or alternative window sizes. When such settings are applied on the - fly with deflateParams, we need to convert between hardware and software - window formats. - */ --int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy) -+int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy, flush) - z_streamp strm; - int level; - int strategy; -+ int *flush; - { - deflate_state FAR *state = (deflate_state FAR *)strm->state; - struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); - struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; - int could_deflate = dfltcc_can_deflate(strm); -- int can_deflate = dfltcc_are_params_ok(level, state->w_bits, strategy, -- dfltcc_state->level_mask); -+ int can_deflate = dfltcc_can_deflate_with_params(strm, -+ level, -+ state->w_bits, -+ strategy); - - if (can_deflate == could_deflate) - /* We continue to work in the same mode - no changes needed */ -@@ -812,8 +865,11 @@ int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy) - /* DFLTCC was not used yet - no changes needed */ - return Z_OK; - -- /* Switching between hardware and software is not implemented */ -- return Z_STREAM_ERROR; -+ /* For now, do not convert between window formats - simply get rid of the -+ * old data instead. -+ */ -+ *flush = Z_FULL_FLUSH; -+ return Z_OK; - } - - /* -diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h -index a129a91..de36784 100644 ---- a/contrib/s390/dfltcc_deflate.h -+++ b/contrib/s390/dfltcc_deflate.h -@@ -9,7 +9,8 @@ int ZLIB_INTERNAL dfltcc_deflate OF((z_streamp strm, - block_state *result)); - int ZLIB_INTERNAL dfltcc_deflate_params OF((z_streamp strm, - int level, -- int strategy)); -+ int strategy, -+ int *flush)); - int ZLIB_INTERNAL dfltcc_deflate_set_dictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dict_length)); -@@ -29,11 +30,14 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary OF((z_streamp strm, - } while (0) - #define DEFLATE_RESET_KEEP_HOOK(strm) \ - dfltcc_reset((strm), sizeof(deflate_state)) --#define DEFLATE_PARAMS_HOOK(strm, level, strategy) \ -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) \ - do { \ - int err; \ - \ -- err = dfltcc_deflate_params((strm), (level), (strategy)); \ -+ err = dfltcc_deflate_params((strm), \ -+ (level), \ -+ (strategy), \ -+ (hook_flush)); \ - if (err == Z_STREAM_ERROR) \ - return err; \ - } while (0) -diff --git a/deflate.c b/deflate.c -index b17a7dd..a80bd3e 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -74,7 +74,7 @@ const char deflate_copyright[] = - #define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) - #define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) - #define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0) --#define DEFLATE_PARAMS_HOOK(strm, level, strategy) do {} while (0) -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0) - #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0) - #define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0 - #define DEFLATE_HOOK(strm, flush, bstate) 0 -@@ -589,6 +589,7 @@ int ZEXPORT deflateParams(strm, level, strategy) - { - deflate_state *s; - compress_func func; -+ int hook_flush = Z_NO_FLUSH; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; -@@ -601,13 +602,14 @@ int ZEXPORT deflateParams(strm, level, strategy) - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } -- DEFLATE_PARAMS_HOOK(strm, level, strategy); -+ DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); - func = configuration_table[s->level].func; - -- if ((strategy != s->strategy || func != configuration_table[level].func) && -- s->high_water) { -+ if ((strategy != s->strategy || func != configuration_table[level].func || -+ hook_flush != Z_NO_FLUSH) && s->high_water) { - /* Flush the last buffer: */ -- int err = deflate(strm, Z_BLOCK); -+ int err = deflate(strm, RANK(hook_flush) > RANK(Z_BLOCK) ? -+ hook_flush : Z_BLOCK); - if (err == Z_STREAM_ERROR) - return err; - if (strm->avail_out == 0) -@@ -1065,7 +1067,6 @@ int ZEXPORT deflate (strm, flush) - } - - if (flush != Z_FINISH) return Z_OK; -- if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ - #ifdef GZIP -@@ -1081,7 +1082,7 @@ int ZEXPORT deflate (strm, flush) - } - else - #endif -- { -+ if (s->wrap == 1) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } -@@ -1090,7 +1091,11 @@ int ZEXPORT deflate (strm, flush) - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ -- return s->pending != 0 ? Z_OK : Z_STREAM_END; -+ if (s->pending == 0) { -+ Assert(s->bi_valid == 0, "bi_buf not flushed"); -+ return Z_STREAM_END; -+ } -+ return Z_OK; - } - - /* ========================================================================= */ --- -2.26.0 - diff --git a/zlib-1.2.11-inflateSyncPoint-return-value-fix.patch b/zlib-1.2.11-inflateSyncPoint-return-value-fix.patch deleted file mode 100644 index f9b3756..0000000 --- a/zlib-1.2.11-inflateSyncPoint-return-value-fix.patch +++ /dev/null @@ -1,45 +0,0 @@ -Subject: [PATCH] Fixed inflateSyncPoint() bad return value on z15 - ---- - contrib/s390/dfltcc.h | 4 ++++ - inflate.c | 2 ++ - 2 files changed, 6 insertions(+) - -diff --git a/contrib/s390/dfltcc.h b/contrib/s390/dfltcc.h -index 574e84c..7960626 100644 ---- a/contrib/s390/dfltcc.h -+++ b/contrib/s390/dfltcc.h -@@ -51,5 +51,9 @@ int ZLIB_INTERNAL dfltcc_inflate_disable OF((z_streamp strm)); - do { \ - if (dfltcc_was_inflate_used((strm))) return -(1L << 16); \ - } while (0) -+#define INFLATE_SYNC_POINT_HOOK(strm) \ -+ do { \ -+ if (dfltcc_was_inflate_used((strm))) return Z_STREAM_ERROR; \ -+ } while (0) - - #endif -\ No newline at end of file -diff --git a/inflate.c b/inflate.c -index f77c2ae..596034c 100644 ---- a/inflate.c -+++ b/inflate.c -@@ -100,6 +100,7 @@ - #define INFLATE_NEED_CHECKSUM(strm) 1 - #define INFLATE_NEED_UPDATEWINDOW(strm) 1 - #define INFLATE_MARK_HOOK(strm) do {} while (0) -+#define INFLATE_SYNC_POINT_HOOK(strm) do {} while (0) - #endif - - #ifdef MAKEFIXED -@@ -1483,6 +1484,7 @@ z_streamp strm; - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; -+ INFLATE_SYNC_POINT_HOOK(strm); - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; - } --- -2.26.0 - diff --git a/zlib-1.2.11-permit-deflateParams-change.patch b/zlib-1.2.11-permit-deflateParams-change.patch deleted file mode 100644 index 4f7b0ef..0000000 --- a/zlib-1.2.11-permit-deflateParams-change.patch +++ /dev/null @@ -1,70 +0,0 @@ -From d09bb1ab8ef9bb91457c0ead09589e8807489260 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Thu, 6 Aug 2020 08:09:53 +0200 -Subject: [PATCH] Permit a deflateParams() parameter change. - -This change allows a parameter change even if the input data has -not all been compressed and copied to the application output -buffer, so long as all of the input data has been compressed to -the internal pending output buffer. This also allows an immediate -deflateParams change so long as there have been no deflate calls -since initialization or reset. ---- - deflate.c | 6 +++--- - zlib.h | 11 ++++++----- - 2 files changed, 9 insertions(+), 8 deletions(-) - -diff --git a/deflate.c b/deflate.c -index 9705c1c..f3c9924 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -509,7 +509,7 @@ int ZEXPORT deflateResetKeep (strm) - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : - #endif - adler32(0L, Z_NULL, 0); -- s->last_flush = Z_NO_FLUSH; -+ s->last_flush = -2; - - _tr_init(s); - -@@ -606,13 +606,13 @@ int ZEXPORT deflateParams(strm, level, strategy) - func = configuration_table[s->level].func; - - if ((strategy != s->strategy || func != configuration_table[level].func || -- hook_flush != Z_NO_FLUSH) && s->high_water) { -+ hook_flush != Z_NO_FLUSH) && s->last_flush != -2) { - /* Flush the last buffer: */ - int err = deflate(strm, RANK(hook_flush) > RANK(Z_BLOCK) ? - hook_flush : Z_BLOCK); - if (err == Z_STREAM_ERROR) - return err; -- if (strm->avail_out == 0) -+ if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) - return Z_BUF_ERROR; - } - if (s->level != level) { -diff --git a/zlib.h b/zlib.h -index f09cdaf..001624e 100644 ---- a/zlib.h -+++ b/zlib.h -@@ -712,11 +712,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression approach (which is a function of the level) or the -- strategy is changed, and if any input has been consumed in a previous -- deflate() call, then the input available so far is compressed with the old -- level and strategy using deflate(strm, Z_BLOCK). There are three approaches -- for the compression levels 0, 1..3, and 4..9 respectively. The new level -- and strategy will take effect at the next call of deflate(). -+ strategy is changed, and if there have been any deflate() calls since the -+ state was initialized or reset, then the input available so far is -+ compressed with the old level and strategy using deflate(strm, Z_BLOCK). -+ There are three approaches for the compression levels 0, 1..3, and 4..9 -+ respectively. The new level and strategy will take effect at the next call -+ of deflate(). - - If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does - not have enough output space to complete, then the parameter change will not --- -2.26.0 - diff --git a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-s390x.patch b/zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch similarity index 74% rename from zlib-1.2.11-IBM-Z-hw-accelrated-deflate-s390x.patch rename to zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch index 002a0d5..bf30042 100644 --- a/zlib-1.2.11-IBM-Z-hw-accelrated-deflate-s390x.patch +++ b/zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch @@ -1,9 +1,9 @@ -From 4e65ca20fc242e4a03471558a357d7809adeb9c4 Mon Sep 17 00:00:00 2001 -From: IBM developers -Date: Thu, 1 Aug 2019 09:02:01 +0200 +From e6aed68ff815be74855ec6a19d6ae35065a4adb4 Mon Sep 17 00:00:00 2001 +From: Ilya Leoshkevich +Date: Wed, 18 Jul 2018 13:14:07 +0200 Subject: [PATCH] Add support for IBM Z hardware-accelerated deflate -Future versions of IBM Z mainframes will provide DFLTCC instruction, +IBM Z mainframes starting from version z15 provide DFLTCC instruction, which implements deflate algorithm in hardware with estimated compression and decompression performance orders of magnitude faster than the current zlib and ratio comparable with that of level 1. @@ -11,15 +11,15 @@ than the current zlib and ratio comparable with that of level 1. This patch adds DFLTCC support to zlib. In order to enable it, the following build commands should be used: - $ CFLAGS=-DDFLTCC ./configure - $ make OBJA=dfltcc.o PIC_OBJA=dfltcc.lo + $ ./configure --dfltcc + $ make When built like this, zlib would compress in hardware on level 1, and in software on all other levels. Decompression will always happen in hardware. In order to enable DFLTCC compression for levels 1-6 (i.e. to -make it used by default) one could either add -DDFLTCC_LEVEL_MASK=0x7e -at compile time, or set the environment variable DFLTCC_LEVEL_MASK to -0x7e at run time. +make it used by default) one could either configure with +--dfltcc-level-mask=0x7e or set the environment variable +DFLTCC_LEVEL_MASK to 0x7e at run time. Two DFLTCC compression calls produce the same results only when they both are made on machines of the same generation, and when the @@ -34,15 +34,15 @@ DFLTCC does not support every single zlib feature, in particular: * inflate(Z_BLOCK) and inflate(Z_TREES) * inflateMark() * inflatePrime() - * deflateParams() after the first deflate() call + * inflateSyncPoint() When used, these functions will either switch to software, or, in case this is not possible, gracefully fail. -This patch tries to add DFLTCC support in a least intrusive way. -All SystemZ-specific code was placed into a separate file, but +This patch tries to add DFLTCC support in the least intrusive way. +All SystemZ-specific code is placed into a separate file, but unfortunately there is still a noticeable amount of changes in the -main zlib code. Below is the summary of those changes. +main zlib code. Below is the summary of these changes. DFLTCC takes as arguments a parameter block, an input buffer, an output buffer and a window. Since DFLTCC requires parameter block to be @@ -61,9 +61,12 @@ deflateResetKeep() and inflateResetKeep() now update the DFLTCC parameter block, which is allocated alongside zlib state, using the new DEFLATE_RESET_KEEP_HOOK and INFLATE_RESET_KEEP_HOOK macros. -In order to make unsupported deflateParams(), inflatePrime() and -inflateMark() calls to fail gracefully, the new DEFLATE_PARAMS_HOOK, -INFLATE_PRIME_HOOK and INFLATE_MARK_HOOK macros were introduced. +The new DEFLATE_PARAMS_HOOK switches between hardware and software +deflate implementations when deflateParams() arguments demand this. + +The new INFLATE_PRIME_HOOK, INFLATE_MARK_HOOK and +INFLATE_SYNC_POINT_HOOK macros make the respective unsupported calls +gracefully fail. The algorithm implemented in hardware has different compression ratio than the one implemented in software. In order for deflateBound() to @@ -93,26 +96,30 @@ might be not allocated yet, inflate_ensure_window was factored out of updatewindow and made ZLIB_INTERNAL. --- Makefile.in | 8 + - configure | 13 + + compress.c | 14 +- + configure | 24 + contrib/README.contrib | 4 + - contrib/s390/dfltcc.c | 901 ++++++++++++++++++++++++++++++++++ - contrib/s390/dfltcc.h | 55 +++ - contrib/s390/dfltcc_deflate.h | 50 ++ - deflate.c | 60 ++- + contrib/s390/README.txt | 17 + + contrib/s390/dfltcc.c | 996 ++++++++++++++++++++++++++++++++++ + contrib/s390/dfltcc.h | 81 +++ + contrib/s390/dfltcc_deflate.h | 55 ++ + deflate.c | 81 ++- deflate.h | 12 + gzguts.h | 4 + - inflate.c | 84 +++- + inflate.c | 87 ++- inflate.h | 2 + - test/infcover.c | 2 +- + test/infcover.c | 4 +- test/minigzip.c | 4 + trees.c | 13 +- - 14 files changed, 1161 insertions(+), 51 deletions(-) + zutil.h | 2 + + 17 files changed, 1348 insertions(+), 60 deletions(-) + create mode 100644 contrib/s390/README.txt create mode 100644 contrib/s390/dfltcc.c create mode 100644 contrib/s390/dfltcc.h create mode 100644 contrib/s390/dfltcc_deflate.h diff --git a/Makefile.in b/Makefile.in -index 5a77949..e756e2f 100644 +index fd28bbfbf..66e3a8057 100644 --- a/Makefile.in +++ b/Makefile.in @@ -143,6 +143,14 @@ match.lo: match.S @@ -130,11 +137,70 @@ index 5a77949..e756e2f 100644 example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c +diff --git a/compress.c b/compress.c +index e2db404ab..78fc6568f 100644 +--- a/compress.c ++++ b/compress.c +@@ -5,9 +5,15 @@ + + /* @(#) $Id$ */ + +-#define ZLIB_INTERNAL ++#include "zutil.h" + #include "zlib.h" + ++#ifdef DFLTCC ++# include "contrib/s390/dfltcc.h" ++#else ++#define DEFLATE_BOUND_COMPLEN(source_len) 0 ++#endif ++ + /* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte +@@ -81,6 +87,12 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) + uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; + { ++ uLong complen = DEFLATE_BOUND_COMPLEN(sourceLen); ++ ++ if (complen > 0) ++ /* Architecture-specific code provided an upper bound. */ ++ return complen + ZLIB_WRAPLEN; ++ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; + } diff --git a/configure b/configure -index e974d1f..8fab355 100755 +index 3fa3e8618..cdf0e5b6b 100755 --- a/configure +++ b/configure -@@ -826,6 +826,19 @@ EOF +@@ -115,6 +115,7 @@ case "$1" in + echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log ++ echo ' [--dfltcc] [--dfltcc-level-mask=MASK]' | tee -a configure.log + exit 0 ;; + -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; +@@ -139,6 +140,16 @@ case "$1" in + -w* | --warn) warn=1; shift ;; + -d* | --debug) debug=1; shift ;; + --sanitize) sanitize=1; shift ;; ++ --dfltcc) ++ CFLAGS="$CFLAGS -DDFLTCC" ++ OBJC="$OBJC dfltcc.o" ++ PIC_OBJC="$PIC_OBJC dfltcc.lo" ++ shift ++ ;; ++ --dfltcc-level-mask=*) ++ CFLAGS="$CFLAGS -DDFLTCC_LEVEL_MASK=`echo $1 | sed 's/.*=//'`" ++ shift ++ ;; + *) + echo "unknown option: $1" | tee -a configure.log + echo "$0 --help for help" | tee -a configure.log +@@ -836,6 +847,19 @@ EOF fi fi @@ -143,7 +209,7 @@ index e974d1f..8fab355 100755 +#include +int main() { return 0; } +EOF -+if try ${CC} ${CFLAGS} $test.c; then ++if try $CC -c $CFLAGS $test.c; then + echo "Checking for sys/sdt.h ... Yes." | tee -a configure.log + CFLAGS="$CFLAGS -DHAVE_SYS_SDT_H" + SFLAGS="$SFLAGS -DHAVE_SYS_SDT_H" @@ -155,10 +221,10 @@ index e974d1f..8fab355 100755 echo >> configure.log echo ALL = $ALL >> configure.log diff --git a/contrib/README.contrib b/contrib/README.contrib -index a411d5c..b4d3b18 100644 +index 335e43508..130a28bdb 100644 --- a/contrib/README.contrib +++ b/contrib/README.contrib -@@ -67,6 +67,10 @@ puff/ by Mark Adler +@@ -46,6 +46,10 @@ puff/ by Mark Adler Small, low memory usage inflate. Also serves to provide an unambiguous description of the deflate format. @@ -169,22 +235,47 @@ index a411d5c..b4d3b18 100644 testzlib/ by Gilles Vollant Example of the use of zlib +diff --git a/contrib/s390/README.txt b/contrib/s390/README.txt +new file mode 100644 +index 000000000..48be008bd +--- /dev/null ++++ b/contrib/s390/README.txt +@@ -0,0 +1,17 @@ ++IBM Z mainframes starting from version z15 provide DFLTCC instruction, ++which implements deflate algorithm in hardware with estimated ++compression and decompression performance orders of magnitude faster ++than the current zlib and ratio comparable with that of level 1. ++ ++This directory adds DFLTCC support. In order to enable it, the following ++build commands should be used: ++ ++ $ ./configure --dfltcc ++ $ make ++ ++When built like this, zlib would compress in hardware on level 1, and in ++software on all other levels. Decompression will always happen in ++hardware. In order to enable DFLTCC compression for levels 1-6 (i.e. to ++make it used by default) one could either configure with ++--dfltcc-level-mask=0x7e or set the environment variable ++DFLTCC_LEVEL_MASK to 0x7e at run time. diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c new file mode 100644 -index 0000000..d187796 +index 000000000..fe81bebfe --- /dev/null +++ b/contrib/s390/dfltcc.c -@@ -0,0 +1,901 @@ +@@ -0,0 +1,996 @@ +/* dfltcc.c - SystemZ DEFLATE CONVERSION CALL support. */ + +/* + Use the following commands to build zlib with DFLTCC support: -+ $ CFLAGS=-DDFLTCC ./configure -+ $ make OBJA=dfltcc.o PIC_OBJA=dfltcc.lo ++ ++ $ ./configure --dfltcc ++ $ make +*/ + +#define _GNU_SOURCE +#include ++#include +#include +#include +#include @@ -407,31 +498,28 @@ index 0000000..d187796 +/* + Compress. + */ -+local inline int dfltcc_are_params_ok(int level, -+ uInt window_bits, -+ int strategy, -+ uLong level_mask); -+local inline int dfltcc_are_params_ok(level, window_bits, strategy, level_mask) ++local inline int dfltcc_can_deflate_with_params(z_streamp strm, ++ int level, ++ uInt window_bits, ++ int strategy); ++local inline int dfltcc_can_deflate_with_params(strm, ++ level, ++ window_bits, ++ strategy) ++ z_streamp strm; + int level; + uInt window_bits; + int strategy; -+ uLong level_mask; -+{ -+ return (level_mask & (1 << level)) != 0 && -+ (window_bits == HB_BITS) && -+ (strategy == Z_FIXED || strategy == Z_DEFAULT_STRATEGY); -+} -+ -+ -+int ZLIB_INTERNAL dfltcc_can_deflate(strm) -+ z_streamp strm; +{ + deflate_state FAR *state = (deflate_state FAR *)strm->state; + struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); + + /* Unsupported compression settings */ -+ if (!dfltcc_are_params_ok(state->level, state->w_bits, state->strategy, -+ dfltcc_state->level_mask)) ++ if ((dfltcc_state->level_mask & (1 << level)) == 0) ++ return 0; ++ if (window_bits != HB_BITS) ++ return 0; ++ if (strategy != Z_FIXED && strategy != Z_DEFAULT_STRATEGY) + return 0; + + /* Unsupported hardware */ @@ -443,6 +531,17 @@ index 0000000..d187796 + return 1; +} + ++int ZLIB_INTERNAL dfltcc_can_deflate(strm) ++ z_streamp strm; ++{ ++ deflate_state FAR *state = (deflate_state FAR *)strm->state; ++ ++ return dfltcc_can_deflate_with_params(strm, ++ state->level, ++ state->w_bits, ++ state->strategy); ++} ++ +local void dfltcc_gdht OF((z_streamp strm)); +local void dfltcc_gdht(strm) + z_streamp strm; @@ -518,31 +617,38 @@ index 0000000..d187796 + int soft_bcc; + int no_flush; + -+ if (!dfltcc_can_deflate(strm)) ++ if (!dfltcc_can_deflate(strm)) { ++ /* Clear history. */ ++ if (flush == Z_FULL_FLUSH) ++ param->hl = 0; + return 0; ++ } + +again: + masked_avail_in = 0; + soft_bcc = 0; + no_flush = flush == Z_NO_FLUSH; + -+ /* Trailing empty block. Switch to software, except when Continuation Flag -+ * is set, which means that DFLTCC has buffered some output in the -+ * parameter block and needs to be called again in order to flush it. ++ /* No input data. Return, except when Continuation Flag is set, which means ++ * that DFLTCC has buffered some output in the parameter block and needs to ++ * be called again in order to flush it. + */ -+ if (flush == Z_FINISH && strm->avail_in == 0 && !param->cf) { -+ if (param->bcf) { -+ /* A block is still open, and the hardware does not support closing -+ * blocks without adding data. Thus, close it manually. -+ */ ++ if (strm->avail_in == 0 && !param->cf) { ++ /* A block is still open, and the hardware does not support closing ++ * blocks without adding data. Thus, close it manually. ++ */ ++ if (!no_flush && param->bcf) { + send_eobs(strm, param); + param->bcf = 0; + } -+ return 0; -+ } -+ -+ if (strm->avail_in == 0 && !param->cf) { -+ *result = need_more; ++ /* Let one of deflate_* functions write a trailing empty block. */ ++ if (flush == Z_FINISH) ++ return 0; ++ /* Clear history. */ ++ if (flush == Z_FULL_FLUSH) ++ param->hl = 0; ++ /* Trigger block post-processing if necessary. */ ++ *result = no_flush ? need_more : block_done; + return 1; + } + @@ -569,13 +675,18 @@ index 0000000..d187796 + param->bcf = 0; + dfltcc_state->block_threshold = + strm->total_in + dfltcc_state->block_size; -+ if (strm->avail_out == 0) { -+ *result = need_more; -+ return 1; -+ } + } + } + ++ /* No space for compressed data. If we proceed, dfltcc_cmpr() will return ++ * DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still ++ * set BCF=1, which is wrong. Avoid complications and return early. ++ */ ++ if (strm->avail_out == 0) { ++ *result = need_more; ++ return 1; ++ } ++ + /* The caller gave us too much data. Pass only one block worth of + * uncompressed data to DFLTCC and mask the rest, so that on the next + * iteration we start a new block. @@ -595,7 +706,7 @@ index 0000000..d187796 + param->cvt = state->wrap == 2 ? CVT_CRC32 : CVT_ADLER32; + if (!no_flush) + /* We need to close a block. Always do this in software - when there is -+ * no input data, the hardware will not nohor BCC. */ ++ * no input data, the hardware will not honor BCC. */ + soft_bcc = 1; + if (flush == Z_FINISH && !param->bcf) + /* We are about to open a BFINAL block, set Block Header Final bit @@ -610,8 +721,8 @@ index 0000000..d187796 + param->sbb = (unsigned int)state->bi_valid; + if (param->sbb > 0) + *strm->next_out = (Bytef)state->bi_buf; -+ if (param->hl) -+ param->nt = 0; /* Honor history */ ++ /* Honor history and check value */ ++ param->nt = 0; + param->cv = state->wrap == 2 ? ZSWAP32(strm->adler) : strm->adler; + + /* When opening a block, choose a Huffman-Table Type */ @@ -819,60 +930,128 @@ index 0000000..d187796 + return 0; +} + ++local int env_dfltcc_disabled; ++local int env_source_date_epoch; ++local unsigned long env_level_mask; ++local unsigned long env_block_size; ++local unsigned long env_block_threshold; ++local unsigned long env_dht_threshold; ++local unsigned long env_ribm; ++local uint64_t cpu_facilities[(DFLTCC_FACILITY / 64) + 1]; ++local struct dfltcc_qaf_param cpu_af __attribute__((aligned(8))); ++ ++local inline int is_dfltcc_enabled OF((void)); ++local inline int is_dfltcc_enabled(void) ++{ ++ if (env_dfltcc_disabled) ++ /* User has explicitly disabled DFLTCC. */ ++ return 0; ++ ++ return is_bit_set((const char *)cpu_facilities, DFLTCC_FACILITY); ++} ++ ++local unsigned long xstrtoul OF((const char *s, unsigned long _default)); ++local unsigned long xstrtoul(s, _default) ++ const char *s; ++ unsigned long _default; ++{ ++ char *endptr; ++ unsigned long result; ++ ++ if (!(s && *s)) ++ return _default; ++ errno = 0; ++ result = strtoul(s, &endptr, 0); ++ return (errno || *endptr) ? _default : result; ++} ++ ++__attribute__((constructor)) local void init_globals OF((void)); ++__attribute__((constructor)) local void init_globals(void) ++{ ++ const char *endptr; ++ const char *env; ++ register char r0 __asm__("r0"); ++ ++ env = secure_getenv("DFLTCC"); ++ env_dfltcc_disabled = env && !strcmp(env, "0"); ++ ++ env = secure_getenv("SOURCE_DATE_EPOCH"); ++ env_source_date_epoch = !!env; ++ ++#ifndef DFLTCC_LEVEL_MASK ++#define DFLTCC_LEVEL_MASK 0x2 ++#endif ++ env_level_mask = xstrtoul(secure_getenv("DFLTCC_LEVEL_MASK"), ++ DFLTCC_LEVEL_MASK); ++ ++#ifndef DFLTCC_BLOCK_SIZE ++#define DFLTCC_BLOCK_SIZE 1048576 ++#endif ++ env_block_size = xstrtoul(secure_getenv("DFLTCC_BLOCK_SIZE"), ++ DFLTCC_BLOCK_SIZE); ++ ++#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE ++#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 ++#endif ++ env_block_threshold = xstrtoul(secure_getenv("DFLTCC_FIRST_FHT_BLOCK_SIZE"), ++ DFLTCC_FIRST_FHT_BLOCK_SIZE); ++ ++#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE ++#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 ++#endif ++ env_dht_threshold = xstrtoul(secure_getenv("DFLTCC_DHT_MIN_SAMPLE_SIZE"), ++ DFLTCC_DHT_MIN_SAMPLE_SIZE); ++ ++#ifndef DFLTCC_RIBM ++#define DFLTCC_RIBM 0 ++#endif ++ env_ribm = xstrtoul(secure_getenv("DFLTCC_RIBM"), DFLTCC_RIBM); ++ ++ memset(cpu_facilities, 0, sizeof(cpu_facilities)); ++ r0 = sizeof(cpu_facilities) / sizeof(cpu_facilities[0]) - 1; ++ /* STFLE is supported since z9-109 and only in z/Architecture mode. When ++ * compiling with -m31, gcc defaults to ESA mode, however, since the kernel ++ * is 64-bit, it's always z/Architecture mode at runtime. ++ */ ++ __asm__ volatile( ++#ifndef __clang__ ++ ".machinemode push\n" ++ ".machinemode zarch\n" ++#endif ++ "stfle %[facilities]\n" ++#ifndef __clang__ ++ ".machinemode pop\n" ++#endif ++ : [facilities] "=Q" (cpu_facilities) ++ , [r0] "+r" (r0) ++ : ++ : "cc"); ++ ++ /* Initialize available functions */ ++ if (is_dfltcc_enabled()) ++ dfltcc(DFLTCC_QAF, &cpu_af, NULL, NULL, NULL, NULL, NULL); ++ else ++ memset(&cpu_af, 0, sizeof(cpu_af)); ++} ++ +/* + Memory management. ++ + DFLTCC requires parameter blocks and window to be aligned. zlib allows + users to specify their own allocation functions, so using e.g. + `posix_memalign' is not an option. Thus, we overallocate and take the + aligned portion of the buffer. +*/ -+local inline int is_dfltcc_enabled OF((void)); -+local inline int is_dfltcc_enabled(void) -+{ -+ const char *env; -+ uint64_t facilities[(DFLTCC_FACILITY / 64) + 1]; -+ register char r0 __asm__("r0"); -+ -+ env = secure_getenv("DFLTCC"); -+ if (env && !strcmp(env, "0")) -+ /* User has explicitly disabled DFLTCC. */ -+ return 0; -+ -+ memset(facilities, 0, sizeof(facilities)); -+ r0 = sizeof(facilities) / sizeof(facilities[0]) - 1; -+ /* STFLE is supported since z9-109 and only in z/Architecture mode. When -+ * compiling with -m31, gcc defaults to ESA mode, however, since the kernel -+ * is 64-bit, it's always z/Architecture mode at runtime. -+ */ -+ __asm__ volatile(".machinemode push\n" -+ ".machinemode zarch\n" -+ "stfle %[facilities]\n" -+ ".machinemode pop\n" -+ : [facilities] "=Q" (facilities) -+ , [r0] "+r" (r0) -+ : -+ : "cc"); -+ return is_bit_set((const char *)facilities, DFLTCC_FACILITY); -+} -+ +void ZLIB_INTERNAL dfltcc_reset(strm, size) + z_streamp strm; + uInt size; +{ + struct dfltcc_state *dfltcc_state = + (struct dfltcc_state *)((char FAR *)strm->state + ALIGN_UP(size, 8)); -+ struct dfltcc_qaf_param *param = -+ (struct dfltcc_qaf_param *)&dfltcc_state->param; -+ const char *s; + -+ /* Initialize available functions */ -+ if (is_dfltcc_enabled()) { -+ dfltcc(DFLTCC_QAF, param, NULL, NULL, NULL, NULL, NULL); -+ memmove(&dfltcc_state->af, param, sizeof(dfltcc_state->af)); -+ } else -+ memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af)); ++ memcpy(&dfltcc_state->af, &cpu_af, sizeof(dfltcc_state->af)); + -+ if (secure_getenv("SOURCE_DATE_EPOCH")) ++ if (env_source_date_epoch) + /* User needs reproducible results, but the output of DFLTCC_CMPR + * depends on buffers' page offsets. + */ @@ -883,36 +1062,11 @@ index 0000000..d187796 + dfltcc_state->param.nt = 1; + + /* Initialize tuning parameters */ -+#ifndef DFLTCC_LEVEL_MASK -+#define DFLTCC_LEVEL_MASK 0x2 -+#endif -+ s = secure_getenv("DFLTCC_LEVEL_MASK"); -+ dfltcc_state->level_mask = (s && *s) ? strtoul(s, NULL, 0) : -+ DFLTCC_LEVEL_MASK; -+#ifndef DFLTCC_BLOCK_SIZE -+#define DFLTCC_BLOCK_SIZE 1048576 -+#endif -+ s = secure_getenv("DFLTCC_BLOCK_SIZE"); -+ dfltcc_state->block_size = (s && *s) ? strtoul(s, NULL, 0) : -+ DFLTCC_BLOCK_SIZE; -+#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE -+#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 -+#endif -+ s = secure_getenv("DFLTCC_FIRST_FHT_BLOCK_SIZE"); -+ dfltcc_state->block_threshold = (s && *s) ? strtoul(s, NULL, 0) : -+ DFLTCC_FIRST_FHT_BLOCK_SIZE; -+#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE -+#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 -+#endif -+ s = secure_getenv("DFLTCC_DHT_MIN_SAMPLE_SIZE"); -+ dfltcc_state->dht_threshold = (s && *s) ? strtoul(s, NULL, 0) : -+ DFLTCC_DHT_MIN_SAMPLE_SIZE; -+#ifndef DFLTCC_RIBM -+#define DFLTCC_RIBM 0 -+#endif -+ s = secure_getenv("DFLTCC_RIBM"); -+ dfltcc_state->param.ribm = (s && *s) ? strtoul(s, NULL, 0) : -+ DFLTCC_RIBM; ++ dfltcc_state->level_mask = env_level_mask; ++ dfltcc_state->block_size = env_block_size; ++ dfltcc_state->block_threshold = env_block_threshold; ++ dfltcc_state->dht_threshold = env_dht_threshold; ++ dfltcc_state->param.ribm = env_ribm; +} + +voidpf ZLIB_INTERNAL dfltcc_alloc_state(strm, items, size) @@ -964,22 +1118,26 @@ index 0000000..d187796 + +/* + Switching between hardware and software compression. ++ + DFLTCC does not support all zlib settings, e.g. generation of non-compressed + blocks or alternative window sizes. When such settings are applied on the + fly with deflateParams, we need to convert between hardware and software + window formats. +*/ -+int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy) ++int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy, flush) + z_streamp strm; + int level; + int strategy; ++ int *flush; +{ + deflate_state FAR *state = (deflate_state FAR *)strm->state; + struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); + struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; + int could_deflate = dfltcc_can_deflate(strm); -+ int can_deflate = dfltcc_are_params_ok(level, state->w_bits, strategy, -+ dfltcc_state->level_mask); ++ int can_deflate = dfltcc_can_deflate_with_params(strm, ++ level, ++ state->w_bits, ++ strategy); + + if (can_deflate == could_deflate) + /* We continue to work in the same mode - no changes needed */ @@ -989,8 +1147,33 @@ index 0000000..d187796 + /* DFLTCC was not used yet - no changes needed */ + return Z_OK; + -+ /* Switching between hardware and software is not implemented */ -+ return Z_STREAM_ERROR; ++ /* For now, do not convert between window formats - simply get rid of the ++ * old data instead. ++ */ ++ *flush = Z_FULL_FLUSH; ++ return Z_OK; ++} ++ ++int ZLIB_INTERNAL dfltcc_deflate_done(strm, flush) ++ z_streamp strm; ++ int flush; ++{ ++ deflate_state FAR *state = (deflate_state FAR *)strm->state; ++ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); ++ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; ++ ++ /* When deflate(Z_FULL_FLUSH) is called with small avail_out, it might ++ * close the block without resetting the compression state. Detect this ++ * situation and return that deflation is not done. ++ */ ++ if (flush == Z_FULL_FLUSH && strm->avail_out == 0) ++ return 0; ++ ++ /* Return that deflation is not done if DFLTCC is used and either it ++ * buffered some data (Continuation Flag is set), or has not written EOBS ++ * yet (Block-Continuation Flag is set). ++ */ ++ return !dfltcc_can_deflate(strm) || (!param->cf && !param->bcf); +} + +/* @@ -1046,6 +1229,7 @@ index 0000000..d187796 + + append_history(param, state->window, dictionary, dict_length); + state->strstart = 1; /* Add FDICT to zlib header */ ++ state->block_start = state->strstart; /* Make deflate_stored happy */ + return Z_OK; +} + @@ -1076,13 +1260,12 @@ index 0000000..d187796 + *dict_length = param->hl; + return Z_OK; +} -\ No newline at end of file diff --git a/contrib/s390/dfltcc.h b/contrib/s390/dfltcc.h new file mode 100644 -index 0000000..574e84c +index 000000000..da26612ca --- /dev/null +++ b/contrib/s390/dfltcc.h -@@ -0,0 +1,55 @@ +@@ -0,0 +1,81 @@ +#ifndef DFLTCC_H +#define DFLTCC_H + @@ -1097,6 +1280,28 @@ index 0000000..574e84c +voidpf ZLIB_INTERNAL dfltcc_alloc_window OF((z_streamp strm, uInt items, + uInt size)); +void ZLIB_INTERNAL dfltcc_free_window OF((z_streamp strm, voidpf w)); ++#define DFLTCC_BLOCK_HEADER_BITS 3 ++#define DFLTCC_HLITS_COUNT_BITS 5 ++#define DFLTCC_HDISTS_COUNT_BITS 5 ++#define DFLTCC_HCLENS_COUNT_BITS 4 ++#define DFLTCC_MAX_HCLENS 19 ++#define DFLTCC_HCLEN_BITS 3 ++#define DFLTCC_MAX_HLITS 286 ++#define DFLTCC_MAX_HDISTS 30 ++#define DFLTCC_MAX_HLIT_HDIST_BITS 7 ++#define DFLTCC_MAX_SYMBOL_BITS 16 ++#define DFLTCC_MAX_EOBS_BITS 15 ++#define DFLTCC_MAX_PADDING_BITS 7 ++#define DEFLATE_BOUND_COMPLEN(source_len) \ ++ ((DFLTCC_BLOCK_HEADER_BITS + \ ++ DFLTCC_HLITS_COUNT_BITS + \ ++ DFLTCC_HDISTS_COUNT_BITS + \ ++ DFLTCC_HCLENS_COUNT_BITS + \ ++ DFLTCC_MAX_HCLENS * DFLTCC_HCLEN_BITS + \ ++ (DFLTCC_MAX_HLITS + DFLTCC_MAX_HDISTS) * DFLTCC_MAX_HLIT_HDIST_BITS + \ ++ (source_len) * DFLTCC_MAX_SYMBOL_BITS + \ ++ DFLTCC_MAX_EOBS_BITS + \ ++ DFLTCC_MAX_PADDING_BITS) >> 3) +int ZLIB_INTERNAL dfltcc_can_inflate OF((z_streamp strm)); +typedef enum { + DFLTCC_INFLATE_CONTINUE, @@ -1136,15 +1341,18 @@ index 0000000..574e84c + do { \ + if (dfltcc_was_inflate_used((strm))) return -(1L << 16); \ + } while (0) ++#define INFLATE_SYNC_POINT_HOOK(strm) \ ++ do { \ ++ if (dfltcc_was_inflate_used((strm))) return Z_STREAM_ERROR; \ ++ } while (0) + +#endif -\ No newline at end of file diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h new file mode 100644 -index 0000000..a129a91 +index 000000000..46acfc550 --- /dev/null +++ b/contrib/s390/dfltcc_deflate.h -@@ -0,0 +1,50 @@ +@@ -0,0 +1,55 @@ +#ifndef DFLTCC_DEFLATE_H +#define DFLTCC_DEFLATE_H + @@ -1156,7 +1364,9 @@ index 0000000..a129a91 + block_state *result)); +int ZLIB_INTERNAL dfltcc_deflate_params OF((z_streamp strm, + int level, -+ int strategy)); ++ int strategy, ++ int *flush)); ++int ZLIB_INTERNAL dfltcc_deflate_done OF((z_streamp strm, int flush)); +int ZLIB_INTERNAL dfltcc_deflate_set_dictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dict_length)); @@ -1176,31 +1386,33 @@ index 0000000..a129a91 + } while (0) +#define DEFLATE_RESET_KEEP_HOOK(strm) \ + dfltcc_reset((strm), sizeof(deflate_state)) -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy) \ ++#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) \ + do { \ + int err; \ +\ -+ err = dfltcc_deflate_params((strm), (level), (strategy)); \ ++ err = dfltcc_deflate_params((strm), \ ++ (level), \ ++ (strategy), \ ++ (hook_flush)); \ + if (err == Z_STREAM_ERROR) \ + return err; \ + } while (0) ++#define DEFLATE_DONE dfltcc_deflate_done +#define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ + do { \ + if (dfltcc_can_deflate((strm))) \ -+ (complen) = (3 + 5 + 5 + 4 + 19 * 3 + (286 + 30) * 7 + \ -+ (source_len) * 16 + 15 + 7) >> 3; \ ++ (complen) = DEFLATE_BOUND_COMPLEN(source_len); \ + } while (0) +#define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) (dfltcc_can_deflate((strm))) +#define DEFLATE_HOOK dfltcc_deflate +#define DEFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_deflate((strm))) + +#endif -\ No newline at end of file diff --git a/deflate.c b/deflate.c -index 1ec7614..089285a 100644 +index 6ac891d7d..afca18ce2 100644 --- a/deflate.c +++ b/deflate.c -@@ -61,15 +61,29 @@ const char deflate_copyright[] = +@@ -61,15 +61,30 @@ const char deflate_copyright[] = */ /* =========================================================================== @@ -1224,7 +1436,8 @@ index 1ec7614..089285a 100644 +#define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) +#define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) +#define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0) -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy) do {} while (0) ++#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0) ++#define DEFLATE_DONE(strm, flush) 1 +#define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0) +#define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0 +#define DEFLATE_HOOK(strm, flush, bstate) 0 @@ -1237,7 +1450,7 @@ index 1ec7614..089285a 100644 typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ -@@ -85,7 +99,6 @@ local block_state deflate_rle OF((deflate_state *s, int flush)); +@@ -85,7 +100,6 @@ local block_state deflate_rle OF((deflate_state *s, int flush)); local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); @@ -1245,7 +1458,7 @@ index 1ec7614..089285a 100644 local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV # pragma message("Assembler code may have bugs -- use at your own risk") -@@ -301,7 +314,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, +@@ -299,7 +313,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ @@ -1254,7 +1467,7 @@ index 1ec7614..089285a 100644 if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; -@@ -318,7 +331,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, +@@ -316,7 +330,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); @@ -1263,7 +1476,7 @@ index 1ec7614..089285a 100644 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); -@@ -394,6 +407,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) +@@ -434,6 +448,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) /* when using zlib wrappers, compute Adler-32 for provided dictionary */ if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); @@ -1271,7 +1484,7 @@ index 1ec7614..089285a 100644 s->wrap = 0; /* avoid computing Adler-32 in read_buf */ /* if dictionary would fill window, just replace the history */ -@@ -452,6 +466,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) +@@ -492,6 +507,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1279,7 +1492,7 @@ index 1ec7614..089285a 100644 s = strm->state; len = s->strstart + s->lookahead; if (len > s->w_size) -@@ -498,6 +513,8 @@ int ZEXPORT deflateResetKeep (strm) +@@ -538,6 +554,8 @@ int ZEXPORT deflateResetKeep (strm) _tr_init(s); @@ -1288,15 +1501,38 @@ index 1ec7614..089285a 100644 return Z_OK; } -@@ -584,6 +601,7 @@ int ZEXPORT deflateParams(strm, level, strategy) +@@ -613,6 +631,7 @@ int ZEXPORT deflateParams(strm, level, strategy) + { + deflate_state *s; + compress_func func; ++ int hook_flush = Z_NO_FLUSH; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; +@@ -625,15 +644,18 @@ int ZEXPORT deflateParams(strm, level, strategy) if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } -+ DEFLATE_PARAMS_HOOK(strm, level, strategy); ++ DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); func = configuration_table[s->level].func; - if ((strategy != s->strategy || func != configuration_table[level].func) && -@@ -659,6 +677,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) +- if ((strategy != s->strategy || func != configuration_table[level].func) && +- s->last_flush != -2) { ++ if (((strategy != s->strategy || func != configuration_table[level].func) && ++ s->last_flush != -2) || hook_flush != Z_NO_FLUSH) { + /* Flush the last buffer: */ +- int err = deflate(strm, Z_BLOCK); ++ int flush = RANK(hook_flush) > RANK(Z_BLOCK) ? hook_flush : Z_BLOCK; ++ int err = deflate(strm, flush); + if (err == Z_STREAM_ERROR) + return err; +- if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) ++ if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead || ++ !DEFLATE_DONE(strm, flush)) + return Z_BUF_ERROR; + } + if (s->level != level) { +@@ -700,6 +722,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; @@ -1304,7 +1540,7 @@ index 1ec7614..089285a 100644 /* if can't get parameters, return conservative bound plus zlib wrapper */ if (deflateStateCheck(strm)) -@@ -700,7 +719,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) +@@ -741,7 +764,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) } /* if not default parameters, return conservative bound */ @@ -1314,7 +1550,7 @@ index 1ec7614..089285a 100644 return complen + wraplen; /* default settings: return tight bound for that case */ -@@ -727,7 +747,7 @@ local void putShortMSB (s, b) +@@ -768,7 +792,7 @@ local void putShortMSB (s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ @@ -1323,7 +1559,7 @@ index 1ec7614..089285a 100644 z_streamp strm; { unsigned len; -@@ -997,7 +1017,8 @@ int ZEXPORT deflate (strm, flush) +@@ -1040,7 +1064,8 @@ int ZEXPORT deflate (strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; @@ -1333,7 +1569,37 @@ index 1ec7614..089285a 100644 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush); -@@ -1086,9 +1107,9 @@ int ZEXPORT deflateEnd (strm) +@@ -1087,7 +1112,6 @@ int ZEXPORT deflate (strm, flush) + } + + if (flush != Z_FINISH) return Z_OK; +- if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ + #ifdef GZIP +@@ -1103,7 +1127,7 @@ int ZEXPORT deflate (strm, flush) + } + else + #endif +- { ++ if (s->wrap == 1) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } +@@ -1112,7 +1136,11 @@ int ZEXPORT deflate (strm, flush) + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ +- return s->pending != 0 ? Z_OK : Z_STREAM_END; ++ if (s->pending == 0) { ++ Assert(s->bi_valid == 0, "bi_buf not flushed"); ++ return Z_STREAM_END; ++ } ++ return Z_OK; + } + + /* ========================================================================= */ +@@ -1129,9 +1157,9 @@ int ZEXPORT deflateEnd (strm) TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); @@ -1345,7 +1611,7 @@ index 1ec7614..089285a 100644 strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -@@ -1119,13 +1140,13 @@ int ZEXPORT deflateCopy (dest, source) +@@ -1161,13 +1189,13 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); @@ -1361,22 +1627,22 @@ index 1ec7614..089285a 100644 + ds->window = (Bytef *) ZALLOC_WINDOW(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); -@@ -1174,7 +1195,8 @@ local unsigned read_buf(strm, buf, size) + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); +@@ -1214,7 +1242,8 @@ local unsigned read_buf(strm, buf, size) strm->avail_in -= len; zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { -+ if (!DEFLATE_NEED_CHECKSUM(strm)) {} ++ if (!DEFLATE_NEED_CHECKSUM(strm)) {} + else if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP diff --git a/deflate.h b/deflate.h -index 23ecdd3..821a4b9 100644 +index 1a06cd5f2..f92750ca6 100644 --- a/deflate.h +++ b/deflate.h -@@ -304,6 +304,7 @@ void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +@@ -299,6 +299,7 @@ void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); @@ -1384,7 +1650,7 @@ index 23ecdd3..821a4b9 100644 #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -@@ -346,4 +347,15 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, +@@ -343,4 +344,15 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, flush = _tr_tally(s, distance, length) #endif @@ -1401,7 +1667,7 @@ index 23ecdd3..821a4b9 100644 + #endif /* DEFLATE_H */ diff --git a/gzguts.h b/gzguts.h -index 990a4d2..3218395 100644 +index 57faf3716..581f2b631 100644 --- a/gzguts.h +++ b/gzguts.h @@ -153,7 +153,11 @@ @@ -1417,10 +1683,10 @@ index 990a4d2..3218395 100644 /* gzip modes, also provide a little integrity check on the passed structure */ #define GZ_NONE 0 diff --git a/inflate.c b/inflate.c -index ac333e8..f77c2ae 100644 +index 7be8c6366..a0e14e292 100644 --- a/inflate.c +++ b/inflate.c -@@ -85,6 +85,23 @@ +@@ -85,6 +85,24 @@ #include "inflate.h" #include "inffast.h" @@ -1439,12 +1705,13 @@ index ac333e8..f77c2ae 100644 +#define INFLATE_NEED_CHECKSUM(strm) 1 +#define INFLATE_NEED_UPDATEWINDOW(strm) 1 +#define INFLATE_MARK_HOOK(strm) do {} while (0) ++#define INFLATE_SYNC_POINT_HOOK(strm) do {} while (0) +#endif + #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED -@@ -137,6 +154,7 @@ z_streamp strm; +@@ -138,6 +156,7 @@ z_streamp strm; state->lencode = state->distcode = state->next = state->codes; state->sane = 1; state->back = -1; @@ -1452,7 +1719,7 @@ index ac333e8..f77c2ae 100644 Tracev((stderr, "inflate: reset\n")); return Z_OK; } -@@ -182,7 +200,7 @@ int windowBits; +@@ -183,7 +202,7 @@ int windowBits; if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { @@ -1461,7 +1728,7 @@ index ac333e8..f77c2ae 100644 state->window = Z_NULL; } -@@ -221,7 +239,7 @@ int stream_size; +@@ -222,7 +241,7 @@ int stream_size; strm->zfree = zcfree; #endif state = (struct inflate_state FAR *) @@ -1470,7 +1737,7 @@ index ac333e8..f77c2ae 100644 if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; -@@ -230,7 +248,7 @@ int stream_size; +@@ -231,7 +250,7 @@ int stream_size; state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { @@ -1479,7 +1746,7 @@ index ac333e8..f77c2ae 100644 strm->state = Z_NULL; } return ret; -@@ -252,6 +270,7 @@ int value; +@@ -253,6 +272,7 @@ int value; struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1487,7 +1754,7 @@ index ac333e8..f77c2ae 100644 state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; -@@ -379,6 +398,27 @@ void makefixed() +@@ -380,6 +400,27 @@ void makefixed() } #endif /* MAKEFIXED */ @@ -1515,7 +1782,7 @@ index ac333e8..f77c2ae 100644 /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called -@@ -403,20 +443,7 @@ unsigned copy; +@@ -404,20 +445,7 @@ unsigned copy; state = (struct inflate_state FAR *)strm->state; @@ -1537,45 +1804,45 @@ index ac333e8..f77c2ae 100644 /* copy state->wsize or less output bytes into the circular window */ if (copy >= state->wsize) { -@@ -849,6 +876,7 @@ int flush; - case TYPE: +@@ -860,6 +888,7 @@ int flush; if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ case TYPEDO: + INFLATE_TYPEDO_HOOK(strm, flush); if (state->last) { BYTEBITS(); state->mode = CHECK; -@@ -1200,7 +1228,7 @@ int flush; +@@ -1221,7 +1250,7 @@ int flush; out -= left; strm->total_out += out; state->total += out; - if ((state->wrap & 4) && out) + if (INFLATE_NEED_CHECKSUM(strm) && (state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, put - out, out); + UPDATE_CHECK(state->check, put - out, out); out = left; -@@ -1252,8 +1280,9 @@ int flush; +@@ -1276,8 +1305,9 @@ int flush; */ inf_leave: RESTORE(); - if (state->wsize || (out != strm->avail_out && state->mode < BAD && - (state->mode < CHECK || flush != Z_FINISH))) + if (INFLATE_NEED_UPDATEWINDOW(strm) && -+ (state->wsize || (out != strm->avail_out && state->mode < BAD && -+ (state->mode < CHECK || flush != Z_FINISH)))) ++ (state->wsize || (out != strm->avail_out && state->mode < BAD && ++ (state->mode < CHECK || flush != Z_FINISH)))) if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; -@@ -1263,7 +1292,7 @@ int flush; +@@ -1287,7 +1317,7 @@ int flush; strm->total_in += in; strm->total_out += out; state->total += out; - if ((state->wrap & 4) && out) + if (INFLATE_NEED_CHECKSUM(strm) && (state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); + UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + -@@ -1281,8 +1310,8 @@ z_streamp strm; +@@ -1305,8 +1335,8 @@ z_streamp strm; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; @@ -1586,7 +1853,15 @@ index ac333e8..f77c2ae 100644 strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; -@@ -1474,21 +1503,21 @@ z_streamp source; +@@ -1485,6 +1515,7 @@ z_streamp strm; + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; ++ INFLATE_SYNC_POINT_HOOK(strm); + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; + } +@@ -1505,21 +1536,22 @@ z_streamp source; /* allocate space */ copy = (struct inflate_state FAR *) @@ -1597,7 +1872,8 @@ index ac333e8..f77c2ae 100644 if (state->window != Z_NULL) { window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); -+ ZALLOC_WINDOW(source, 1U << state->wbits, sizeof(unsigned char)); ++ ZALLOC_WINDOW(source, 1U << state->wbits, ++ sizeof(unsigned char)); if (window == Z_NULL) { - ZFREE(source, copy); + ZFREE_STATE(source, copy); @@ -1612,7 +1888,7 @@ index ac333e8..f77c2ae 100644 copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { -@@ -1545,6 +1574,7 @@ z_streamp strm; +@@ -1576,6 +1608,7 @@ z_streamp strm; if (inflateStateCheck(strm)) return -(1L << 16); @@ -1621,19 +1897,28 @@ index ac333e8..f77c2ae 100644 return (long)(((unsigned long)((long)state->back)) << 16) + (state->mode == COPY ? state->length : diff --git a/inflate.h b/inflate.h -index a46cce6..7b19617 100644 +index f127b6b1f..519ed3535 100644 --- a/inflate.h +++ b/inflate.h -@@ -123,3 +123,5 @@ struct inflate_state { +@@ -124,3 +124,5 @@ struct inflate_state { int back; /* bits back of last unprocessed length/lit */ unsigned was; /* initial length of match */ }; + +int ZLIB_INTERNAL inflate_ensure_window OF((struct inflate_state *state)); diff --git a/test/infcover.c b/test/infcover.c -index 2be0164..a34cd17 100644 +index 2be01646c..a208219dc 100644 --- a/test/infcover.c +++ b/test/infcover.c +@@ -373,7 +373,7 @@ local void cover_support(void) + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; +- ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); ++ ret = inflateInit_(&strm, &ZLIB_VERSION[1], (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + @@ -444,7 +444,7 @@ local void cover_wrap(void) } @@ -1644,7 +1929,7 @@ index 2be0164..a34cd17 100644 static unsigned int next = 0; static unsigned char dat[] = {0x63, 0, 2, 0}; diff --git a/test/minigzip.c b/test/minigzip.c -index e22fb08..4b5f4ef 100644 +index e22fb08c0..4b5f4efed 100644 --- a/test/minigzip.c +++ b/test/minigzip.c @@ -132,7 +132,11 @@ static void pwinerror (s) @@ -1660,14 +1945,14 @@ index e22fb08..4b5f4ef 100644 #ifdef MAXSEG_64K diff --git a/trees.c b/trees.c -index 50cf4b4..ad51207 100644 +index 8b438cce4..84c1b4732 100644 --- a/trees.c +++ b/trees.c @@ -149,8 +149,6 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, local void compress_block OF((deflate_state *s, const ct_data *ltree, const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); --local unsigned bi_reverse OF((unsigned value, int length)); +-local unsigned bi_reverse OF((unsigned code, int len)); -local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -1686,7 +1971,7 @@ index 50cf4b4..ad51207 100644 /* the arguments must not have side effects */ -@@ -1155,7 +1160,7 @@ local int detect_data_type(s) +@@ -1134,7 +1139,7 @@ local int detect_data_type(s) * method would use a table) * IN assertion: 1 <= len <= 15 */ @@ -1695,7 +1980,7 @@ index 50cf4b4..ad51207 100644 unsigned code; /* the value to invert */ int len; /* its bit length */ { -@@ -1187,7 +1192,7 @@ local void bi_flush(s) +@@ -1166,7 +1171,7 @@ local void bi_flush(s) /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ @@ -1704,6 +1989,16 @@ index 50cf4b4..ad51207 100644 deflate_state *s; { if (s->bi_valid > 8) { --- -2.19.1 - +diff --git a/zutil.h b/zutil.h +index d9a20ae1b..bc83f59d0 100644 +--- a/zutil.h ++++ b/zutil.h +@@ -87,6 +87,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + + #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + ++#define ZLIB_WRAPLEN 6 /* zlib format overhead */ ++ + /* target dependencies */ + + #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) From bddff11ae1ec037439f514136bb8e4843d7ec7f2 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:34:59 +0000 Subject: [PATCH 06/28] [3/6] Unify Power optimization patch Source: https://github.com/mscastanho/zlib/commits/power-optimizations-1.2.12 --- zlib-1.2.11-firefox-crash-fix.patch | 365 -- zlib-1.2.11-optimized-CRC32-framework.patch | 2258 ---------- zlib-1.2.12-power-optimizations.patch | 4363 +++++++++++++++++++ 3 files changed, 4363 insertions(+), 2623 deletions(-) delete mode 100644 zlib-1.2.11-firefox-crash-fix.patch delete mode 100644 zlib-1.2.11-optimized-CRC32-framework.patch create mode 100644 zlib-1.2.12-power-optimizations.patch diff --git a/zlib-1.2.11-firefox-crash-fix.patch b/zlib-1.2.11-firefox-crash-fix.patch deleted file mode 100644 index 27068bb..0000000 --- a/zlib-1.2.11-firefox-crash-fix.patch +++ /dev/null @@ -1,365 +0,0 @@ -From 27a84de4a30cd35f8565937397f6d1205b912818 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Thu, 5 Sep 2019 09:16:35 +0200 -Subject: [PATCH 1/2] fix: power8 crc32 - return 0 with 0 ptr passed - ---- - contrib/power8-crc/vec_crc32.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/contrib/power8-crc/vec_crc32.c b/contrib/power8-crc/vec_crc32.c -index bb2204b..5ce9cd2 100644 ---- a/contrib/power8-crc/vec_crc32.c -+++ b/contrib/power8-crc/vec_crc32.c -@@ -74,6 +74,7 @@ unsigned int CRC32_FUNCTION(unsigned int crc, const unsigned char *p, - unsigned int prealign; - unsigned int tail; - -+ if (p == (const unsigned char *) 0x0) return 0; - #ifdef CRC_XOR - crc ^= 0xffffffff; - #endif --- -2.19.1 - - -From c066ac92982a2ffe5b1e9bd36000058927437bd5 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Thu, 5 Sep 2019 09:36:47 +0200 -Subject: [PATCH 2/2] Add CRC32 tests (crc32_test) - -This commit includes a CRC32 test (crc32_test). This tests are important -since some architectures may want include CPU dependent optimizations for -CRC32 algorithm like using vector instructions and we may want to -validate those. ---- - Makefile.in | 35 +++++--- - test/crc32_test.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 230 insertions(+), 10 deletions(-) - create mode 100644 test/crc32_test.c - -diff --git a/Makefile.in b/Makefile.in -index 40b5cfb..6070dcc 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -75,11 +75,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) - - all: static shared - --static: example$(EXE) minigzip$(EXE) -+static: crc32_test$(EXE) example$(EXE) minigzip$(EXE) - --shared: examplesh$(EXE) minigzipsh$(EXE) -+shared: crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) - --all64: example64$(EXE) minigzip64$(EXE) -+all64: crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) - - check: test - -@@ -87,7 +87,7 @@ test: all teststatic testshared - - teststatic: static - @TMPST=tmpst_$$; \ -- if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ -+ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./crc32_test; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; false; \ -@@ -100,7 +100,7 @@ testshared: shared - DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ - SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - TMPSH=tmpsh_$$; \ -- if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ -+ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./crc32_testsh; then \ - echo ' *** zlib shared test OK ***'; \ - else \ - echo ' *** zlib shared test FAILED ***'; false; \ -@@ -109,7 +109,7 @@ testshared: shared - - test64: all64 - @TMP64=tmp64_$$; \ -- if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ -+ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./crc32_test64; then \ - echo ' *** zlib 64-bit test OK ***'; \ - else \ - echo ' *** zlib 64-bit test FAILED ***'; false; \ -@@ -157,6 +157,12 @@ example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c - -+crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c -+ -+crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c -+ - example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c - -@@ -307,12 +313,21 @@ example$(EXE): example.o $(STATICLIB) - minigzip$(EXE): minigzip.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) - -+crc32_test$(EXE): crc32_test.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ crc32_test.o $(TEST_LDFLAGS) -+ -+crc32_testsh$(EXE): crc32_test.o $(SHAREDLIBV) -+ $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) -+ - examplesh$(EXE): example.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) - - minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) - -+crc32_test64$(EXE): crc32_test64.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) -+ - example64$(EXE): example64.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) - -@@ -382,8 +397,8 @@ zconf: $(SRCDIR)zconf.h.in - mostlyclean: clean - clean: - rm -f *.o *.lo *~ \ -- example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -- example64$(EXE) minigzip64$(EXE) \ -+ crc32_test$(EXE) example$(EXE) minigzip$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -+ crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ - infcover \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o -@@ -407,7 +422,7 @@ tags: - - adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h --compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h -+compress.o crc32_test.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h - crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h - deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -@@ -417,7 +432,7 @@ trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)tr - - adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h --compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h -+compress.lo crc32_test.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h - crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h - deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -diff --git a/test/crc32_test.c b/test/crc32_test.c -new file mode 100644 -index 0000000..5d73128 ---- /dev/null -+++ b/test/crc32_test.c -@@ -0,0 +1,205 @@ -+/* crc32_tes.c -- unit test for crc32 in the zlib compression library -+ * Copyright (C) 1995-2006, 2010, 2011, 2016, 2019 Rogerio Alves -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "zlib.h" -+#include -+ -+#ifdef STDC -+# include -+# include -+#endif -+ -+void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); -+int main OF((void)); -+ -+typedef struct { -+ int line; -+ uLong crc; -+ Byte* buf; -+ int len; -+ uLong expect; -+} crc32_test; -+ -+void test_crc32(crc, buf, len, chk, line) -+ uLong crc; -+ Byte *buf; -+ z_size_t len; -+ uLong chk; -+ int line; -+{ -+ uLong res = crc32(crc, buf, len); -+ if (res != chk) { -+ fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", -+ line, (unsigned int)res, (unsigned int)chk); -+ exit(1); -+ } -+} -+ -+static const crc32_test tests[] = { -+ {__LINE__, 0x0, 0x0, 0, 0x0}, -+ {__LINE__, 0xffffffff, 0x0, 0, 0x0}, -+ {__LINE__, 0x0, 0x0, 255, 0x0}, /* BZ 174799. */ -+ {__LINE__, 0x0, 0x0, 256, 0x0}, -+ {__LINE__, 0x0, 0x0, 257, 0x0}, -+ {__LINE__, 0x0, 0x0, 32767, 0x0}, -+ {__LINE__, 0x0, 0x0, 32768, 0x0}, -+ {__LINE__, 0x0, 0x0, 32769, 0x0}, -+ {__LINE__, 0x0, "", 0, 0x0}, -+ {__LINE__, 0xffffffff, "", 0, 0xffffffff}, -+ {__LINE__, 0x0, "abacus", 6, 0xc3d7115b}, -+ {__LINE__, 0x0, "backlog", 7, 0x269205}, -+ {__LINE__, 0x0, "campfire", 8, 0x22a515f8}, -+ {__LINE__, 0x0, "delta", 5, 0x9643fed9}, -+ {__LINE__, 0x0, "executable", 10, 0xd68eda01}, -+ {__LINE__, 0x0, "file", 4, 0x8c9f3610}, -+ {__LINE__, 0x0, "greatest", 8, 0xc1abd6cd}, -+ {__LINE__, 0x0, "hello", 5, 0x3610a686}, -+ {__LINE__, 0x0, "inverter", 8, 0xc9e962c9}, -+ {__LINE__, 0x0, "jigsaw", 6, 0xce4e3f69}, -+ {__LINE__, 0x0, "karate", 6, 0x890be0e2}, -+ {__LINE__, 0x0, "landscape", 9, 0xc4e0330b}, -+ {__LINE__, 0x0, "machine", 7, 0x1505df84}, -+ {__LINE__, 0x0, "nanometer", 9, 0xd4e19f39}, -+ {__LINE__, 0x0, "oblivion", 8, 0xdae9de77}, -+ {__LINE__, 0x0, "panama", 6, 0x66b8979c}, -+ {__LINE__, 0x0, "quest", 5, 0x4317f817}, -+ {__LINE__, 0x0, "resource", 8, 0xbc91f416}, -+ {__LINE__, 0x0, "secret", 6, 0x5ca2e8e5}, -+ {__LINE__, 0x0, "test", 4, 0xd87f7e0c}, -+ {__LINE__, 0x0, "ultimate", 8, 0x3fc79b0b}, -+ {__LINE__, 0x0, "vector", 6, 0x1b6e485b}, -+ {__LINE__, 0x0, "walrus", 6, 0xbe769b97}, -+ {__LINE__, 0x0, "xeno", 4, 0xe7a06444}, -+ {__LINE__, 0x0, "yelling", 7, 0xfe3944e5}, -+ {__LINE__, 0x0, "zlib", 4, 0x73887d3a}, -+ {__LINE__, 0x0, "4BJD7PocN1VqX0jXVpWB", 20, 0xd487a5a1}, -+ {__LINE__, 0x0, "F1rPWI7XvDs6nAIRx41l", 20, 0x61a0132e}, -+ {__LINE__, 0x0, "ldhKlsVkPFOveXgkGtC2", 20, 0xdf02f76}, -+ {__LINE__, 0x0, "5KKnGOOrs8BvJ35iKTOS", 20, 0x579b2b0a}, -+ {__LINE__, 0x0, "0l1tw7GOcem06Ddu7yn4", 20, 0xf7d16e2d}, -+ {__LINE__, 0x0, "MCr47CjPIn9R1IvE1Tm5", 20, 0x731788f5}, -+ {__LINE__, 0x0, "UcixbzPKTIv0SvILHVdO", 20, 0x7112bb11}, -+ {__LINE__, 0x0, "dGnAyAhRQDsWw0ESou24", 20, 0xf32a0dac}, -+ {__LINE__, 0x0, "di0nvmY9UYMYDh0r45XT", 20, 0x625437bb}, -+ {__LINE__, 0x0, "2XKDwHfAhFsV0RhbqtvH", 20, 0x896930f9}, -+ {__LINE__, 0x0, "ZhrANFIiIvRnqClIVyeD", 20, 0x8579a37}, -+ {__LINE__, 0x0, "v7Q9ehzioTOVeDIZioT1", 20, 0x632aa8e0}, -+ {__LINE__, 0x0, "Yod5hEeKcYqyhfXbhxj2", 20, 0xc829af29}, -+ {__LINE__, 0x0, "GehSWY2ay4uUKhehXYb0", 20, 0x1b08b7e8}, -+ {__LINE__, 0x0, "kwytJmq6UqpflV8Y8GoE", 20, 0x4e33b192}, -+ {__LINE__, 0x0, "70684206568419061514", 20, 0x59a179f0}, -+ {__LINE__, 0x0, "42015093765128581010", 20, 0xcd1013d7}, -+ {__LINE__, 0x0, "88214814356148806939", 20, 0xab927546}, -+ {__LINE__, 0x0, "43472694284527343838", 20, 0x11f3b20c}, -+ {__LINE__, 0x0, "49769333513942933689", 20, 0xd562d4ca}, -+ {__LINE__, 0x0, "54979784887993251199", 20, 0x233395f7}, -+ {__LINE__, 0x0, "58360544869206793220", 20, 0x2d167fd5}, -+ {__LINE__, 0x0, "27347953487840714234", 20, 0x8b5108ba}, -+ {__LINE__, 0x0, "07650690295365319082", 20, 0xc46b3cd8}, -+ {__LINE__, 0x0, "42655507906821911703", 20, 0xc10b2662}, -+ {__LINE__, 0x0, "29977409200786225655", 20, 0xc9a0f9d2}, -+ {__LINE__, 0x0, "85181542907229116674", 20, 0x9341357b}, -+ {__LINE__, 0x0, "87963594337989416799", 20, 0xf0424937}, -+ {__LINE__, 0x0, "21395988329504168551", 20, 0xd7c4c31f}, -+ {__LINE__, 0x0, "51991013580943379423", 20, 0xf11edcc4}, -+ {__LINE__, 0x0, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x40795df4}, -+ {__LINE__, 0x0, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xdd61a631}, -+ {__LINE__, 0x0, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xca907a99}, -+ {__LINE__, 0x0, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0xf652deac}, -+ {__LINE__, 0x0, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0xaf39a5a9}, -+ {__LINE__, 0x0, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x6bebb4cf}, -+ {__LINE__, 0x0, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x76430bac}, -+ {__LINE__, 0x0, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x6c80c388}, -+ {__LINE__, 0x0, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xd54d977d}, -+ {__LINE__, 0x0, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0xe3966ad5}, -+ {__LINE__, 0x0, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xe7c71db9}, -+ {__LINE__, 0x0, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xeaa52777}, -+ {__LINE__, 0x0, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xcd472048}, -+ {__LINE__, 0x7a30360d, "abacus", 6, 0xf8655a84}, -+ {__LINE__, 0x6fd767ee, "backlog", 7, 0x1ed834b1}, -+ {__LINE__, 0xefeb7589, "campfire", 8, 0x686cfca}, -+ {__LINE__, 0x61cf7e6b, "delta", 5, 0x1554e4b1}, -+ {__LINE__, 0xdc712e2, "executable", 10, 0x761b4254}, -+ {__LINE__, 0xad23c7fd, "file", 4, 0x7abdd09b}, -+ {__LINE__, 0x85cb2317, "greatest", 8, 0x4ba91c6b}, -+ {__LINE__, 0x9eed31b0, "inverter", 8, 0xd5e78ba5}, -+ {__LINE__, 0xb94f34ca, "jigsaw", 6, 0x23649109}, -+ {__LINE__, 0xab058a2, "karate", 6, 0xc5591f41}, -+ {__LINE__, 0x5bff2b7a, "landscape", 9, 0xf10eb644}, -+ {__LINE__, 0x605c9a5f, "machine", 7, 0xbaa0a636}, -+ {__LINE__, 0x51bdeea5, "nanometer", 9, 0x6af89afb}, -+ {__LINE__, 0x85c21c79, "oblivion", 8, 0xecae222b}, -+ {__LINE__, 0x97216f56, "panama", 6, 0x47dffac4}, -+ {__LINE__, 0x18444af2, "quest", 5, 0x70c2fe36}, -+ {__LINE__, 0xbe6ce359, "resource", 8, 0x1471d925}, -+ {__LINE__, 0x843071f1, "secret", 6, 0x50c9a0db}, -+ {__LINE__, 0xf2480c60, "ultimate", 8, 0xf973daf8}, -+ {__LINE__, 0x2d2feb3d, "vector", 6, 0x344ac03d}, -+ {__LINE__, 0x7490310a, "walrus", 6, 0x6d1408ef}, -+ {__LINE__, 0x97d247d4, "xeno", 4, 0xe62670b5}, -+ {__LINE__, 0x93cf7599, "yelling", 7, 0x1b36da38}, -+ {__LINE__, 0x73c84278, "zlib", 4, 0x6432d127}, -+ {__LINE__, 0x228a87d1, "4BJD7PocN1VqX0jXVpWB", 20, 0x997107d0}, -+ {__LINE__, 0xa7a048d0, "F1rPWI7XvDs6nAIRx41l", 20, 0xdc567274}, -+ {__LINE__, 0x1f0ded40, "ldhKlsVkPFOveXgkGtC2", 20, 0xdcc63870}, -+ {__LINE__, 0xa804a62f, "5KKnGOOrs8BvJ35iKTOS", 20, 0x6926cffd}, -+ {__LINE__, 0x508fae6a, "0l1tw7GOcem06Ddu7yn4", 20, 0xb52b38bc}, -+ {__LINE__, 0xe5adaf4f, "MCr47CjPIn9R1IvE1Tm5", 20, 0xf83b8178}, -+ {__LINE__, 0x67136a40, "UcixbzPKTIv0SvILHVdO", 20, 0xc5213070}, -+ {__LINE__, 0xb00c4a10, "dGnAyAhRQDsWw0ESou24", 20, 0xbc7648b0}, -+ {__LINE__, 0x2e0c84b5, "di0nvmY9UYMYDh0r45XT", 20, 0xd8123a72}, -+ {__LINE__, 0x81238d44, "2XKDwHfAhFsV0RhbqtvH", 20, 0xd5ac5620}, -+ {__LINE__, 0xf853aa92, "ZhrANFIiIvRnqClIVyeD", 20, 0xceae099d}, -+ {__LINE__, 0x5a692325, "v7Q9ehzioTOVeDIZioT1", 20, 0xb07d2b24}, -+ {__LINE__, 0x3275b9f, "Yod5hEeKcYqyhfXbhxj2", 20, 0x24ce91df}, -+ {__LINE__, 0x38371feb, "GehSWY2ay4uUKhehXYb0", 20, 0x707b3b30}, -+ {__LINE__, 0xafc8bf62, "kwytJmq6UqpflV8Y8GoE", 20, 0x16abc6a9}, -+ {__LINE__, 0x9b07db73, "70684206568419061514", 20, 0xae1fb7b7}, -+ {__LINE__, 0xe75b214, "42015093765128581010", 20, 0xd4eecd2d}, -+ {__LINE__, 0x72d0fe6f, "88214814356148806939", 20, 0x4660ec7}, -+ {__LINE__, 0xf857a4b1, "43472694284527343838", 20, 0xfd8afdf7}, -+ {__LINE__, 0x54b8e14, "49769333513942933689", 20, 0xc6d1b5f2}, -+ {__LINE__, 0xd6aa5616, "54979784887993251199", 20, 0x32476461}, -+ {__LINE__, 0x11e63098, "58360544869206793220", 20, 0xd917cf1a}, -+ {__LINE__, 0xbe92385, "27347953487840714234", 20, 0x4ad14a12}, -+ {__LINE__, 0x49511de0, "07650690295365319082", 20, 0xe37b5c6c}, -+ {__LINE__, 0x3db13bc1, "42655507906821911703", 20, 0x7cc497f1}, -+ {__LINE__, 0xbb899bea, "29977409200786225655", 20, 0x99781bb2}, -+ {__LINE__, 0xf6cd9436, "85181542907229116674", 20, 0x132256a1}, -+ {__LINE__, 0x9109e6c3, "87963594337989416799", 20, 0xbfdb2c83}, -+ {__LINE__, 0x75770fc, "21395988329504168551", 20, 0x8d9d1e81}, -+ {__LINE__, 0x69b1d19b, "51991013580943379423", 20, 0x7b6d4404}, -+ {__LINE__, 0xc6132975, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x8619f010}, -+ {__LINE__, 0xd58cb00c, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x15746ac3}, -+ {__LINE__, 0xb63b8caa, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xaccf812f}, -+ {__LINE__, 0x8a45a2b8, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x78af45de}, -+ {__LINE__, 0xcbe95b78, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x25b06b59}, -+ {__LINE__, 0x4ef8a54b, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x4ba0d08f}, -+ {__LINE__, 0x76ad267a, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0xe26b6aac}, -+ {__LINE__, 0x569e613c, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x7e2b0a66}, -+ {__LINE__, 0x36aa61da, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xb3430dc7}, -+ {__LINE__, 0xf67222df, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x626c17a}, -+ {__LINE__, 0x74b34fd3, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xccf98060}, -+ {__LINE__, 0x351fd770, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xd8b95312}, -+ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xbb1c9912}, -+ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 600, 0x888AFA5B} -+}; -+ -+static const int test_size = sizeof(tests) / sizeof(tests[0]); -+ -+int main(void) -+{ -+ int i; -+ for (i = 0; i < test_size; i++) { -+ test_crc32(tests[i].crc, tests[i].buf, tests[i].len, -+ tests[i].expect, tests[i].line); -+ } -+ return 0; -+} -\ No newline at end of file --- -2.19.1 - diff --git a/zlib-1.2.11-optimized-CRC32-framework.patch b/zlib-1.2.11-optimized-CRC32-framework.patch deleted file mode 100644 index 18255fa..0000000 --- a/zlib-1.2.11-optimized-CRC32-framework.patch +++ /dev/null @@ -1,2258 +0,0 @@ -From d1155b9ab9a2ef643ec82285d1fb767dcfd00d16 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Thu, 1 Aug 2019 12:17:06 +0200 -Subject: [PATCH] Optimized CRC32 for POWER 8+ architectures. - ---- - Makefile.in | 8 + - configure | 77 ++ - contrib/power8-crc/clang_workaround.h | 82 ++ - contrib/power8-crc/crc32_constants.h | 1206 +++++++++++++++++++++++++ - contrib/power8-crc/vec_crc32.c | 674 ++++++++++++++ - crc32.c | 100 +- - 6 files changed, 2135 insertions(+), 12 deletions(-) - create mode 100644 contrib/power8-crc/clang_workaround.h - create mode 100644 contrib/power8-crc/crc32_constants.h - create mode 100644 contrib/power8-crc/vec_crc32.c - -diff --git a/Makefile.in b/Makefile.in -index b7bdbf2..55f6489 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -167,6 +167,9 @@ minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - adler32.o: $(SRCDIR)adler32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c - -+crc32_power8.o: $(SRCDIR)contrib/power8-crc/vec_crc32.c -+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)contrib/power8-crc/vec_crc32.c -+ - crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c - -@@ -215,6 +218,11 @@ adler32.lo: $(SRCDIR)adler32.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c - -@mv objs/adler32.o $@ - -+crc32_power8.lo: $(SRCDIR)contrib/power8-crc/vec_crc32.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32_power8.o $(SRCDIR)contrib/power8-crc/vec_crc32.c -+ -@mv objs/crc32_power8.o $@ -+ - crc32.lo: $(SRCDIR)crc32.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -diff --git a/configure b/configure -index cd9eeef..e93ff99 100755 ---- a/configure -+++ b/configure -@@ -839,6 +839,83 @@ else - echo "Checking for sys/sdt.h ... No." | tee -a configure.log - fi - -+# test to see if Power8+ implementation is compile time possible -+echo >> configure.log -+cat > $test.c < -+#include -+int main() -+{ -+ return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07); -+} -+#endif -+#else -+#error No Power 8 or newer architecture, may need -mcpu=power8 -+#endif -+EOF -+ -+if tryboth $CC -c $CFLAGS $test.c; then -+ OBJC="$OBJC crc32_power8.o" -+ PIC_OBJC="$PIC_OBJC crc32_power8.lo" -+ echo "Checking for runtime cpu detection and Power 8 (or newer) Architecture support... Yes." | tee -a configure.log -+else -+ echo "Checking for runtime cpu detection and Power 8 (or newer) Architecture support... No." | tee -a configure.log -+fi -+ -+# test to see if we can use a gnu indirection function to detect and load optimized code at runtime -+echo >> configure.log -+cat > $test.c <> configure.log -+ cat > $test.c <> configure.log - echo ALL = $ALL >> configure.log -diff --git a/contrib/power8-crc/clang_workaround.h b/contrib/power8-crc/clang_workaround.h -new file mode 100644 -index 0000000..09c411b ---- /dev/null -+++ b/contrib/power8-crc/clang_workaround.h -@@ -0,0 +1,82 @@ -+#ifndef CLANG_WORKAROUNDS_H -+#define CLANG_WORKAROUNDS_H -+ -+/* -+ * These stubs fix clang incompatibilities with GCC builtins. -+ */ -+ -+#ifndef __builtin_crypto_vpmsumw -+#define __builtin_crypto_vpmsumw __builtin_crypto_vpmsumb -+#endif -+#ifndef __builtin_crypto_vpmsumd -+#define __builtin_crypto_vpmsumd __builtin_crypto_vpmsumb -+#endif -+ -+static inline -+__vector unsigned long long __attribute__((overloadable)) -+vec_ld(int __a, const __vector unsigned long long* __b) -+{ -+ return (__vector unsigned long long)__builtin_altivec_lvx(__a, __b); -+} -+ -+/* -+ * GCC __builtin_pack_vector_int128 returns a vector __int128_t but Clang -+ * does not recognize this type. On GCC this builtin is translated to a -+ * xxpermdi instruction that only moves the registers __a, __b instead generates -+ * a load. -+ * -+ * Clang has vec_xxpermdi intrinsics. It was implemented in 4.0.0. -+ */ -+static inline -+__vector unsigned long long __builtin_pack_vector (unsigned long __a, -+ unsigned long __b) -+{ -+ #if defined(__BIG_ENDIAN__) -+ __vector unsigned long long __v = {__a, __b}; -+ #else -+ __vector unsigned long long __v = {__b, __a}; -+ #endif -+ return __v; -+} -+ -+#ifndef vec_xxpermdi -+ -+static inline -+unsigned long __builtin_unpack_vector (__vector unsigned long long __v, -+ int __o) -+{ -+ return __v[__o]; -+} -+ -+#if defined(__BIG_ENDIAN__) -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 0) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 1) -+#else -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 1) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 0) -+#endif -+ -+#else -+ -+static inline -+unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v) -+{ -+ #if defined(__BIG_ENDIAN__) -+ return vec_xxpermdi(__v, __v, 0x0)[1]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x0)[0]; -+ #endif -+} -+ -+static inline -+unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v) -+{ -+ #if defined(__BIG_ENDIAN__) -+ return vec_xxpermdi(__v, __v, 0x3)[1]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x3)[0]; -+ #endif -+} -+#endif /* vec_xxpermdi */ -+ -+#endif -\ No newline at end of file -diff --git a/contrib/power8-crc/crc32_constants.h b/contrib/power8-crc/crc32_constants.h -new file mode 100644 -index 0000000..58088dc ---- /dev/null -+++ b/contrib/power8-crc/crc32_constants.h -@@ -0,0 +1,1206 @@ -+/* -+* -+* THIS FILE IS GENERATED WITH -+./crc32_constants -c -r -x 0x04C11DB7 -+ -+* This is from https://github.com/antonblanchard/crc32-vpmsum/ -+* DO NOT MODIFY IT MANUALLY! -+* -+*/ -+ -+#define CRC 0x4c11db7 -+#define CRC_XOR -+#define REFLECT -+#define MAX_SIZE 32768 -+ -+#ifndef __ASSEMBLER__ -+#ifdef CRC_TABLE -+static const unsigned int crc_table[] = { -+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, -+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, -+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, -+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, -+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, -+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, -+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, -+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, -+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, -+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, -+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, -+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, -+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, -+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, -+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, -+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, -+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, -+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, -+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, -+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, -+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, -+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, -+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, -+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, -+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, -+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, -+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, -+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, -+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, -+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, -+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, -+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, -+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,}; -+ -+#endif /* CRC_TABLE */ -+#ifdef POWER8_INTRINSICS -+ -+/* Constants */ -+ -+/* Reduce 262144 kbits to 1024 bits */ -+static const __vector unsigned long long vcrc_const[255] -+ __attribute__((aligned (16))) = { -+#ifdef __LITTLE_ENDIAN__ -+ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ -+ { 0x0000000099ea94a8, 0x00000001651797d2 }, -+ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ -+ { 0x00000000945a8420, 0x0000000021e0d56c }, -+ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ -+ { 0x0000000030762706, 0x000000000f95ecaa }, -+ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ -+ { 0x00000001a52fc582, 0x00000001ebd224ac }, -+ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ -+ { 0x00000001a4a7167a, 0x000000000ccb97ca }, -+ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ -+ { 0x000000000c18249a, 0x00000001006ec8a8 }, -+ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ -+ { 0x00000000a924ae7c, 0x000000014f58f196 }, -+ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ -+ { 0x00000001e12ccc12, 0x00000001a7192ca6 }, -+ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ -+ { 0x00000000a0b9d4ac, 0x000000019a64bab2 }, -+ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ -+ { 0x0000000095e8ddfe, 0x0000000014f4ed2e }, -+ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ -+ { 0x00000000233fddc4, 0x000000011092b6a2 }, -+ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ -+ { 0x00000001b4529b62, 0x00000000c8a1629c }, -+ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ -+ { 0x00000001a7fa0e64, 0x000000017bf32e8e }, -+ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ -+ { 0x00000001b5334592, 0x00000001f8cc6582 }, -+ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ -+ { 0x000000011f8ee1b4, 0x000000008631ddf0 }, -+ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ -+ { 0x000000006252e632, 0x000000007e5a76d0 }, -+ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ -+ { 0x00000000ab973e84, 0x000000002b09b31c }, -+ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ -+ { 0x000000007734f5ec, 0x00000001b2df1f84 }, -+ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ -+ { 0x000000007c547798, 0x00000001d6f56afc }, -+ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ -+ { 0x000000007ec40210, 0x00000001b9b5e70c }, -+ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ -+ { 0x00000001ab1695a8, 0x0000000034b626d2 }, -+ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ -+ { 0x0000000090494bba, 0x000000014c53479a }, -+ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ -+ { 0x00000001123fb816, 0x00000001a6d179a4 }, -+ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ -+ { 0x00000001e188c74c, 0x000000015abd16b4 }, -+ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ -+ { 0x00000001c2d3451c, 0x00000000018f9852 }, -+ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ -+ { 0x00000000f55cf1ca, 0x000000001fb3084a }, -+ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ -+ { 0x00000001a0531540, 0x00000000c53dfb04 }, -+ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ -+ { 0x0000000132cd7ebc, 0x00000000e10c9ad6 }, -+ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ -+ { 0x0000000073ab7f36, 0x0000000025aa994a }, -+ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ -+ { 0x0000000041aed1c2, 0x00000000fa3a74c4 }, -+ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ -+ { 0x0000000136c53800, 0x0000000033eb3f40 }, -+ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ -+ { 0x0000000126835a30, 0x000000017193f296 }, -+ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ -+ { 0x000000006241b502, 0x0000000043f6c86a }, -+ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ -+ { 0x00000000d5196ad4, 0x000000016b513ec6 }, -+ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ -+ { 0x000000009cfa769a, 0x00000000c8f25b4e }, -+ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ -+ { 0x00000000920e5df4, 0x00000001a45048ec }, -+ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ -+ { 0x0000000169dc310e, 0x000000000c441004 }, -+ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ -+ { 0x0000000009fc331c, 0x000000000e17cad6 }, -+ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ -+ { 0x000000010d94a81e, 0x00000001253ae964 }, -+ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ -+ { 0x0000000027a20ab2, 0x00000001d7c88ebc }, -+ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ -+ { 0x0000000114f87504, 0x00000001e7ca913a }, -+ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ -+ { 0x000000004b076d96, 0x0000000033ed078a }, -+ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ -+ { 0x00000000da4d1e74, 0x00000000e1839c78 }, -+ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ -+ { 0x000000001b81f672, 0x00000001322b267e }, -+ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ -+ { 0x000000009367c988, 0x00000000638231b6 }, -+ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ -+ { 0x00000001717214ca, 0x00000001ee7f16f4 }, -+ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ -+ { 0x000000009f47d820, 0x0000000117d9924a }, -+ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ -+ { 0x000000010d9a47d2, 0x00000000e1a9e0c4 }, -+ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ -+ { 0x00000000a696c58c, 0x00000001403731dc }, -+ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ -+ { 0x000000002aa28ec6, 0x00000001a5ea9682 }, -+ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ -+ { 0x00000001fe18fd9a, 0x0000000101c5c578 }, -+ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ -+ { 0x000000019d4fc1ae, 0x00000000dddf6494 }, -+ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ -+ { 0x00000001ba0e3dea, 0x00000000f1c3db28 }, -+ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ -+ { 0x0000000074b59a5e, 0x000000013112fb9c }, -+ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ -+ { 0x00000000f2b5ea98, 0x00000000b680b906 }, -+ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ -+ { 0x0000000187132676, 0x000000001a282932 }, -+ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ -+ { 0x000000010a8c6ad4, 0x0000000089406e7e }, -+ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ -+ { 0x00000001e21dfe70, 0x00000001def6be8c }, -+ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ -+ { 0x00000001da0050e4, 0x0000000075258728 }, -+ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ -+ { 0x00000000772172ae, 0x000000019536090a }, -+ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ -+ { 0x00000000e47724aa, 0x00000000f2455bfc }, -+ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ -+ { 0x000000003cd63ac4, 0x000000018c40baf4 }, -+ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ -+ { 0x00000001bf47d352, 0x000000004cd390d4 }, -+ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ -+ { 0x000000018dc1d708, 0x00000001e4ece95a }, -+ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ -+ { 0x000000002d4620a4, 0x000000001a3ee918 }, -+ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ -+ { 0x0000000058fd1740, 0x000000007c652fb8 }, -+ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ -+ { 0x00000000dadd9bfc, 0x000000011c67842c }, -+ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ -+ { 0x00000001ea2140be, 0x00000000254f759c }, -+ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ -+ { 0x000000009de128ba, 0x000000007ece94ca }, -+ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ -+ { 0x000000013ac3aa8e, 0x0000000038f258c2 }, -+ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ -+ { 0x0000000099980562, 0x00000001cdf17b00 }, -+ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ -+ { 0x00000001c1579c86, 0x000000011f882c16 }, -+ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ -+ { 0x0000000068dbbf94, 0x0000000100093fc8 }, -+ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ -+ { 0x000000004509fb04, 0x00000001cd684f16 }, -+ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ -+ { 0x00000001202f6398, 0x000000004bc6a70a }, -+ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ -+ { 0x000000013aea243e, 0x000000004fc7e8e4 }, -+ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ -+ { 0x00000001b4052ae6, 0x0000000130103f1c }, -+ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ -+ { 0x00000001cd2a0ae8, 0x0000000111b0024c }, -+ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ -+ { 0x00000001fe4aa8b4, 0x000000010b3079da }, -+ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ -+ { 0x00000001d1559a42, 0x000000010192bcc2 }, -+ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ -+ { 0x00000001f3e05ecc, 0x0000000074838d50 }, -+ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ -+ { 0x0000000104ddd2cc, 0x000000001b20f520 }, -+ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ -+ { 0x000000015393153c, 0x0000000050c3590a }, -+ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ -+ { 0x0000000057e942c6, 0x00000000b41cac8e }, -+ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ -+ { 0x000000012c633850, 0x000000000c72cc78 }, -+ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ -+ { 0x00000000ebcaae4c, 0x0000000030cdb032 }, -+ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ -+ { 0x000000013ee532a6, 0x000000013e09fc32 }, -+ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ -+ { 0x00000001bf0cbc7e, 0x000000001ed624d2 }, -+ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ -+ { 0x00000000d50b7a5a, 0x00000000781aee1a }, -+ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ -+ { 0x0000000002fca6e8, 0x00000001c4d8348c }, -+ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ -+ { 0x000000007af40044, 0x0000000057a40336 }, -+ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ -+ { 0x0000000016178744, 0x0000000085544940 }, -+ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ -+ { 0x000000014c177458, 0x000000019cd21e80 }, -+ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ -+ { 0x000000011b6ddf04, 0x000000013eb95bc0 }, -+ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ -+ { 0x00000001f3e29ccc, 0x00000001dfc9fdfc }, -+ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ -+ { 0x0000000135ae7562, 0x00000000cd028bc2 }, -+ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ -+ { 0x0000000190ef812c, 0x0000000090db8c44 }, -+ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ -+ { 0x0000000067a2c786, 0x000000010010a4ce }, -+ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ -+ { 0x0000000048b9496c, 0x00000001c8f4c72c }, -+ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ -+ { 0x000000015a422de6, 0x000000001c26170c }, -+ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ -+ { 0x00000001ef0e3640, 0x00000000e3fccf68 }, -+ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ -+ { 0x00000001006d2d26, 0x00000000d513ed24 }, -+ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ -+ { 0x00000001170d56d6, 0x00000000141beada }, -+ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ -+ { 0x00000000a5fb613c, 0x000000011071aea0 }, -+ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ -+ { 0x0000000040bbf7fc, 0x000000012e19080a }, -+ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ -+ { 0x000000016ac3a5b2, 0x0000000100ecf826 }, -+ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ -+ { 0x00000000abf16230, 0x0000000069b09412 }, -+ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ -+ { 0x00000001ebe23fac, 0x0000000122297bac }, -+ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ -+ { 0x000000008b6a0894, 0x00000000e9e4b068 }, -+ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ -+ { 0x00000001288ea478, 0x000000004b38651a }, -+ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ -+ { 0x000000016619c442, 0x00000001468360e2 }, -+ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ -+ { 0x0000000086230038, 0x00000000121c2408 }, -+ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ -+ { 0x000000017746a756, 0x00000000da7e7d08 }, -+ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ -+ { 0x0000000191b8f8f8, 0x00000001058d7652 }, -+ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ -+ { 0x000000008e167708, 0x000000014a098a90 }, -+ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ -+ { 0x0000000148b22d54, 0x0000000020dbe72e }, -+ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ -+ { 0x0000000044ba2c3c, 0x000000011e7323e8 }, -+ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ -+ { 0x00000000b54d2b52, 0x00000000d5d4bf94 }, -+ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ -+ { 0x0000000005a4fd8a, 0x0000000199d8746c }, -+ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ -+ { 0x0000000139f9fc46, 0x00000000ce9ca8a0 }, -+ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ -+ { 0x000000015a1fa824, 0x00000000136edece }, -+ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ -+ { 0x000000000a61ae4c, 0x000000019b92a068 }, -+ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ -+ { 0x0000000145e9113e, 0x0000000071d62206 }, -+ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ -+ { 0x000000006a348448, 0x00000000dfc50158 }, -+ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ -+ { 0x000000004d80a08c, 0x00000001517626bc }, -+ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ -+ { 0x000000014b6837a0, 0x0000000148d1e4fa }, -+ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ -+ { 0x000000016896a7fc, 0x0000000094d8266e }, -+ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ -+ { 0x000000014f187140, 0x00000000606c5e34 }, -+ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ -+ { 0x000000019581b9da, 0x000000019766beaa }, -+ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ -+ { 0x00000001091bc984, 0x00000001d80c506c }, -+ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ -+ { 0x000000001067223c, 0x000000001e73837c }, -+ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ -+ { 0x00000001ab16ea02, 0x0000000064d587de }, -+ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ -+ { 0x000000013c4598a8, 0x00000000f4a507b0 }, -+ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ -+ { 0x00000000b3735430, 0x0000000040e342fc }, -+ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ -+ { 0x00000001bb3fc0c0, 0x00000001d5ad9c3a }, -+ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ -+ { 0x00000001570ae19c, 0x0000000094a691a4 }, -+ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ -+ { 0x00000001ea910712, 0x00000001271ecdfa }, -+ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ -+ { 0x0000000167127128, 0x000000009e54475a }, -+ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ -+ { 0x0000000019e790a2, 0x00000000c9c099ee }, -+ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ -+ { 0x000000003788f710, 0x000000009a2f736c }, -+ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ -+ { 0x00000001682a160e, 0x00000000bb9f4996 }, -+ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ -+ { 0x000000007f0ebd2e, 0x00000001db688050 }, -+ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ -+ { 0x000000002b032080, 0x00000000e9b10af4 }, -+ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ -+ { 0x00000000cfd1664a, 0x000000012d4545e4 }, -+ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ -+ { 0x00000000aa1181c2, 0x000000000361139c }, -+ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ -+ { 0x00000000ddd08002, 0x00000001a5a1a3a8 }, -+ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ -+ { 0x00000000e8dd0446, 0x000000006844e0b0 }, -+ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ -+ { 0x00000001bbd94a00, 0x00000000c3762f28 }, -+ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ -+ { 0x00000000ab6cd180, 0x00000001d26287a2 }, -+ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ -+ { 0x0000000031803ce2, 0x00000001f6f0bba8 }, -+ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ -+ { 0x0000000024f40b0c, 0x000000002ffabd62 }, -+ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ -+ { 0x00000001ba1d9834, 0x00000000fb4516b8 }, -+ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ -+ { 0x0000000104de61aa, 0x000000018cfa961c }, -+ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ -+ { 0x0000000113e40d46, 0x000000019e588d52 }, -+ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ -+ { 0x00000001415598a0, 0x00000001180f0bbc }, -+ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ -+ { 0x00000000bf6c8c90, 0x00000000e1d9177a }, -+ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ -+ { 0x00000001788b0504, 0x0000000105abc27c }, -+ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ -+ { 0x0000000038385d02, 0x00000000972e4a58 }, -+ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ -+ { 0x00000001b6c83844, 0x0000000183499a5e }, -+ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ -+ { 0x0000000051061a8a, 0x00000001c96a8cca }, -+ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ -+ { 0x000000017351388a, 0x00000001a1a5b60c }, -+ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ -+ { 0x0000000132928f92, 0x00000000e4b6ac9c }, -+ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ -+ { 0x00000000e6b4f48a, 0x00000001807e7f5a }, -+ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ -+ { 0x0000000039d15e90, 0x000000017a7e3bc8 }, -+ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ -+ { 0x00000000312d6074, 0x00000000d73975da }, -+ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ -+ { 0x000000017bbb2cc4, 0x000000017375d038 }, -+ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ -+ { 0x000000016ded3e18, 0x00000000193680bc }, -+ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ -+ { 0x00000000f1638b16, 0x00000000999b06f6 }, -+ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ -+ { 0x00000001d38b9ecc, 0x00000001f685d2b8 }, -+ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ -+ { 0x000000018b8d09dc, 0x00000001f4ecbed2 }, -+ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ -+ { 0x00000000e7bc27d2, 0x00000000ba16f1a0 }, -+ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ -+ { 0x00000000275e1e96, 0x0000000115aceac4 }, -+ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ -+ { 0x00000000e2e3031e, 0x00000001aeff6292 }, -+ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ -+ { 0x00000001041c84d8, 0x000000009640124c }, -+ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ -+ { 0x00000000706ce672, 0x0000000114f41f02 }, -+ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ -+ { 0x000000015d5070da, 0x000000009c5f3586 }, -+ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ -+ { 0x0000000038f9493a, 0x00000001878275fa }, -+ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ -+ { 0x00000000a3348a76, 0x00000000ddc42ce8 }, -+ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ -+ { 0x00000001ad0aab92, 0x0000000181d2c73a }, -+ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ -+ { 0x000000019e85f712, 0x0000000141c9320a }, -+ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ -+ { 0x000000005a871e76, 0x000000015235719a }, -+ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ -+ { 0x000000017249c662, 0x00000000be27d804 }, -+ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ -+ { 0x000000003a084712, 0x000000006242d45a }, -+ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ -+ { 0x00000000ed438478, 0x000000009a53638e }, -+ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ -+ { 0x00000000abac34cc, 0x00000001001ecfb6 }, -+ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ -+ { 0x000000005f35ef3e, 0x000000016d7c2d64 }, -+ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ -+ { 0x0000000047d6608c, 0x00000001d0ce46c0 }, -+ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ -+ { 0x000000002d01470e, 0x0000000124c907b4 }, -+ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ -+ { 0x0000000158bbc7b0, 0x0000000018a555ca }, -+ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ -+ { 0x00000000c0a23e8e, 0x000000006b0980bc }, -+ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ -+ { 0x00000001ebd85c88, 0x000000008bbba964 }, -+ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ -+ { 0x000000019ee20bb2, 0x00000001070a5a1e }, -+ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ -+ { 0x00000001acabf2d6, 0x000000002204322a }, -+ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ -+ { 0x00000001b7963d56, 0x00000000a27524d0 }, -+ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ -+ { 0x000000017bffa1fe, 0x0000000020b1e4ba }, -+ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ -+ { 0x000000001f15333e, 0x0000000032cc27fc }, -+ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ -+ { 0x000000018593129e, 0x0000000044dd22b8 }, -+ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ -+ { 0x000000019cb32602, 0x00000000dffc9e0a }, -+ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ -+ { 0x0000000142b05cc8, 0x00000001b7a0ed14 }, -+ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ -+ { 0x00000001be49e7a4, 0x00000000c7842488 }, -+ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ -+ { 0x0000000108f69d6c, 0x00000001c02a4fee }, -+ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ -+ { 0x000000006c0971f0, 0x000000003c273778 }, -+ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ -+ { 0x000000005b16467a, 0x00000001d63f8894 }, -+ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ -+ { 0x00000001551a628e, 0x000000006be557d6 }, -+ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ -+ { 0x000000019e42ea92, 0x000000006a7806ea }, -+ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ -+ { 0x000000012fa83ff2, 0x000000016155aa0c }, -+ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ -+ { 0x000000011ca9cde0, 0x00000000908650ac }, -+ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ -+ { 0x00000000c8e5cd74, 0x00000000aa5a8084 }, -+ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ -+ { 0x0000000096c27f0c, 0x0000000191bb500a }, -+ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ -+ { 0x000000002baed926, 0x0000000064e9bed0 }, -+ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ -+ { 0x000000017c8de8d2, 0x000000009444f302 }, -+ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ -+ { 0x00000000d43d6068, 0x000000019db07d3c }, -+ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ -+ { 0x00000000cb2c4b26, 0x00000001359e3e6e }, -+ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ -+ { 0x0000000145b8da26, 0x00000001e4f10dd2 }, -+ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ -+ { 0x000000018fff4b08, 0x0000000124f5735e }, -+ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ -+ { 0x0000000150b58ed0, 0x0000000124760a4c }, -+ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ -+ { 0x00000001549f39bc, 0x000000000f1fc186 }, -+ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ -+ { 0x00000000ef4d2f42, 0x00000000150e4cc4 }, -+ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ -+ { 0x00000001b1468572, 0x000000002a6204e8 }, -+ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ -+ { 0x000000013d7403b2, 0x00000000beb1d432 }, -+ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ -+ { 0x00000001a4681842, 0x0000000135f3f1f0 }, -+ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ -+ { 0x0000000167714492, 0x0000000074fe2232 }, -+ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ -+ { 0x00000001e599099a, 0x000000001ac6e2ba }, -+ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ -+ { 0x00000000fe128194, 0x0000000013fca91e }, -+ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ -+ { 0x0000000077e8b990, 0x0000000183f4931e }, -+ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ -+ { 0x00000001a267f63a, 0x00000000b6d9b4e4 }, -+ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ -+ { 0x00000001945c245a, 0x00000000b5188656 }, -+ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ -+ { 0x0000000149002e76, 0x0000000027a81a84 }, -+ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ -+ { 0x00000001bb8310a4, 0x0000000125699258 }, -+ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ -+ { 0x000000019ec60bcc, 0x00000001b23de796 }, -+ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ -+ { 0x000000012d8590ae, 0x00000000fe4365dc }, -+ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ -+ { 0x0000000065b00684, 0x00000000c68f497a }, -+ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ -+ { 0x000000015e5aeadc, 0x00000000fbf521ee }, -+ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ -+ { 0x00000000b77ff2b0, 0x000000015eac3378 }, -+ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ -+ { 0x0000000188da2ff6, 0x0000000134914b90 }, -+ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ -+ { 0x0000000063da929a, 0x0000000016335cfe }, -+ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ -+ { 0x00000001389caa80, 0x000000010372d10c }, -+ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ -+ { 0x000000013db599d2, 0x000000015097b908 }, -+ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ -+ { 0x0000000122505a86, 0x00000001227a7572 }, -+ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ -+ { 0x000000016bd72746, 0x000000009a8f75c0 }, -+ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ -+ { 0x00000001c3faf1d4, 0x00000000682c77a2 }, -+ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ -+ { 0x00000001111c826c, 0x00000000231f091c }, -+ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ -+ { 0x00000000153e9fb2, 0x000000007d4439f2 }, -+ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ -+ { 0x000000002b1f7b60, 0x000000017e221efc }, -+ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ -+ { 0x00000000b1dba570, 0x0000000167457c38 }, -+ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ -+ { 0x00000001f6397b76, 0x00000000bdf081c4 }, -+ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ -+ { 0x0000000156335214, 0x000000016286d6b0 }, -+ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ -+ { 0x00000001d70e3986, 0x00000000c84f001c }, -+ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ -+ { 0x000000003701a774, 0x0000000064efe7c0 }, -+ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ -+ { 0x00000000ac81ef72, 0x000000000ac2d904 }, -+ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ -+ { 0x0000000133212464, 0x00000000fd226d14 }, -+ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ -+ { 0x00000000e4e45610, 0x000000011cfd42e0 }, -+ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ -+ { 0x000000000c1bd370, 0x000000016e5a5678 }, -+ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ -+ { 0x00000001a7b9e7a6, 0x00000001d888fe22 }, -+ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ -+ { 0x000000007d657a10, 0x00000001af77fcd4 } -+#else /* __LITTLE_ENDIAN__ */ -+ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ -+ { 0x00000001651797d2, 0x0000000099ea94a8 }, -+ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ -+ { 0x0000000021e0d56c, 0x00000000945a8420 }, -+ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ -+ { 0x000000000f95ecaa, 0x0000000030762706 }, -+ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ -+ { 0x00000001ebd224ac, 0x00000001a52fc582 }, -+ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ -+ { 0x000000000ccb97ca, 0x00000001a4a7167a }, -+ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ -+ { 0x00000001006ec8a8, 0x000000000c18249a }, -+ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ -+ { 0x000000014f58f196, 0x00000000a924ae7c }, -+ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ -+ { 0x00000001a7192ca6, 0x00000001e12ccc12 }, -+ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ -+ { 0x000000019a64bab2, 0x00000000a0b9d4ac }, -+ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ -+ { 0x0000000014f4ed2e, 0x0000000095e8ddfe }, -+ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ -+ { 0x000000011092b6a2, 0x00000000233fddc4 }, -+ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ -+ { 0x00000000c8a1629c, 0x00000001b4529b62 }, -+ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ -+ { 0x000000017bf32e8e, 0x00000001a7fa0e64 }, -+ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ -+ { 0x00000001f8cc6582, 0x00000001b5334592 }, -+ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ -+ { 0x000000008631ddf0, 0x000000011f8ee1b4 }, -+ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ -+ { 0x000000007e5a76d0, 0x000000006252e632 }, -+ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ -+ { 0x000000002b09b31c, 0x00000000ab973e84 }, -+ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ -+ { 0x00000001b2df1f84, 0x000000007734f5ec }, -+ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ -+ { 0x00000001d6f56afc, 0x000000007c547798 }, -+ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ -+ { 0x00000001b9b5e70c, 0x000000007ec40210 }, -+ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ -+ { 0x0000000034b626d2, 0x00000001ab1695a8 }, -+ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ -+ { 0x000000014c53479a, 0x0000000090494bba }, -+ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ -+ { 0x00000001a6d179a4, 0x00000001123fb816 }, -+ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ -+ { 0x000000015abd16b4, 0x00000001e188c74c }, -+ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ -+ { 0x00000000018f9852, 0x00000001c2d3451c }, -+ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ -+ { 0x000000001fb3084a, 0x00000000f55cf1ca }, -+ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ -+ { 0x00000000c53dfb04, 0x00000001a0531540 }, -+ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ -+ { 0x00000000e10c9ad6, 0x0000000132cd7ebc }, -+ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ -+ { 0x0000000025aa994a, 0x0000000073ab7f36 }, -+ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ -+ { 0x00000000fa3a74c4, 0x0000000041aed1c2 }, -+ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ -+ { 0x0000000033eb3f40, 0x0000000136c53800 }, -+ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ -+ { 0x000000017193f296, 0x0000000126835a30 }, -+ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ -+ { 0x0000000043f6c86a, 0x000000006241b502 }, -+ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ -+ { 0x000000016b513ec6, 0x00000000d5196ad4 }, -+ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ -+ { 0x00000000c8f25b4e, 0x000000009cfa769a }, -+ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ -+ { 0x00000001a45048ec, 0x00000000920e5df4 }, -+ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ -+ { 0x000000000c441004, 0x0000000169dc310e }, -+ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ -+ { 0x000000000e17cad6, 0x0000000009fc331c }, -+ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ -+ { 0x00000001253ae964, 0x000000010d94a81e }, -+ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ -+ { 0x00000001d7c88ebc, 0x0000000027a20ab2 }, -+ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ -+ { 0x00000001e7ca913a, 0x0000000114f87504 }, -+ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ -+ { 0x0000000033ed078a, 0x000000004b076d96 }, -+ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ -+ { 0x00000000e1839c78, 0x00000000da4d1e74 }, -+ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ -+ { 0x00000001322b267e, 0x000000001b81f672 }, -+ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ -+ { 0x00000000638231b6, 0x000000009367c988 }, -+ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ -+ { 0x00000001ee7f16f4, 0x00000001717214ca }, -+ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ -+ { 0x0000000117d9924a, 0x000000009f47d820 }, -+ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ -+ { 0x00000000e1a9e0c4, 0x000000010d9a47d2 }, -+ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ -+ { 0x00000001403731dc, 0x00000000a696c58c }, -+ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ -+ { 0x00000001a5ea9682, 0x000000002aa28ec6 }, -+ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ -+ { 0x0000000101c5c578, 0x00000001fe18fd9a }, -+ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ -+ { 0x00000000dddf6494, 0x000000019d4fc1ae }, -+ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ -+ { 0x00000000f1c3db28, 0x00000001ba0e3dea }, -+ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ -+ { 0x000000013112fb9c, 0x0000000074b59a5e }, -+ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ -+ { 0x00000000b680b906, 0x00000000f2b5ea98 }, -+ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ -+ { 0x000000001a282932, 0x0000000187132676 }, -+ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ -+ { 0x0000000089406e7e, 0x000000010a8c6ad4 }, -+ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ -+ { 0x00000001def6be8c, 0x00000001e21dfe70 }, -+ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ -+ { 0x0000000075258728, 0x00000001da0050e4 }, -+ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ -+ { 0x000000019536090a, 0x00000000772172ae }, -+ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ -+ { 0x00000000f2455bfc, 0x00000000e47724aa }, -+ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ -+ { 0x000000018c40baf4, 0x000000003cd63ac4 }, -+ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ -+ { 0x000000004cd390d4, 0x00000001bf47d352 }, -+ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ -+ { 0x00000001e4ece95a, 0x000000018dc1d708 }, -+ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ -+ { 0x000000001a3ee918, 0x000000002d4620a4 }, -+ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ -+ { 0x000000007c652fb8, 0x0000000058fd1740 }, -+ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ -+ { 0x000000011c67842c, 0x00000000dadd9bfc }, -+ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ -+ { 0x00000000254f759c, 0x00000001ea2140be }, -+ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ -+ { 0x000000007ece94ca, 0x000000009de128ba }, -+ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ -+ { 0x0000000038f258c2, 0x000000013ac3aa8e }, -+ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ -+ { 0x00000001cdf17b00, 0x0000000099980562 }, -+ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ -+ { 0x000000011f882c16, 0x00000001c1579c86 }, -+ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ -+ { 0x0000000100093fc8, 0x0000000068dbbf94 }, -+ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ -+ { 0x00000001cd684f16, 0x000000004509fb04 }, -+ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ -+ { 0x000000004bc6a70a, 0x00000001202f6398 }, -+ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ -+ { 0x000000004fc7e8e4, 0x000000013aea243e }, -+ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ -+ { 0x0000000130103f1c, 0x00000001b4052ae6 }, -+ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ -+ { 0x0000000111b0024c, 0x00000001cd2a0ae8 }, -+ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ -+ { 0x000000010b3079da, 0x00000001fe4aa8b4 }, -+ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ -+ { 0x000000010192bcc2, 0x00000001d1559a42 }, -+ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ -+ { 0x0000000074838d50, 0x00000001f3e05ecc }, -+ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ -+ { 0x000000001b20f520, 0x0000000104ddd2cc }, -+ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ -+ { 0x0000000050c3590a, 0x000000015393153c }, -+ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ -+ { 0x00000000b41cac8e, 0x0000000057e942c6 }, -+ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ -+ { 0x000000000c72cc78, 0x000000012c633850 }, -+ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ -+ { 0x0000000030cdb032, 0x00000000ebcaae4c }, -+ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ -+ { 0x000000013e09fc32, 0x000000013ee532a6 }, -+ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ -+ { 0x000000001ed624d2, 0x00000001bf0cbc7e }, -+ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ -+ { 0x00000000781aee1a, 0x00000000d50b7a5a }, -+ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ -+ { 0x00000001c4d8348c, 0x0000000002fca6e8 }, -+ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ -+ { 0x0000000057a40336, 0x000000007af40044 }, -+ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ -+ { 0x0000000085544940, 0x0000000016178744 }, -+ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ -+ { 0x000000019cd21e80, 0x000000014c177458 }, -+ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ -+ { 0x000000013eb95bc0, 0x000000011b6ddf04 }, -+ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ -+ { 0x00000001dfc9fdfc, 0x00000001f3e29ccc }, -+ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ -+ { 0x00000000cd028bc2, 0x0000000135ae7562 }, -+ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ -+ { 0x0000000090db8c44, 0x0000000190ef812c }, -+ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ -+ { 0x000000010010a4ce, 0x0000000067a2c786 }, -+ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ -+ { 0x00000001c8f4c72c, 0x0000000048b9496c }, -+ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ -+ { 0x000000001c26170c, 0x000000015a422de6 }, -+ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ -+ { 0x00000000e3fccf68, 0x00000001ef0e3640 }, -+ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ -+ { 0x00000000d513ed24, 0x00000001006d2d26 }, -+ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ -+ { 0x00000000141beada, 0x00000001170d56d6 }, -+ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ -+ { 0x000000011071aea0, 0x00000000a5fb613c }, -+ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ -+ { 0x000000012e19080a, 0x0000000040bbf7fc }, -+ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ -+ { 0x0000000100ecf826, 0x000000016ac3a5b2 }, -+ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ -+ { 0x0000000069b09412, 0x00000000abf16230 }, -+ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ -+ { 0x0000000122297bac, 0x00000001ebe23fac }, -+ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ -+ { 0x00000000e9e4b068, 0x000000008b6a0894 }, -+ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ -+ { 0x000000004b38651a, 0x00000001288ea478 }, -+ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ -+ { 0x00000001468360e2, 0x000000016619c442 }, -+ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ -+ { 0x00000000121c2408, 0x0000000086230038 }, -+ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ -+ { 0x00000000da7e7d08, 0x000000017746a756 }, -+ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ -+ { 0x00000001058d7652, 0x0000000191b8f8f8 }, -+ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ -+ { 0x000000014a098a90, 0x000000008e167708 }, -+ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ -+ { 0x0000000020dbe72e, 0x0000000148b22d54 }, -+ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ -+ { 0x000000011e7323e8, 0x0000000044ba2c3c }, -+ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ -+ { 0x00000000d5d4bf94, 0x00000000b54d2b52 }, -+ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ -+ { 0x0000000199d8746c, 0x0000000005a4fd8a }, -+ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ -+ { 0x00000000ce9ca8a0, 0x0000000139f9fc46 }, -+ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ -+ { 0x00000000136edece, 0x000000015a1fa824 }, -+ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ -+ { 0x000000019b92a068, 0x000000000a61ae4c }, -+ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ -+ { 0x0000000071d62206, 0x0000000145e9113e }, -+ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ -+ { 0x00000000dfc50158, 0x000000006a348448 }, -+ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ -+ { 0x00000001517626bc, 0x000000004d80a08c }, -+ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ -+ { 0x0000000148d1e4fa, 0x000000014b6837a0 }, -+ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ -+ { 0x0000000094d8266e, 0x000000016896a7fc }, -+ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ -+ { 0x00000000606c5e34, 0x000000014f187140 }, -+ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ -+ { 0x000000019766beaa, 0x000000019581b9da }, -+ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ -+ { 0x00000001d80c506c, 0x00000001091bc984 }, -+ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ -+ { 0x000000001e73837c, 0x000000001067223c }, -+ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ -+ { 0x0000000064d587de, 0x00000001ab16ea02 }, -+ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ -+ { 0x00000000f4a507b0, 0x000000013c4598a8 }, -+ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ -+ { 0x0000000040e342fc, 0x00000000b3735430 }, -+ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ -+ { 0x00000001d5ad9c3a, 0x00000001bb3fc0c0 }, -+ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ -+ { 0x0000000094a691a4, 0x00000001570ae19c }, -+ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ -+ { 0x00000001271ecdfa, 0x00000001ea910712 }, -+ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ -+ { 0x000000009e54475a, 0x0000000167127128 }, -+ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ -+ { 0x00000000c9c099ee, 0x0000000019e790a2 }, -+ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ -+ { 0x000000009a2f736c, 0x000000003788f710 }, -+ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ -+ { 0x00000000bb9f4996, 0x00000001682a160e }, -+ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ -+ { 0x00000001db688050, 0x000000007f0ebd2e }, -+ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ -+ { 0x00000000e9b10af4, 0x000000002b032080 }, -+ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ -+ { 0x000000012d4545e4, 0x00000000cfd1664a }, -+ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ -+ { 0x000000000361139c, 0x00000000aa1181c2 }, -+ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ -+ { 0x00000001a5a1a3a8, 0x00000000ddd08002 }, -+ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ -+ { 0x000000006844e0b0, 0x00000000e8dd0446 }, -+ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ -+ { 0x00000000c3762f28, 0x00000001bbd94a00 }, -+ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ -+ { 0x00000001d26287a2, 0x00000000ab6cd180 }, -+ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ -+ { 0x00000001f6f0bba8, 0x0000000031803ce2 }, -+ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ -+ { 0x000000002ffabd62, 0x0000000024f40b0c }, -+ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ -+ { 0x00000000fb4516b8, 0x00000001ba1d9834 }, -+ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ -+ { 0x000000018cfa961c, 0x0000000104de61aa }, -+ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ -+ { 0x000000019e588d52, 0x0000000113e40d46 }, -+ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ -+ { 0x00000001180f0bbc, 0x00000001415598a0 }, -+ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ -+ { 0x00000000e1d9177a, 0x00000000bf6c8c90 }, -+ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ -+ { 0x0000000105abc27c, 0x00000001788b0504 }, -+ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ -+ { 0x00000000972e4a58, 0x0000000038385d02 }, -+ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ -+ { 0x0000000183499a5e, 0x00000001b6c83844 }, -+ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ -+ { 0x00000001c96a8cca, 0x0000000051061a8a }, -+ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ -+ { 0x00000001a1a5b60c, 0x000000017351388a }, -+ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ -+ { 0x00000000e4b6ac9c, 0x0000000132928f92 }, -+ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ -+ { 0x00000001807e7f5a, 0x00000000e6b4f48a }, -+ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ -+ { 0x000000017a7e3bc8, 0x0000000039d15e90 }, -+ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ -+ { 0x00000000d73975da, 0x00000000312d6074 }, -+ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ -+ { 0x000000017375d038, 0x000000017bbb2cc4 }, -+ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ -+ { 0x00000000193680bc, 0x000000016ded3e18 }, -+ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ -+ { 0x00000000999b06f6, 0x00000000f1638b16 }, -+ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ -+ { 0x00000001f685d2b8, 0x00000001d38b9ecc }, -+ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ -+ { 0x00000001f4ecbed2, 0x000000018b8d09dc }, -+ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ -+ { 0x00000000ba16f1a0, 0x00000000e7bc27d2 }, -+ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ -+ { 0x0000000115aceac4, 0x00000000275e1e96 }, -+ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ -+ { 0x00000001aeff6292, 0x00000000e2e3031e }, -+ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ -+ { 0x000000009640124c, 0x00000001041c84d8 }, -+ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ -+ { 0x0000000114f41f02, 0x00000000706ce672 }, -+ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ -+ { 0x000000009c5f3586, 0x000000015d5070da }, -+ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ -+ { 0x00000001878275fa, 0x0000000038f9493a }, -+ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ -+ { 0x00000000ddc42ce8, 0x00000000a3348a76 }, -+ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ -+ { 0x0000000181d2c73a, 0x00000001ad0aab92 }, -+ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ -+ { 0x0000000141c9320a, 0x000000019e85f712 }, -+ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ -+ { 0x000000015235719a, 0x000000005a871e76 }, -+ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ -+ { 0x00000000be27d804, 0x000000017249c662 }, -+ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ -+ { 0x000000006242d45a, 0x000000003a084712 }, -+ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ -+ { 0x000000009a53638e, 0x00000000ed438478 }, -+ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ -+ { 0x00000001001ecfb6, 0x00000000abac34cc }, -+ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ -+ { 0x000000016d7c2d64, 0x000000005f35ef3e }, -+ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ -+ { 0x00000001d0ce46c0, 0x0000000047d6608c }, -+ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ -+ { 0x0000000124c907b4, 0x000000002d01470e }, -+ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ -+ { 0x0000000018a555ca, 0x0000000158bbc7b0 }, -+ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ -+ { 0x000000006b0980bc, 0x00000000c0a23e8e }, -+ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ -+ { 0x000000008bbba964, 0x00000001ebd85c88 }, -+ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ -+ { 0x00000001070a5a1e, 0x000000019ee20bb2 }, -+ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ -+ { 0x000000002204322a, 0x00000001acabf2d6 }, -+ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ -+ { 0x00000000a27524d0, 0x00000001b7963d56 }, -+ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ -+ { 0x0000000020b1e4ba, 0x000000017bffa1fe }, -+ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ -+ { 0x0000000032cc27fc, 0x000000001f15333e }, -+ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ -+ { 0x0000000044dd22b8, 0x000000018593129e }, -+ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ -+ { 0x00000000dffc9e0a, 0x000000019cb32602 }, -+ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ -+ { 0x00000001b7a0ed14, 0x0000000142b05cc8 }, -+ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ -+ { 0x00000000c7842488, 0x00000001be49e7a4 }, -+ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ -+ { 0x00000001c02a4fee, 0x0000000108f69d6c }, -+ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ -+ { 0x000000003c273778, 0x000000006c0971f0 }, -+ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ -+ { 0x00000001d63f8894, 0x000000005b16467a }, -+ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ -+ { 0x000000006be557d6, 0x00000001551a628e }, -+ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ -+ { 0x000000006a7806ea, 0x000000019e42ea92 }, -+ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ -+ { 0x000000016155aa0c, 0x000000012fa83ff2 }, -+ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ -+ { 0x00000000908650ac, 0x000000011ca9cde0 }, -+ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ -+ { 0x00000000aa5a8084, 0x00000000c8e5cd74 }, -+ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ -+ { 0x0000000191bb500a, 0x0000000096c27f0c }, -+ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ -+ { 0x0000000064e9bed0, 0x000000002baed926 }, -+ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ -+ { 0x000000009444f302, 0x000000017c8de8d2 }, -+ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ -+ { 0x000000019db07d3c, 0x00000000d43d6068 }, -+ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ -+ { 0x00000001359e3e6e, 0x00000000cb2c4b26 }, -+ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ -+ { 0x00000001e4f10dd2, 0x0000000145b8da26 }, -+ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ -+ { 0x0000000124f5735e, 0x000000018fff4b08 }, -+ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ -+ { 0x0000000124760a4c, 0x0000000150b58ed0 }, -+ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ -+ { 0x000000000f1fc186, 0x00000001549f39bc }, -+ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ -+ { 0x00000000150e4cc4, 0x00000000ef4d2f42 }, -+ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ -+ { 0x000000002a6204e8, 0x00000001b1468572 }, -+ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ -+ { 0x00000000beb1d432, 0x000000013d7403b2 }, -+ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ -+ { 0x0000000135f3f1f0, 0x00000001a4681842 }, -+ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ -+ { 0x0000000074fe2232, 0x0000000167714492 }, -+ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ -+ { 0x000000001ac6e2ba, 0x00000001e599099a }, -+ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ -+ { 0x0000000013fca91e, 0x00000000fe128194 }, -+ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ -+ { 0x0000000183f4931e, 0x0000000077e8b990 }, -+ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ -+ { 0x00000000b6d9b4e4, 0x00000001a267f63a }, -+ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ -+ { 0x00000000b5188656, 0x00000001945c245a }, -+ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ -+ { 0x0000000027a81a84, 0x0000000149002e76 }, -+ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ -+ { 0x0000000125699258, 0x00000001bb8310a4 }, -+ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ -+ { 0x00000001b23de796, 0x000000019ec60bcc }, -+ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ -+ { 0x00000000fe4365dc, 0x000000012d8590ae }, -+ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ -+ { 0x00000000c68f497a, 0x0000000065b00684 }, -+ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ -+ { 0x00000000fbf521ee, 0x000000015e5aeadc }, -+ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ -+ { 0x000000015eac3378, 0x00000000b77ff2b0 }, -+ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ -+ { 0x0000000134914b90, 0x0000000188da2ff6 }, -+ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ -+ { 0x0000000016335cfe, 0x0000000063da929a }, -+ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ -+ { 0x000000010372d10c, 0x00000001389caa80 }, -+ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ -+ { 0x000000015097b908, 0x000000013db599d2 }, -+ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ -+ { 0x00000001227a7572, 0x0000000122505a86 }, -+ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ -+ { 0x000000009a8f75c0, 0x000000016bd72746 }, -+ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ -+ { 0x00000000682c77a2, 0x00000001c3faf1d4 }, -+ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ -+ { 0x00000000231f091c, 0x00000001111c826c }, -+ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ -+ { 0x000000007d4439f2, 0x00000000153e9fb2 }, -+ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ -+ { 0x000000017e221efc, 0x000000002b1f7b60 }, -+ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ -+ { 0x0000000167457c38, 0x00000000b1dba570 }, -+ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ -+ { 0x00000000bdf081c4, 0x00000001f6397b76 }, -+ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ -+ { 0x000000016286d6b0, 0x0000000156335214 }, -+ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ -+ { 0x00000000c84f001c, 0x00000001d70e3986 }, -+ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ -+ { 0x0000000064efe7c0, 0x000000003701a774 }, -+ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ -+ { 0x000000000ac2d904, 0x00000000ac81ef72 }, -+ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ -+ { 0x00000000fd226d14, 0x0000000133212464 }, -+ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ -+ { 0x000000011cfd42e0, 0x00000000e4e45610 }, -+ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ -+ { 0x000000016e5a5678, 0x000000000c1bd370 }, -+ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ -+ { 0x00000001d888fe22, 0x00000001a7b9e7a6 }, -+ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ -+ { 0x00000001af77fcd4, 0x000000007d657a10 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+ -+/* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */ -+ -+static const __vector unsigned long long vcrc_short_const[16] -+ __attribute__((aligned (16))) = { -+#ifdef __LITTLE_ENDIAN__ -+ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ -+ { 0x99168a18ec447f11, 0xed837b2613e8221e }, -+ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ -+ { 0xe23e954e8fd2cd3c, 0xc8acdd8147b9ce5a }, -+ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ -+ { 0x92f8befe6b1d2b53, 0xd9ad6d87d4277e25 }, -+ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ -+ { 0xf38a3556291ea462, 0xc10ec5e033fbca3b }, -+ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ -+ { 0x974ac56262b6ca4b, 0xc0b55b0e82e02e2f }, -+ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ -+ { 0x855712b3784d2a56, 0x71aa1df0e172334d }, -+ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ -+ { 0xa5abe9f80eaee722, 0xfee3053e3969324d }, -+ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ -+ { 0x1fa0943ddb54814c, 0xf44779b93eb2bd08 }, -+ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ -+ { 0xa53ff440d7bbfe6a, 0xf5449b3f00cc3374 }, -+ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ -+ { 0xebe7e3566325605c, 0x6f8346e1d777606e }, -+ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ -+ { 0xc65a272ce5b592b8, 0xe3ab4f2ac0b95347 }, -+ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ -+ { 0x5705a9ca4721589f, 0xaa2215ea329ecc11 }, -+ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ -+ { 0xe3720acb88d14467, 0x1ed8f66ed95efd26 }, -+ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ -+ { 0xba1aca0315141c31, 0x78ed02d5a700e96a }, -+ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ -+ { 0xad2a31b3ed627dae, 0xba8ccbe832b39da3 }, -+ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ -+ { 0x6655004fa06a2517, 0xedb88320b1e6b092 } -+#else /* __LITTLE_ENDIAN__ */ -+ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ -+ { 0xed837b2613e8221e, 0x99168a18ec447f11 }, -+ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ -+ { 0xc8acdd8147b9ce5a, 0xe23e954e8fd2cd3c }, -+ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ -+ { 0xd9ad6d87d4277e25, 0x92f8befe6b1d2b53 }, -+ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ -+ { 0xc10ec5e033fbca3b, 0xf38a3556291ea462 }, -+ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ -+ { 0xc0b55b0e82e02e2f, 0x974ac56262b6ca4b }, -+ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ -+ { 0x71aa1df0e172334d, 0x855712b3784d2a56 }, -+ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ -+ { 0xfee3053e3969324d, 0xa5abe9f80eaee722 }, -+ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ -+ { 0xf44779b93eb2bd08, 0x1fa0943ddb54814c }, -+ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ -+ { 0xf5449b3f00cc3374, 0xa53ff440d7bbfe6a }, -+ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ -+ { 0x6f8346e1d777606e, 0xebe7e3566325605c }, -+ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ -+ { 0xe3ab4f2ac0b95347, 0xc65a272ce5b592b8 }, -+ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ -+ { 0xaa2215ea329ecc11, 0x5705a9ca4721589f }, -+ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ -+ { 0x1ed8f66ed95efd26, 0xe3720acb88d14467 }, -+ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ -+ { 0x78ed02d5a700e96a, 0xba1aca0315141c31 }, -+ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ -+ { 0xba8ccbe832b39da3, 0xad2a31b3ed627dae }, -+ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ -+ { 0xedb88320b1e6b092, 0x6655004fa06a2517 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+ -+/* Barrett constants */ -+/* 33 bit reflected Barrett constant m - (4^32)/n */ -+ -+static const __vector unsigned long long v_Barrett_const[2] -+ __attribute__((aligned (16))) = { -+ /* x^64 div p(x) */ -+#ifdef __LITTLE_ENDIAN__ -+ { 0x00000001f7011641, 0x0000000000000000 }, -+ { 0x00000001db710641, 0x0000000000000000 } -+#else /* __LITTLE_ENDIAN__ */ -+ { 0x0000000000000000, 0x00000001f7011641 }, -+ { 0x0000000000000000, 0x00000001db710641 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+#endif /* POWER8_INTRINSICS */ -+ -+#endif /* __ASSEMBLER__ */ -diff --git a/contrib/power8-crc/vec_crc32.c b/contrib/power8-crc/vec_crc32.c -new file mode 100644 -index 0000000..bb2204b ---- /dev/null -+++ b/contrib/power8-crc/vec_crc32.c -@@ -0,0 +1,674 @@ -+/* -+ * Calculate the checksum of data that is 16 byte aligned and a multiple of -+ * 16 bytes. -+ * -+ * The first step is to reduce it to 1024 bits. We do this in 8 parallel -+ * chunks in order to mask the latency of the vpmsum instructions. If we -+ * have more than 32 kB of data to checksum we repeat this step multiple -+ * times, passing in the previous 1024 bits. -+ * -+ * The next step is to reduce the 1024 bits to 64 bits. This step adds -+ * 32 bits of 0s to the end - this matches what a CRC does. We just -+ * calculate constants that land the data in this 32 bits. -+ * -+ * We then use fixed point Barrett reduction to compute a mod n over GF(2) -+ * for n = CRC using POWER8 instructions. We use x = 32. -+ * -+ * http://en.wikipedia.org/wiki/Barrett_reduction -+ * -+ * This code uses gcc vector builtins instead using assembly directly. -+ * -+ * Copyright (C) 2017 Rogerio Alves , IBM -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of either: -+ * -+ * a) the GNU General Public License as published by the Free Software -+ * Foundation; either version 2 of the License, or (at your option) -+ * any later version, or -+ * b) the Apache License, Version 2.0 -+ */ -+ -+#include -+ -+#define POWER8_INTRINSICS -+#define CRC_TABLE -+ -+#ifdef CRC32_CONSTANTS_HEADER -+#include CRC32_CONSTANTS_HEADER -+#else -+#include "crc32_constants.h" -+#endif -+ -+#define VMX_ALIGN 16 -+#define VMX_ALIGN_MASK (VMX_ALIGN-1) -+ -+#ifdef REFLECT -+static unsigned int crc32_align(unsigned int crc, const unsigned char *p, -+ unsigned long len) -+{ -+ while (len--) -+ crc = crc_table[(crc ^ *p++) & 0xff] ^ (crc >> 8); -+ return crc; -+} -+#else -+static unsigned int crc32_align(unsigned int crc, const unsigned char *p, -+ unsigned long len) -+{ -+ while (len--) -+ crc = crc_table[((crc >> 24) ^ *p++) & 0xff] ^ (crc << 8); -+ return crc; -+} -+#endif -+ -+static unsigned int __attribute__ ((aligned (32))) -+__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len); -+ -+#ifndef CRC32_FUNCTION -+#define CRC32_FUNCTION crc32_vpmsum -+#endif -+ -+unsigned int CRC32_FUNCTION(unsigned int crc, const unsigned char *p, -+ unsigned long len) -+{ -+ unsigned int prealign; -+ unsigned int tail; -+ -+#ifdef CRC_XOR -+ crc ^= 0xffffffff; -+#endif -+ -+ if (len < VMX_ALIGN + VMX_ALIGN_MASK) { -+ crc = crc32_align(crc, p, len); -+ goto out; -+ } -+ -+ if ((unsigned long)p & VMX_ALIGN_MASK) { -+ prealign = VMX_ALIGN - ((unsigned long)p & VMX_ALIGN_MASK); -+ crc = crc32_align(crc, p, prealign); -+ len -= prealign; -+ p += prealign; -+ } -+ -+ crc = __crc32_vpmsum(crc, p, len & ~VMX_ALIGN_MASK); -+ -+ tail = len & VMX_ALIGN_MASK; -+ if (tail) { -+ p += len & ~VMX_ALIGN_MASK; -+ crc = crc32_align(crc, p, tail); -+ } -+ -+out: -+#ifdef CRC_XOR -+ crc ^= 0xffffffff; -+#endif -+ -+ return crc; -+} -+ -+#if defined (__clang__) -+#include "clang_workaround.h" -+#else -+#define __builtin_pack_vector(a, b) __builtin_pack_vector_int128 ((a), (b)) -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 0) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 1) -+#endif -+ -+/* When we have a load-store in a single-dispatch group and address overlap -+ * such that foward is not allowed (load-hit-store) the group must be flushed. -+ * A group ending NOP prevents the flush. -+ */ -+#define GROUP_ENDING_NOP asm("ori 2,2,0" ::: "memory") -+ -+#if defined(__BIG_ENDIAN__) && defined (REFLECT) -+#define BYTESWAP_DATA -+#elif defined(__LITTLE_ENDIAN__) && !defined(REFLECT) -+#define BYTESWAP_DATA -+#endif -+ -+#ifdef BYTESWAP_DATA -+#define VEC_PERM(vr, va, vb, vc) vr = vec_perm(va, vb,\ -+ (__vector unsigned char) vc) -+#if defined(__LITTLE_ENDIAN__) -+/* Byte reverse permute constant LE. */ -+static const __vector unsigned long long vperm_const -+ __attribute__ ((aligned(16))) = { 0x08090A0B0C0D0E0FUL, -+ 0x0001020304050607UL }; -+#else -+static const __vector unsigned long long vperm_const -+ __attribute__ ((aligned(16))) = { 0x0F0E0D0C0B0A0908UL, -+ 0X0706050403020100UL }; -+#endif -+#else -+#define VEC_PERM(vr, va, vb, vc) -+#endif -+ -+static unsigned int __attribute__ ((aligned (32))) -+__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len) { -+ -+ const __vector unsigned long long vzero = {0,0}; -+ const __vector unsigned long long vones = {0xffffffffffffffffUL, -+ 0xffffffffffffffffUL}; -+ -+#ifdef REFLECT -+ const __vector unsigned long long vmask_32bit = -+ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, -+ (__vector unsigned char)vones, 4); -+#endif -+ -+ const __vector unsigned long long vmask_64bit = -+ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, -+ (__vector unsigned char)vones, 8); -+ -+ __vector unsigned long long vcrc; -+ -+ __vector unsigned long long vconst1, vconst2; -+ -+ /* vdata0-vdata7 will contain our data (p). */ -+ __vector unsigned long long vdata0, vdata1, vdata2, vdata3, vdata4, -+ vdata5, vdata6, vdata7; -+ -+ /* v0-v7 will contain our checksums */ -+ __vector unsigned long long v0 = {0,0}; -+ __vector unsigned long long v1 = {0,0}; -+ __vector unsigned long long v2 = {0,0}; -+ __vector unsigned long long v3 = {0,0}; -+ __vector unsigned long long v4 = {0,0}; -+ __vector unsigned long long v5 = {0,0}; -+ __vector unsigned long long v6 = {0,0}; -+ __vector unsigned long long v7 = {0,0}; -+ -+ -+ /* Vector auxiliary variables. */ -+ __vector unsigned long long va0, va1, va2, va3, va4, va5, va6, va7; -+ -+ unsigned int result = 0; -+ unsigned int offset; /* Constant table offset. */ -+ -+ unsigned long i; /* Counter. */ -+ unsigned long chunks; -+ -+ unsigned long block_size; -+ int next_block = 0; -+ -+ /* Align by 128 bits. The last 128 bit block will be processed at end. */ -+ unsigned long length = len & 0xFFFFFFFFFFFFFF80UL; -+ -+#ifdef REFLECT -+ vcrc = (__vector unsigned long long)__builtin_pack_vector(0UL, crc); -+#else -+ vcrc = (__vector unsigned long long)__builtin_pack_vector(crc, 0UL); -+ -+ /* Shift into top 32 bits */ -+ vcrc = (__vector unsigned long long)vec_sld((__vector unsigned char)vcrc, -+ (__vector unsigned char)vzero, 4); -+#endif -+ -+ /* Short version. */ -+ if (len < 256) { -+ /* Calculate where in the constant table we need to start. */ -+ offset = 256 - len; -+ -+ vconst1 = vec_ld(offset, vcrc_short_const); -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); -+ -+ /* xor initial value*/ -+ vdata0 = vec_xor(vdata0, vcrc); -+ -+ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw -+ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); -+ v0 = vec_xor(v0, vdata0); -+ -+ for (i = 16; i < len; i += 16) { -+ vconst1 = vec_ld(offset + i, vcrc_short_const); -+ vdata0 = vec_ld(i, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); -+ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw -+ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); -+ v0 = vec_xor(v0, vdata0); -+ } -+ } else { -+ -+ /* Load initial values. */ -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ /* xor in initial value */ -+ vdata0 = vec_xor(vdata0, vcrc); -+ -+ p = (char *)p + 128; -+ -+ do { -+ /* Checksum in blocks of MAX_SIZE. */ -+ block_size = length; -+ if (block_size > MAX_SIZE) { -+ block_size = MAX_SIZE; -+ } -+ -+ length = length - block_size; -+ -+ /* -+ * Work out the offset into the constants table to start at. Each -+ * constant is 16 bytes, and it is used against 128 bytes of input -+ * data - 128 / 16 = 8 -+ */ -+ offset = (MAX_SIZE/8) - (block_size/8); -+ /* We reduce our final 128 bytes in a separate step */ -+ chunks = (block_size/128)-1; -+ -+ vconst1 = vec_ld(offset, vcrc_const); -+ -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata0, -+ (__vector unsigned long long)vconst1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata1, -+ (__vector unsigned long long)vconst1); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata2, -+ (__vector unsigned long long)vconst1); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata3, -+ (__vector unsigned long long)vconst1); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata4, -+ (__vector unsigned long long)vconst1); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata5, -+ (__vector unsigned long long)vconst1); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata6, -+ (__vector unsigned long long)vconst1); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata7, -+ (__vector unsigned long long)vconst1); -+ -+ if (chunks > 1) { -+ offset += 16; -+ vconst2 = vec_ld(offset, vcrc_const); -+ GROUP_ENDING_NOP; -+ -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ p = (char *)p + 128; -+ -+ /* -+ * main loop. We modulo schedule it such that it takes three -+ * iterations to complete - first iteration load, second -+ * iteration vpmsum, third iteration xor. -+ */ -+ for (i = 0; i < chunks-2; i++) { -+ vconst1 = vec_ld(offset, vcrc_const); -+ offset += 16; -+ GROUP_ENDING_NOP; -+ -+ v0 = vec_xor(v0, va0); -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata0, (__vector unsigned long long)vconst2); -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v1 = vec_xor(v1, va1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata1, (__vector unsigned long long)vconst2); -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v2 = vec_xor(v2, va2); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata2, (__vector unsigned long long)vconst2); -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v3 = vec_xor(v3, va3); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata3, (__vector unsigned long long)vconst2); -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vconst2 = vec_ld(offset, vcrc_const); -+ GROUP_ENDING_NOP; -+ -+ v4 = vec_xor(v4, va4); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata4, (__vector unsigned long long)vconst1); -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v5 = vec_xor(v5, va5); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata5, (__vector unsigned long long)vconst1); -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v6 = vec_xor(v6, va6); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata6, (__vector unsigned long long)vconst1); -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v7 = vec_xor(v7, va7); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata7, (__vector unsigned long long)vconst1); -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ p = (char *)p + 128; -+ } -+ -+ /* First cool down*/ -+ vconst1 = vec_ld(offset, vcrc_const); -+ offset += 16; -+ -+ v0 = vec_xor(v0, va0); -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata0, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v1 = vec_xor(v1, va1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata1, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v2 = vec_xor(v2, va2); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata2, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v3 = vec_xor(v3, va3); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata3, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v4 = vec_xor(v4, va4); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata4, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v5 = vec_xor(v5, va5); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata5, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v6 = vec_xor(v6, va6); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata6, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v7 = vec_xor(v7, va7); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata7, (__vector unsigned long long)vconst1); -+ }/* else */ -+ -+ /* Second cool down. */ -+ v0 = vec_xor(v0, va0); -+ v1 = vec_xor(v1, va1); -+ v2 = vec_xor(v2, va2); -+ v3 = vec_xor(v3, va3); -+ v4 = vec_xor(v4, va4); -+ v5 = vec_xor(v5, va5); -+ v6 = vec_xor(v6, va6); -+ v7 = vec_xor(v7, va7); -+ -+#ifdef REFLECT -+ /* -+ * vpmsumd produces a 96 bit result in the least significant bits -+ * of the register. Since we are bit reflected we have to shift it -+ * left 32 bits so it occupies the least significant bits in the -+ * bit reflected domain. -+ */ -+ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)vzero, 4); -+ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v1, -+ (__vector unsigned char)vzero, 4); -+ v2 = (__vector unsigned long long)vec_sld((__vector unsigned char)v2, -+ (__vector unsigned char)vzero, 4); -+ v3 = (__vector unsigned long long)vec_sld((__vector unsigned char)v3, -+ (__vector unsigned char)vzero, 4); -+ v4 = (__vector unsigned long long)vec_sld((__vector unsigned char)v4, -+ (__vector unsigned char)vzero, 4); -+ v5 = (__vector unsigned long long)vec_sld((__vector unsigned char)v5, -+ (__vector unsigned char)vzero, 4); -+ v6 = (__vector unsigned long long)vec_sld((__vector unsigned char)v6, -+ (__vector unsigned char)vzero, 4); -+ v7 = (__vector unsigned long long)vec_sld((__vector unsigned char)v7, -+ (__vector unsigned char)vzero, 4); -+#endif -+ -+ /* xor with the last 1024 bits. */ -+ va0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(va0, va0, va0, vperm_const); -+ -+ va1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(va1, va1, va1, vperm_const); -+ -+ va2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(va2, va2, va2, vperm_const); -+ -+ va3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(va3, va3, va3, vperm_const); -+ -+ va4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(va4, va4, va4, vperm_const); -+ -+ va5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(va5, va5, va5, vperm_const); -+ -+ va6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(va6, va6, va6, vperm_const); -+ -+ va7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(va7, va7, va7, vperm_const); -+ -+ p = (char *)p + 128; -+ -+ vdata0 = vec_xor(v0, va0); -+ vdata1 = vec_xor(v1, va1); -+ vdata2 = vec_xor(v2, va2); -+ vdata3 = vec_xor(v3, va3); -+ vdata4 = vec_xor(v4, va4); -+ vdata5 = vec_xor(v5, va5); -+ vdata6 = vec_xor(v6, va6); -+ vdata7 = vec_xor(v7, va7); -+ -+ /* Check if we have more blocks to process */ -+ next_block = 0; -+ if (length != 0) { -+ next_block = 1; -+ -+ /* zero v0-v7 */ -+ v0 = vec_xor(v0, v0); -+ v1 = vec_xor(v1, v1); -+ v2 = vec_xor(v2, v2); -+ v3 = vec_xor(v3, v3); -+ v4 = vec_xor(v4, v4); -+ v5 = vec_xor(v5, v5); -+ v6 = vec_xor(v6, v6); -+ v7 = vec_xor(v7, v7); -+ } -+ length = length + 128; -+ -+ } while (next_block); -+ -+ /* Calculate how many bytes we have left. */ -+ length = (len & 127); -+ -+ /* Calculate where in (short) constant table we need to start. */ -+ offset = 128 - length; -+ -+ v0 = vec_ld(offset, vcrc_short_const); -+ v1 = vec_ld(offset + 16, vcrc_short_const); -+ v2 = vec_ld(offset + 32, vcrc_short_const); -+ v3 = vec_ld(offset + 48, vcrc_short_const); -+ v4 = vec_ld(offset + 64, vcrc_short_const); -+ v5 = vec_ld(offset + 80, vcrc_short_const); -+ v6 = vec_ld(offset + 96, vcrc_short_const); -+ v7 = vec_ld(offset + 112, vcrc_short_const); -+ -+ offset += 128; -+ -+ v0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata0,(__vector unsigned int)v0); -+ v1 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata1,(__vector unsigned int)v1); -+ v2 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata2,(__vector unsigned int)v2); -+ v3 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata3,(__vector unsigned int)v3); -+ v4 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata4,(__vector unsigned int)v4); -+ v5 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata5,(__vector unsigned int)v5); -+ v6 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata6,(__vector unsigned int)v6); -+ v7 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata7,(__vector unsigned int)v7); -+ -+ /* Now reduce the tail (0-112 bytes). */ -+ for (i = 0; i < length; i+=16) { -+ vdata0 = vec_ld(i,(__vector unsigned long long*)p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ va0 = vec_ld(offset + i,vcrc_short_const); -+ va0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata0,(__vector unsigned int)va0); -+ v0 = vec_xor(v0, va0); -+ } -+ -+ /* xor all parallel chunks together. */ -+ v0 = vec_xor(v0, v1); -+ v2 = vec_xor(v2, v3); -+ v4 = vec_xor(v4, v5); -+ v6 = vec_xor(v6, v7); -+ -+ v0 = vec_xor(v0, v2); -+ v4 = vec_xor(v4, v6); -+ -+ v0 = vec_xor(v0, v4); -+ } -+ -+ /* Barrett Reduction */ -+ vconst1 = vec_ld(0, v_Barrett_const); -+ vconst2 = vec_ld(16, v_Barrett_const); -+ -+ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)v0, 8); -+ v0 = vec_xor(v1,v0); -+ -+#ifdef REFLECT -+ /* shift left one bit */ -+ __vector unsigned char vsht_splat = vec_splat_u8 (1); -+ v0 = (__vector unsigned long long)vec_sll ((__vector unsigned char)v0, -+ vsht_splat); -+#endif -+ -+ v0 = vec_and(v0, vmask_64bit); -+ -+#ifndef REFLECT -+ -+ /* -+ * Now for the actual algorithm. The idea is to calculate q, -+ * the multiple of our polynomial that we need to subtract. By -+ * doing the computation 2x bits higher (ie 64 bits) and shifting the -+ * result back down 2x bits, we round down to the nearest multiple. -+ */ -+ -+ /* ma */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v0, -+ (__vector unsigned long long)vconst1); -+ /* q = floor(ma/(2^64)) */ -+ v1 = (__vector unsigned long long)vec_sld ((__vector unsigned char)vzero, -+ (__vector unsigned char)v1, 8); -+ /* qn */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst2); -+ /* a - qn, subtraction is xor in GF(2) */ -+ v0 = vec_xor (v0, v1); -+ /* -+ * Get the result into r3. We need to shift it left 8 bytes: -+ * V0 [ 0 1 2 X ] -+ * V0 [ 0 X 2 3 ] -+ */ -+ result = __builtin_unpack_vector_1 (v0); -+#else -+ -+ /* -+ * The reflected version of Barrett reduction. Instead of bit -+ * reflecting our data (which is expensive to do), we bit reflect our -+ * constants and our algorithm, which means the intermediate data in -+ * our vector registers goes from 0-63 instead of 63-0. We can reflect -+ * the algorithm because we don't carry in mod 2 arithmetic. -+ */ -+ -+ /* bottom 32 bits of a */ -+ v1 = vec_and(v0, vmask_32bit); -+ -+ /* ma */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst1); -+ -+ /* bottom 32bits of ma */ -+ v1 = vec_and(v1, vmask_32bit); -+ /* qn */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst2); -+ /* a - qn, subtraction is xor in GF(2) */ -+ v0 = vec_xor (v0, v1); -+ -+ /* -+ * Since we are bit reflected, the result (ie the low 32 bits) is in -+ * the high 32 bits. We just need to shift it left 4 bytes -+ * V0 [ 0 1 X 3 ] -+ * V0 [ 0 X 2 3 ] -+ */ -+ -+ /* shift result into top 64 bits of */ -+ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)vzero, 4); -+ -+ result = __builtin_unpack_vector_0 (v0); -+#endif -+ -+ return result; -+} -diff --git a/crc32.c b/crc32.c -index 9580440..406d350 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -199,13 +199,78 @@ const z_crc_t FAR * ZEXPORT get_crc_table() - #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - - /* ========================================================================= */ --unsigned long ZEXPORT crc32_z(crc, buf, len) -+local -+unsigned long ZEXPORT crc32_table_lookup(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; - { - if (buf == Z_NULL) return 0UL; - -+ crc = crc ^ 0xffffffffUL; -+ while (len >= 8) { -+ DO8; -+ len -= 8; -+ } -+ if (len) do { -+ DO1; -+ } while (--len); -+ return crc ^ 0xffffffffUL; -+} -+ -+/* Small helper function to compare optfun against the reference table lookup -+ * return test_ref_comparision_##optfn in crc32_z_ifunc -+#include -+#define TEST_COMPARE(optfn) \ -+ static unsigned long test_ref_comparision_ ## optfn(unsigned long crc, const unsigned char FAR *p, z_size_t len) \ -+ { \ -+ unsigned long crc_tbl_lookup = crc32_table_lookup(crc, p, len); \ -+ unsigned long optcrc = optfn(crc, p, len); \ -+ assert( optcrc == crc_tbl_lookup ); \ -+ return optcrc; \ -+ } -+*/ -+ -+#ifdef Z_IFUNC_ASM -+unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, z_size_t) -+ __asm__ ("crc32_z"); -+__asm__(".type crc32_z, %gnu_indirect_function"); -+#elif defined(Z_IFUNC_NATIVE) -+unsigned long ZEXPORT crc32_z( -+ unsigned long crc, -+ const unsigned char FAR *buf, -+ z_size_t len) -+ __attribute__ ((ifunc ("crc32_z_ifunc"))); -+#endif -+ -+#if _ARCH_PWR8==1 -+unsigned long crc32_vpmsum(unsigned long, const unsigned char FAR *, z_size_t); -+/* for testing TEST_COMPARE(crc32_vpmsum) */ -+#ifndef __BUILTIN_CPU_SUPPORTS__ -+#include -+#include -+#endif -+#endif -+ -+/* due to a quirk of gnu_indirect_function - "local" (aka static) is applied to -+ * crc32_z which is not desired. crc32_z_ifunc is implictly "local" */ -+#ifndef Z_IFUNC_ASM -+local -+#endif -+unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, z_size_t) -+{ -+#if _ARCH_PWR8==1 -+#if defined(__BUILTIN_CPU_SUPPORTS__) -+ if (__builtin_cpu_supports("arch_2_07")) -+ return crc32_vpmsum; -+#else -+ if (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) -+ return crc32_vpmsum; -+#endif -+#endif /* _ARCH_PWR8 */ -+ -+/* return a function pointer for optimized arches here */ -+ - #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -@@ -217,22 +282,31 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - - endian = 1; - if (*((unsigned char *)(&endian))) -- return crc32_little(crc, buf, len); -+ return crc32_little; - else -- return crc32_big(crc, buf, len); -+ return crc32_big; - } - #endif /* BYFOUR */ -- crc = crc ^ 0xffffffffUL; -- while (len >= 8) { -- DO8; -- len -= 8; -- } -- if (len) do { -- DO1; -- } while (--len); -- return crc ^ 0xffffffffUL; -+ -+ return crc32_table_lookup; - } - -+#if !defined(Z_IFUNC_ASM) && !defined(Z_IFUNC_NATIVE) -+ -+unsigned long ZEXPORT crc32_z(crc, buf, len) -+ unsigned long crc; -+ const unsigned char FAR *buf; -+ z_size_t len; -+{ -+ static unsigned long ZEXPORT (*crc32_func)(unsigned long, const unsigned char FAR *, z_size_t) = NULL; -+ -+ if (!crc32_func) -+ crc32_func = crc32_z_ifunc(); -+ return (*crc32_func)(crc, buf, len); -+} -+ -+#endif /* defined(Z_IFUNC_ASM) || defined(Z_IFUNC_NATIVE) */ -+ - /* ========================================================================= */ - unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; -@@ -271,6 +345,7 @@ local unsigned long crc32_little(crc, buf, len) - register z_crc_t c; - register const z_crc_t FAR *buf4; - -+ if (buf == Z_NULL) return 0UL; - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { -@@ -311,6 +386,7 @@ local unsigned long crc32_big(crc, buf, len) - register z_crc_t c; - register const z_crc_t FAR *buf4; - -+ if (buf == Z_NULL) return 0UL; - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { --- -2.19.1 - diff --git a/zlib-1.2.12-power-optimizations.patch b/zlib-1.2.12-power-optimizations.patch new file mode 100644 index 0000000..d69117f --- /dev/null +++ b/zlib-1.2.12-power-optimizations.patch @@ -0,0 +1,4363 @@ +From a4d799105cf4fcc16affea4321d1690d9791e3a4 Mon Sep 17 00:00:00 2001 +From: Rogerio Alves +Date: Wed, 20 Nov 2019 10:35:40 -0300 +Subject: [PATCH 1/9] Preparation for Power optimizations + +Optimized functions for Power will make use of GNU indirect functions, +an extension to support different implementations of the same function, +which can be selected during runtime. This will be used to provide +optimized functions for different processor versions. + +Since this is a GNU extension, we placed the definition of the Z_IFUNC +macro under `contrib/gcc`. This can be reused by other archs as well. + +Author: Matheus Castanho +Author: Rogerio Alves +--- + CMakeLists.txt | 67 ++++++++++++++++++++++++++++++++++++++++++ + configure | 66 +++++++++++++++++++++++++++++++++++++++++ + contrib/README.contrib | 8 +++++ + contrib/gcc/zifunc.h | 60 +++++++++++++++++++++++++++++++++++++ + contrib/power/power.h | 4 +++ + 5 files changed, 205 insertions(+) + create mode 100644 contrib/gcc/zifunc.h + create mode 100644 contrib/power/power.h + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e6fbb37..f15782e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,7 @@ set(VERSION "1.2.12") + + option(ASM686 "Enable building i686 assembly implementation") + option(AMD64 "Enable building amd64 assembly implementation") ++option(POWER "Enable building power implementation") + + set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") + set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +@@ -140,6 +141,72 @@ if(CMAKE_COMPILER_IS_GNUCC) + add_definitions(-DASMV) + set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) + endif() ++ ++ # test to see if we can use a GNU indirect function to detect and load optimized code at runtime ++ CHECK_C_SOURCE_COMPILES(" ++ static int test_ifunc_native(void) ++ { ++ return 1; ++ } ++ static int (*(check_ifunc_native(void)))(void) ++ { ++ return test_ifunc_native; ++ } ++ int test_ifunc(void) __attribute__ ((ifunc (\"check_ifunc_native\"))); ++ int main(void) ++ { ++ return 0; ++ } ++ " HAS_C_ATTR_IFUNC) ++ ++ if(HAS_C_ATTR_IFUNC) ++ add_definitions(-DHAVE_IFUNC) ++ set(ZLIB_PRIVATE_HDRS ${ZLIB_PRIVATE_HDRS} contrib/gcc/zifunc.h) ++ endif() ++ ++ if(POWER) ++ # Test to see if we can use the optimizations for Power ++ CHECK_C_SOURCE_COMPILES(" ++ #ifndef _ARCH_PPC ++ #error \"Target is not Power\" ++ #endif ++ #ifndef __BUILTIN_CPU_SUPPORTS__ ++ #error \"Target doesn't support __builtin_cpu_supports()\" ++ #endif ++ int main() { return 0; } ++ " HAS_POWER_SUPPORT) ++ ++ if(HAS_POWER_SUPPORT AND HAS_C_ATTR_IFUNC) ++ add_definitions(-DZ_POWER_OPT) ++ ++ set(CMAKE_REQUIRED_FLAGS -mcpu=power8) ++ CHECK_C_SOURCE_COMPILES("int main(void){return 0;}" POWER8) ++ ++ if(POWER8) ++ add_definitions(-DZ_POWER8) ++ set(ZLIB_POWER8 ) ++ ++ set_source_files_properties( ++ ${ZLIB_POWER8} ++ PROPERTIES COMPILE_FLAGS -mcpu=power8) ++ endif() ++ ++ set(CMAKE_REQUIRED_FLAGS -mcpu=power9) ++ CHECK_C_SOURCE_COMPILES("int main(void){return 0;}" POWER9) ++ ++ if(POWER9) ++ add_definitions(-DZ_POWER9) ++ set(ZLIB_POWER9 ) ++ ++ set_source_files_properties( ++ ${ZLIB_POWER9} ++ PROPERTIES COMPILE_FLAGS -mcpu=power9) ++ endif() ++ ++ set(ZLIB_PRIVATE_HDRS ${ZLIB_PRIVATE_HDRS} contrib/power/power.h) ++ set(ZLIB_SRCS ${ZLIB_SRCS} ${ZLIB_POWER8} ${ZLIB_POWER9}) ++ endif() ++ endif() + endif() + + if(MSVC) +diff --git a/configure b/configure +index 52ff4a0..01ffdf6 100755 +--- a/configure ++++ b/configure +@@ -844,6 +844,73 @@ EOF + fi + fi + ++# test to see if we can use a gnu indirection function to detect and load optimized code at runtime ++echo >> configure.log ++cat > $test.c <> configure.log ++cat > $test.c < $test.c ++ ++ if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then ++ POWER8="-DZ_POWER8" ++ PIC_OBJC="${PIC_OBJC}" ++ OBJC="${OBJC}" ++ echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log ++ else ++ echo "Checking for -mcpu=power8 support... No." | tee -a configure.log ++ fi ++ ++ if tryboth $CC -c $CFLAGS -mcpu=power9 $test.c; then ++ POWER9="-DZ_POWER9" ++ PIC_OBJC="${PIC_OBJC}" ++ OBJC="${OBJC}" ++ echo "Checking for -mcpu=power9 support... Yes." | tee -a configure.log ++ else ++ echo "Checking for -mcpu=power9 support... No." | tee -a configure.log ++ fi ++ ++ SFLAGS="${SFLAGS} ${POWER8} ${POWER9} -DZ_POWER_OPT" ++ CFLAGS="${CFLAGS} ${POWER8} ${POWER9} -DZ_POWER_OPT" ++ echo "Checking for Power optimizations support... Yes." | tee -a configure.log ++else ++ echo "Checking for Power optimizations support... No." | tee -a configure.log ++fi ++ + # Check whether sys/sdt.h is available + cat > $test.c << EOF + #include +diff --git a/contrib/README.contrib b/contrib/README.contrib +index 335e435..12d2f83 100644 +--- a/contrib/README.contrib ++++ b/contrib/README.contrib +@@ -11,6 +11,10 @@ ada/ by Dmitriy Anisimkov + blast/ by Mark Adler + Decompressor for output of PKWare Data Compression Library (DCL) + ++gcc/ by Matheus Castanho ++ and Rogerio Alves ++ Optimization helpers using GCC-specific extensions ++ + delphi/ by Cosmin Truta + Support for Delphi and C++ Builder + +@@ -42,6 +46,10 @@ minizip/ by Gilles Vollant + pascal/ by Bob Dellaca et al. + Support for Pascal + ++power/ by Matheus Castanho ++ and Rogerio Alves ++ Optimized functions for Power processors ++ + puff/ by Mark Adler + Small, low memory usage inflate. Also serves to provide an + unambiguous description of the deflate format. +diff --git a/contrib/gcc/zifunc.h b/contrib/gcc/zifunc.h +new file mode 100644 +index 0000000..daf4fe4 +--- /dev/null ++++ b/contrib/gcc/zifunc.h +@@ -0,0 +1,60 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * 2019 Rogerio Alves , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#ifndef Z_IFUNC_H_ ++#define Z_IFUNC_H_ ++ ++/* Helpers for arch optimizations */ ++ ++#define Z_IFUNC(fname) \ ++ typeof(fname) fname __attribute__ ((ifunc (#fname "_resolver"))); \ ++ local typeof(fname) *fname##_resolver(void) ++/* This is a helper macro to declare a resolver for an indirect function ++ * (ifunc). Let's say you have function ++ * ++ * int foo (int a); ++ * ++ * for which you want to provide different implementations, for example: ++ * ++ * int foo_clever (int a) { ++ * ... clever things ... ++ * } ++ * ++ * int foo_smart (int a) { ++ * ... smart things ... ++ * } ++ * ++ * You will have to declare foo() as an indirect function and also provide a ++ * resolver for it, to choose between foo_clever() and foo_smart() based on ++ * some criteria you define (e.g. processor features). ++ * ++ * Since most likely foo() has a default implementation somewhere in zlib, you ++ * may have to rename it so the 'foo' symbol can be used by the ifunc without ++ * conflicts. ++ * ++ * #define foo foo_default ++ * int foo (int a) { ++ * ... ++ * } ++ * #undef foo ++ * ++ * Now you just have to provide a resolver function to choose which function ++ * should be used (decided at runtime on the first call to foo()): ++ * ++ * Z_IFUNC(foo) { ++ * if (... some condition ...) ++ * return foo_clever; ++ * ++ * if (... other condition ...) ++ * return foo_smart; ++ * ++ * return foo_default; ++ * } ++ * ++ * All calls to foo() throughout the code can remain untouched, all the magic ++ * will be done by the linker using the resolver function. ++ */ ++ ++#endif /* Z_IFUNC_H_ */ +diff --git a/contrib/power/power.h b/contrib/power/power.h +new file mode 100644 +index 0000000..b42c7d6 +--- /dev/null ++++ b/contrib/power/power.h +@@ -0,0 +1,4 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * 2019 Rogerio Alves , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ +-- +2.34.3 + + +From 7429e4962c1948527a21ce77624a2ec2a85d5940 Mon Sep 17 00:00:00 2001 +From: Daniel Black +Date: Wed, 10 Jan 2018 10:50:39 +1100 +Subject: [PATCH 2/9] Add Power8+ optimized crc32 + +This commit adds an optimized version for the crc32 function based +on crc32-vpmsum from https://github.com/antonblanchard/crc32-vpmsum/ + +This is the C implementation created by Rogerio Alves + +It makes use of vector instructions to speed up CRC32 algorithm. +--- + CMakeLists.txt | 7 +- + Makefile.in | 43 +- + configure | 7 +- + contrib/README.contrib | 3 +- + contrib/power/clang_workaround.h | 82 ++ + contrib/power/crc32_constants.h | 1206 ++++++++++++++++++++++++++++++ + contrib/power/crc32_z_power8.c | 679 +++++++++++++++++ + contrib/power/crc32_z_resolver.c | 15 + + contrib/power/power.h | 4 + + crc32.c | 12 + + test/crc32_test.c | 205 +++++ + 12 files changed, 2252 insertions(+), 14 deletions(-) + create mode 100644 contrib/power/clang_workaround.h + create mode 100644 contrib/power/crc32_constants.h + create mode 100644 contrib/power/crc32_z_power8.c + create mode 100644 contrib/power/crc32_z_resolver.c + create mode 100644 test/crc32_test.c + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f15782e..581e1fa 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -184,7 +184,8 @@ if(CMAKE_COMPILER_IS_GNUCC) + + if(POWER8) + add_definitions(-DZ_POWER8) +- set(ZLIB_POWER8 ) ++ set(ZLIB_POWER8 ++ contrib/power/crc32_z_power8.c) + + set_source_files_properties( + ${ZLIB_POWER8} +@@ -301,6 +302,10 @@ add_executable(example test/example.c) + target_link_libraries(example zlib) + add_test(example example) + ++add_executable(crc32_test test/crc32_test.c) ++target_link_libraries(crc32_test zlib) ++add_test(crc32_test crc32_test) ++ + add_executable(minigzip test/minigzip.c) + target_link_libraries(minigzip zlib) + +diff --git a/Makefile.in b/Makefile.in +index 3d858aa..1694304 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -75,11 +75,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + + all: static shared + +-static: example$(EXE) minigzip$(EXE) ++static: crc32_test$(EXE) example$(EXE) minigzip$(EXE) + +-shared: examplesh$(EXE) minigzipsh$(EXE) ++shared: crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) + +-all64: example64$(EXE) minigzip64$(EXE) ++all64: crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) + + check: test + +@@ -87,7 +87,7 @@ test: all teststatic testshared + + teststatic: static + @TMPST=tmpst_$$; \ +- if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ ++ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./crc32_test; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; false; \ +@@ -100,7 +100,7 @@ testshared: shared + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=tmpsh_$$; \ +- if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ ++ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./crc32_testsh; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ +@@ -109,7 +109,7 @@ testshared: shared + + test64: all64 + @TMP64=tmp64_$$; \ +- if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ ++ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./crc32_test64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ +@@ -143,6 +143,9 @@ match.lo: match.S + mv _match.o match.lo + rm -f _match.s + ++crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h ++ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c ++ + dfltcc.o: $(SRCDIR)contrib/s390/dfltcc.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/dfltcc.c + +@@ -157,6 +160,9 @@ example.o: $(SRCDIR)test/example.c $(SRC + minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c + ++crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h ++ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c ++ + example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c + +@@ -162,6 +168,9 @@ adler32.o: $(SRCDIR)adler32.c + crc32.o: $(SRCDIR)crc32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c + ++crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c ++ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c ++ + deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + +@@ -212,6 +221,11 @@ crc32.lo: $(SRCDIR)crc32.c + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c + -@mv objs/crc32.o $@ + ++crc32_z_power8.lo: $(SRCDIR)contrib/power/crc32_z_power8.c ++ -@mkdir objs 2>/dev/null || test -d objs ++ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c ++ -@mv objs/crc32_z_power8.o $@ ++ + deflate.lo: $(SRCDIR)deflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c +@@ -285,18 +299,27 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + ln -s $@ $(SHAREDLIBM) + -@rmdir objs + ++crc32_test$(EXE): crc32_test.o $(STATICLIB) ++ $(CC) $(CFLAGS) -o $@ crc32_test.o $(TEST_LDFLAGS) ++ + example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) + + minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + ++crc32_testsh$(EXE): crc32_test.o $(SHAREDLIBV) ++ $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) ++ + examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + + minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + ++crc32_test64$(EXE): crc32_test64.o $(STATICLIB) ++ $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) ++ + example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +@@ -366,8 +389,8 @@ zconf: $(SRCDIR)zconf.h.in + mostlyclean: clean + clean: + rm -f *.o *.lo *~ \ +- example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ +- example64$(EXE) minigzip64$(EXE) \ ++ crc32_test$(EXE) example$(EXE) minigzip$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ ++ crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ + infcover \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o +@@ -389,7 +412,7 @@ tags: + + adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +-compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h ++compress.o crc32_test.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h + crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h + deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +@@ -399,7 +422,7 @@ trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)tr + + adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +-compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h ++compress.lo crc32_test.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h + crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h + deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +diff --git a/configure b/configure +index 01ffdf6..914d9f4 100755 +--- a/configure ++++ b/configure +@@ -863,6 +863,9 @@ cat > $test.c < + pascal/ by Bob Dellaca et al. + Support for Pascal + +-power/ by Matheus Castanho ++power/ by Daniel Black ++ Matheus Castanho + and Rogerio Alves + Optimized functions for Power processors + +diff --git a/contrib/power/clang_workaround.h b/contrib/power/clang_workaround.h +new file mode 100644 +index 0000000..b5e7dae +--- /dev/null ++++ b/contrib/power/clang_workaround.h +@@ -0,0 +1,82 @@ ++#ifndef CLANG_WORKAROUNDS_H ++#define CLANG_WORKAROUNDS_H ++ ++/* ++ * These stubs fix clang incompatibilities with GCC builtins. ++ */ ++ ++#ifndef __builtin_crypto_vpmsumw ++#define __builtin_crypto_vpmsumw __builtin_crypto_vpmsumb ++#endif ++#ifndef __builtin_crypto_vpmsumd ++#define __builtin_crypto_vpmsumd __builtin_crypto_vpmsumb ++#endif ++ ++static inline ++__vector unsigned long long __attribute__((overloadable)) ++vec_ld(int __a, const __vector unsigned long long* __b) ++{ ++ return (__vector unsigned long long)__builtin_altivec_lvx(__a, __b); ++} ++ ++/* ++ * GCC __builtin_pack_vector_int128 returns a vector __int128_t but Clang ++ * does not recognize this type. On GCC this builtin is translated to a ++ * xxpermdi instruction that only moves the registers __a, __b instead generates ++ * a load. ++ * ++ * Clang has vec_xxpermdi intrinsics. It was implemented in 4.0.0. ++ */ ++static inline ++__vector unsigned long long __builtin_pack_vector (unsigned long __a, ++ unsigned long __b) ++{ ++ #if defined(__BIG_ENDIAN__) ++ __vector unsigned long long __v = {__a, __b}; ++ #else ++ __vector unsigned long long __v = {__b, __a}; ++ #endif ++ return __v; ++} ++ ++#ifndef vec_xxpermdi ++ ++static inline ++unsigned long __builtin_unpack_vector (__vector unsigned long long __v, ++ int __o) ++{ ++ return __v[__o]; ++} ++ ++#if defined(__BIG_ENDIAN__) ++#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 0) ++#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 1) ++#else ++#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 1) ++#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 0) ++#endif ++ ++#else ++ ++static inline ++unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v) ++{ ++ #if defined(__BIG_ENDIAN__) ++ return vec_xxpermdi(__v, __v, 0x0)[1]; ++ #else ++ return vec_xxpermdi(__v, __v, 0x0)[0]; ++ #endif ++} ++ ++static inline ++unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v) ++{ ++ #if defined(__BIG_ENDIAN__) ++ return vec_xxpermdi(__v, __v, 0x3)[1]; ++ #else ++ return vec_xxpermdi(__v, __v, 0x3)[0]; ++ #endif ++} ++#endif /* vec_xxpermdi */ ++ ++#endif +diff --git a/contrib/power/crc32_constants.h b/contrib/power/crc32_constants.h +new file mode 100644 +index 0000000..58088dc +--- /dev/null ++++ b/contrib/power/crc32_constants.h +@@ -0,0 +1,1206 @@ ++/* ++* ++* THIS FILE IS GENERATED WITH ++./crc32_constants -c -r -x 0x04C11DB7 ++ ++* This is from https://github.com/antonblanchard/crc32-vpmsum/ ++* DO NOT MODIFY IT MANUALLY! ++* ++*/ ++ ++#define CRC 0x4c11db7 ++#define CRC_XOR ++#define REFLECT ++#define MAX_SIZE 32768 ++ ++#ifndef __ASSEMBLER__ ++#ifdef CRC_TABLE ++static const unsigned int crc_table[] = { ++ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, ++ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, ++ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, ++ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, ++ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, ++ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, ++ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, ++ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, ++ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, ++ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, ++ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, ++ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, ++ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, ++ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, ++ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, ++ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, ++ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, ++ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, ++ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, ++ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, ++ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, ++ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, ++ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, ++ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, ++ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, ++ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, ++ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, ++ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, ++ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, ++ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, ++ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, ++ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, ++ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, ++ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, ++ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, ++ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, ++ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, ++ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, ++ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, ++ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, ++ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, ++ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, ++ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, ++ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, ++ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, ++ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, ++ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, ++ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, ++ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, ++ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, ++ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, ++ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, ++ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, ++ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, ++ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, ++ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, ++ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, ++ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, ++ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, ++ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, ++ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, ++ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, ++ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, ++ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,}; ++ ++#endif /* CRC_TABLE */ ++#ifdef POWER8_INTRINSICS ++ ++/* Constants */ ++ ++/* Reduce 262144 kbits to 1024 bits */ ++static const __vector unsigned long long vcrc_const[255] ++ __attribute__((aligned (16))) = { ++#ifdef __LITTLE_ENDIAN__ ++ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ ++ { 0x0000000099ea94a8, 0x00000001651797d2 }, ++ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ ++ { 0x00000000945a8420, 0x0000000021e0d56c }, ++ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ ++ { 0x0000000030762706, 0x000000000f95ecaa }, ++ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ ++ { 0x00000001a52fc582, 0x00000001ebd224ac }, ++ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ ++ { 0x00000001a4a7167a, 0x000000000ccb97ca }, ++ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ ++ { 0x000000000c18249a, 0x00000001006ec8a8 }, ++ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ ++ { 0x00000000a924ae7c, 0x000000014f58f196 }, ++ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ ++ { 0x00000001e12ccc12, 0x00000001a7192ca6 }, ++ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ ++ { 0x00000000a0b9d4ac, 0x000000019a64bab2 }, ++ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ ++ { 0x0000000095e8ddfe, 0x0000000014f4ed2e }, ++ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ ++ { 0x00000000233fddc4, 0x000000011092b6a2 }, ++ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ ++ { 0x00000001b4529b62, 0x00000000c8a1629c }, ++ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ ++ { 0x00000001a7fa0e64, 0x000000017bf32e8e }, ++ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ ++ { 0x00000001b5334592, 0x00000001f8cc6582 }, ++ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ ++ { 0x000000011f8ee1b4, 0x000000008631ddf0 }, ++ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ ++ { 0x000000006252e632, 0x000000007e5a76d0 }, ++ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ ++ { 0x00000000ab973e84, 0x000000002b09b31c }, ++ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ ++ { 0x000000007734f5ec, 0x00000001b2df1f84 }, ++ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ ++ { 0x000000007c547798, 0x00000001d6f56afc }, ++ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ ++ { 0x000000007ec40210, 0x00000001b9b5e70c }, ++ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ ++ { 0x00000001ab1695a8, 0x0000000034b626d2 }, ++ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ ++ { 0x0000000090494bba, 0x000000014c53479a }, ++ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ ++ { 0x00000001123fb816, 0x00000001a6d179a4 }, ++ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ ++ { 0x00000001e188c74c, 0x000000015abd16b4 }, ++ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ ++ { 0x00000001c2d3451c, 0x00000000018f9852 }, ++ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ ++ { 0x00000000f55cf1ca, 0x000000001fb3084a }, ++ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ ++ { 0x00000001a0531540, 0x00000000c53dfb04 }, ++ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ ++ { 0x0000000132cd7ebc, 0x00000000e10c9ad6 }, ++ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ ++ { 0x0000000073ab7f36, 0x0000000025aa994a }, ++ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ ++ { 0x0000000041aed1c2, 0x00000000fa3a74c4 }, ++ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ ++ { 0x0000000136c53800, 0x0000000033eb3f40 }, ++ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ ++ { 0x0000000126835a30, 0x000000017193f296 }, ++ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ ++ { 0x000000006241b502, 0x0000000043f6c86a }, ++ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ ++ { 0x00000000d5196ad4, 0x000000016b513ec6 }, ++ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ ++ { 0x000000009cfa769a, 0x00000000c8f25b4e }, ++ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ ++ { 0x00000000920e5df4, 0x00000001a45048ec }, ++ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ ++ { 0x0000000169dc310e, 0x000000000c441004 }, ++ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ ++ { 0x0000000009fc331c, 0x000000000e17cad6 }, ++ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ ++ { 0x000000010d94a81e, 0x00000001253ae964 }, ++ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ ++ { 0x0000000027a20ab2, 0x00000001d7c88ebc }, ++ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ ++ { 0x0000000114f87504, 0x00000001e7ca913a }, ++ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ ++ { 0x000000004b076d96, 0x0000000033ed078a }, ++ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ ++ { 0x00000000da4d1e74, 0x00000000e1839c78 }, ++ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ ++ { 0x000000001b81f672, 0x00000001322b267e }, ++ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ ++ { 0x000000009367c988, 0x00000000638231b6 }, ++ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ ++ { 0x00000001717214ca, 0x00000001ee7f16f4 }, ++ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ ++ { 0x000000009f47d820, 0x0000000117d9924a }, ++ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ ++ { 0x000000010d9a47d2, 0x00000000e1a9e0c4 }, ++ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ ++ { 0x00000000a696c58c, 0x00000001403731dc }, ++ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ ++ { 0x000000002aa28ec6, 0x00000001a5ea9682 }, ++ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ ++ { 0x00000001fe18fd9a, 0x0000000101c5c578 }, ++ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ ++ { 0x000000019d4fc1ae, 0x00000000dddf6494 }, ++ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ ++ { 0x00000001ba0e3dea, 0x00000000f1c3db28 }, ++ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ ++ { 0x0000000074b59a5e, 0x000000013112fb9c }, ++ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ ++ { 0x00000000f2b5ea98, 0x00000000b680b906 }, ++ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ ++ { 0x0000000187132676, 0x000000001a282932 }, ++ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ ++ { 0x000000010a8c6ad4, 0x0000000089406e7e }, ++ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ ++ { 0x00000001e21dfe70, 0x00000001def6be8c }, ++ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ ++ { 0x00000001da0050e4, 0x0000000075258728 }, ++ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ ++ { 0x00000000772172ae, 0x000000019536090a }, ++ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ ++ { 0x00000000e47724aa, 0x00000000f2455bfc }, ++ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ ++ { 0x000000003cd63ac4, 0x000000018c40baf4 }, ++ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ ++ { 0x00000001bf47d352, 0x000000004cd390d4 }, ++ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ ++ { 0x000000018dc1d708, 0x00000001e4ece95a }, ++ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ ++ { 0x000000002d4620a4, 0x000000001a3ee918 }, ++ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ ++ { 0x0000000058fd1740, 0x000000007c652fb8 }, ++ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ ++ { 0x00000000dadd9bfc, 0x000000011c67842c }, ++ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ ++ { 0x00000001ea2140be, 0x00000000254f759c }, ++ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ ++ { 0x000000009de128ba, 0x000000007ece94ca }, ++ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ ++ { 0x000000013ac3aa8e, 0x0000000038f258c2 }, ++ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ ++ { 0x0000000099980562, 0x00000001cdf17b00 }, ++ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ ++ { 0x00000001c1579c86, 0x000000011f882c16 }, ++ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ ++ { 0x0000000068dbbf94, 0x0000000100093fc8 }, ++ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ ++ { 0x000000004509fb04, 0x00000001cd684f16 }, ++ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ ++ { 0x00000001202f6398, 0x000000004bc6a70a }, ++ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ ++ { 0x000000013aea243e, 0x000000004fc7e8e4 }, ++ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ ++ { 0x00000001b4052ae6, 0x0000000130103f1c }, ++ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ ++ { 0x00000001cd2a0ae8, 0x0000000111b0024c }, ++ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ ++ { 0x00000001fe4aa8b4, 0x000000010b3079da }, ++ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ ++ { 0x00000001d1559a42, 0x000000010192bcc2 }, ++ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ ++ { 0x00000001f3e05ecc, 0x0000000074838d50 }, ++ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ ++ { 0x0000000104ddd2cc, 0x000000001b20f520 }, ++ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ ++ { 0x000000015393153c, 0x0000000050c3590a }, ++ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ ++ { 0x0000000057e942c6, 0x00000000b41cac8e }, ++ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ ++ { 0x000000012c633850, 0x000000000c72cc78 }, ++ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ ++ { 0x00000000ebcaae4c, 0x0000000030cdb032 }, ++ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ ++ { 0x000000013ee532a6, 0x000000013e09fc32 }, ++ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ ++ { 0x00000001bf0cbc7e, 0x000000001ed624d2 }, ++ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ ++ { 0x00000000d50b7a5a, 0x00000000781aee1a }, ++ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ ++ { 0x0000000002fca6e8, 0x00000001c4d8348c }, ++ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ ++ { 0x000000007af40044, 0x0000000057a40336 }, ++ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ ++ { 0x0000000016178744, 0x0000000085544940 }, ++ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ ++ { 0x000000014c177458, 0x000000019cd21e80 }, ++ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ ++ { 0x000000011b6ddf04, 0x000000013eb95bc0 }, ++ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ ++ { 0x00000001f3e29ccc, 0x00000001dfc9fdfc }, ++ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ ++ { 0x0000000135ae7562, 0x00000000cd028bc2 }, ++ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ ++ { 0x0000000190ef812c, 0x0000000090db8c44 }, ++ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ ++ { 0x0000000067a2c786, 0x000000010010a4ce }, ++ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ ++ { 0x0000000048b9496c, 0x00000001c8f4c72c }, ++ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ ++ { 0x000000015a422de6, 0x000000001c26170c }, ++ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ ++ { 0x00000001ef0e3640, 0x00000000e3fccf68 }, ++ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ ++ { 0x00000001006d2d26, 0x00000000d513ed24 }, ++ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ ++ { 0x00000001170d56d6, 0x00000000141beada }, ++ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ ++ { 0x00000000a5fb613c, 0x000000011071aea0 }, ++ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ ++ { 0x0000000040bbf7fc, 0x000000012e19080a }, ++ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ ++ { 0x000000016ac3a5b2, 0x0000000100ecf826 }, ++ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ ++ { 0x00000000abf16230, 0x0000000069b09412 }, ++ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ ++ { 0x00000001ebe23fac, 0x0000000122297bac }, ++ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ ++ { 0x000000008b6a0894, 0x00000000e9e4b068 }, ++ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ ++ { 0x00000001288ea478, 0x000000004b38651a }, ++ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ ++ { 0x000000016619c442, 0x00000001468360e2 }, ++ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ ++ { 0x0000000086230038, 0x00000000121c2408 }, ++ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ ++ { 0x000000017746a756, 0x00000000da7e7d08 }, ++ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ ++ { 0x0000000191b8f8f8, 0x00000001058d7652 }, ++ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ ++ { 0x000000008e167708, 0x000000014a098a90 }, ++ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ ++ { 0x0000000148b22d54, 0x0000000020dbe72e }, ++ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ ++ { 0x0000000044ba2c3c, 0x000000011e7323e8 }, ++ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ ++ { 0x00000000b54d2b52, 0x00000000d5d4bf94 }, ++ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ ++ { 0x0000000005a4fd8a, 0x0000000199d8746c }, ++ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ ++ { 0x0000000139f9fc46, 0x00000000ce9ca8a0 }, ++ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ ++ { 0x000000015a1fa824, 0x00000000136edece }, ++ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ ++ { 0x000000000a61ae4c, 0x000000019b92a068 }, ++ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ ++ { 0x0000000145e9113e, 0x0000000071d62206 }, ++ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ ++ { 0x000000006a348448, 0x00000000dfc50158 }, ++ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ ++ { 0x000000004d80a08c, 0x00000001517626bc }, ++ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ ++ { 0x000000014b6837a0, 0x0000000148d1e4fa }, ++ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ ++ { 0x000000016896a7fc, 0x0000000094d8266e }, ++ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ ++ { 0x000000014f187140, 0x00000000606c5e34 }, ++ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ ++ { 0x000000019581b9da, 0x000000019766beaa }, ++ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ ++ { 0x00000001091bc984, 0x00000001d80c506c }, ++ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ ++ { 0x000000001067223c, 0x000000001e73837c }, ++ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ ++ { 0x00000001ab16ea02, 0x0000000064d587de }, ++ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ ++ { 0x000000013c4598a8, 0x00000000f4a507b0 }, ++ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ ++ { 0x00000000b3735430, 0x0000000040e342fc }, ++ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ ++ { 0x00000001bb3fc0c0, 0x00000001d5ad9c3a }, ++ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ ++ { 0x00000001570ae19c, 0x0000000094a691a4 }, ++ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ ++ { 0x00000001ea910712, 0x00000001271ecdfa }, ++ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ ++ { 0x0000000167127128, 0x000000009e54475a }, ++ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ ++ { 0x0000000019e790a2, 0x00000000c9c099ee }, ++ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ ++ { 0x000000003788f710, 0x000000009a2f736c }, ++ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ ++ { 0x00000001682a160e, 0x00000000bb9f4996 }, ++ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ ++ { 0x000000007f0ebd2e, 0x00000001db688050 }, ++ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ ++ { 0x000000002b032080, 0x00000000e9b10af4 }, ++ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ ++ { 0x00000000cfd1664a, 0x000000012d4545e4 }, ++ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ ++ { 0x00000000aa1181c2, 0x000000000361139c }, ++ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ ++ { 0x00000000ddd08002, 0x00000001a5a1a3a8 }, ++ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ ++ { 0x00000000e8dd0446, 0x000000006844e0b0 }, ++ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ ++ { 0x00000001bbd94a00, 0x00000000c3762f28 }, ++ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ ++ { 0x00000000ab6cd180, 0x00000001d26287a2 }, ++ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ ++ { 0x0000000031803ce2, 0x00000001f6f0bba8 }, ++ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ ++ { 0x0000000024f40b0c, 0x000000002ffabd62 }, ++ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ ++ { 0x00000001ba1d9834, 0x00000000fb4516b8 }, ++ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ ++ { 0x0000000104de61aa, 0x000000018cfa961c }, ++ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ ++ { 0x0000000113e40d46, 0x000000019e588d52 }, ++ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ ++ { 0x00000001415598a0, 0x00000001180f0bbc }, ++ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ ++ { 0x00000000bf6c8c90, 0x00000000e1d9177a }, ++ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ ++ { 0x00000001788b0504, 0x0000000105abc27c }, ++ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ ++ { 0x0000000038385d02, 0x00000000972e4a58 }, ++ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ ++ { 0x00000001b6c83844, 0x0000000183499a5e }, ++ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ ++ { 0x0000000051061a8a, 0x00000001c96a8cca }, ++ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ ++ { 0x000000017351388a, 0x00000001a1a5b60c }, ++ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ ++ { 0x0000000132928f92, 0x00000000e4b6ac9c }, ++ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ ++ { 0x00000000e6b4f48a, 0x00000001807e7f5a }, ++ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ ++ { 0x0000000039d15e90, 0x000000017a7e3bc8 }, ++ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ ++ { 0x00000000312d6074, 0x00000000d73975da }, ++ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ ++ { 0x000000017bbb2cc4, 0x000000017375d038 }, ++ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ ++ { 0x000000016ded3e18, 0x00000000193680bc }, ++ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ ++ { 0x00000000f1638b16, 0x00000000999b06f6 }, ++ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ ++ { 0x00000001d38b9ecc, 0x00000001f685d2b8 }, ++ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ ++ { 0x000000018b8d09dc, 0x00000001f4ecbed2 }, ++ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ ++ { 0x00000000e7bc27d2, 0x00000000ba16f1a0 }, ++ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ ++ { 0x00000000275e1e96, 0x0000000115aceac4 }, ++ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ ++ { 0x00000000e2e3031e, 0x00000001aeff6292 }, ++ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ ++ { 0x00000001041c84d8, 0x000000009640124c }, ++ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ ++ { 0x00000000706ce672, 0x0000000114f41f02 }, ++ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ ++ { 0x000000015d5070da, 0x000000009c5f3586 }, ++ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ ++ { 0x0000000038f9493a, 0x00000001878275fa }, ++ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ ++ { 0x00000000a3348a76, 0x00000000ddc42ce8 }, ++ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ ++ { 0x00000001ad0aab92, 0x0000000181d2c73a }, ++ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ ++ { 0x000000019e85f712, 0x0000000141c9320a }, ++ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ ++ { 0x000000005a871e76, 0x000000015235719a }, ++ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ ++ { 0x000000017249c662, 0x00000000be27d804 }, ++ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ ++ { 0x000000003a084712, 0x000000006242d45a }, ++ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ ++ { 0x00000000ed438478, 0x000000009a53638e }, ++ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ ++ { 0x00000000abac34cc, 0x00000001001ecfb6 }, ++ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ ++ { 0x000000005f35ef3e, 0x000000016d7c2d64 }, ++ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ ++ { 0x0000000047d6608c, 0x00000001d0ce46c0 }, ++ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ ++ { 0x000000002d01470e, 0x0000000124c907b4 }, ++ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ ++ { 0x0000000158bbc7b0, 0x0000000018a555ca }, ++ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ ++ { 0x00000000c0a23e8e, 0x000000006b0980bc }, ++ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ ++ { 0x00000001ebd85c88, 0x000000008bbba964 }, ++ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ ++ { 0x000000019ee20bb2, 0x00000001070a5a1e }, ++ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ ++ { 0x00000001acabf2d6, 0x000000002204322a }, ++ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ ++ { 0x00000001b7963d56, 0x00000000a27524d0 }, ++ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ ++ { 0x000000017bffa1fe, 0x0000000020b1e4ba }, ++ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ ++ { 0x000000001f15333e, 0x0000000032cc27fc }, ++ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ ++ { 0x000000018593129e, 0x0000000044dd22b8 }, ++ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ ++ { 0x000000019cb32602, 0x00000000dffc9e0a }, ++ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ ++ { 0x0000000142b05cc8, 0x00000001b7a0ed14 }, ++ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ ++ { 0x00000001be49e7a4, 0x00000000c7842488 }, ++ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ ++ { 0x0000000108f69d6c, 0x00000001c02a4fee }, ++ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ ++ { 0x000000006c0971f0, 0x000000003c273778 }, ++ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ ++ { 0x000000005b16467a, 0x00000001d63f8894 }, ++ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ ++ { 0x00000001551a628e, 0x000000006be557d6 }, ++ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ ++ { 0x000000019e42ea92, 0x000000006a7806ea }, ++ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ ++ { 0x000000012fa83ff2, 0x000000016155aa0c }, ++ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ ++ { 0x000000011ca9cde0, 0x00000000908650ac }, ++ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ ++ { 0x00000000c8e5cd74, 0x00000000aa5a8084 }, ++ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ ++ { 0x0000000096c27f0c, 0x0000000191bb500a }, ++ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ ++ { 0x000000002baed926, 0x0000000064e9bed0 }, ++ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ ++ { 0x000000017c8de8d2, 0x000000009444f302 }, ++ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ ++ { 0x00000000d43d6068, 0x000000019db07d3c }, ++ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ ++ { 0x00000000cb2c4b26, 0x00000001359e3e6e }, ++ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ ++ { 0x0000000145b8da26, 0x00000001e4f10dd2 }, ++ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ ++ { 0x000000018fff4b08, 0x0000000124f5735e }, ++ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ ++ { 0x0000000150b58ed0, 0x0000000124760a4c }, ++ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ ++ { 0x00000001549f39bc, 0x000000000f1fc186 }, ++ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ ++ { 0x00000000ef4d2f42, 0x00000000150e4cc4 }, ++ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ ++ { 0x00000001b1468572, 0x000000002a6204e8 }, ++ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ ++ { 0x000000013d7403b2, 0x00000000beb1d432 }, ++ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ ++ { 0x00000001a4681842, 0x0000000135f3f1f0 }, ++ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ ++ { 0x0000000167714492, 0x0000000074fe2232 }, ++ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ ++ { 0x00000001e599099a, 0x000000001ac6e2ba }, ++ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ ++ { 0x00000000fe128194, 0x0000000013fca91e }, ++ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ ++ { 0x0000000077e8b990, 0x0000000183f4931e }, ++ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ ++ { 0x00000001a267f63a, 0x00000000b6d9b4e4 }, ++ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ ++ { 0x00000001945c245a, 0x00000000b5188656 }, ++ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ ++ { 0x0000000149002e76, 0x0000000027a81a84 }, ++ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ ++ { 0x00000001bb8310a4, 0x0000000125699258 }, ++ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ ++ { 0x000000019ec60bcc, 0x00000001b23de796 }, ++ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ ++ { 0x000000012d8590ae, 0x00000000fe4365dc }, ++ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ ++ { 0x0000000065b00684, 0x00000000c68f497a }, ++ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ ++ { 0x000000015e5aeadc, 0x00000000fbf521ee }, ++ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ ++ { 0x00000000b77ff2b0, 0x000000015eac3378 }, ++ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ ++ { 0x0000000188da2ff6, 0x0000000134914b90 }, ++ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ ++ { 0x0000000063da929a, 0x0000000016335cfe }, ++ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ ++ { 0x00000001389caa80, 0x000000010372d10c }, ++ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ ++ { 0x000000013db599d2, 0x000000015097b908 }, ++ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ ++ { 0x0000000122505a86, 0x00000001227a7572 }, ++ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ ++ { 0x000000016bd72746, 0x000000009a8f75c0 }, ++ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ ++ { 0x00000001c3faf1d4, 0x00000000682c77a2 }, ++ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ ++ { 0x00000001111c826c, 0x00000000231f091c }, ++ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ ++ { 0x00000000153e9fb2, 0x000000007d4439f2 }, ++ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ ++ { 0x000000002b1f7b60, 0x000000017e221efc }, ++ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ ++ { 0x00000000b1dba570, 0x0000000167457c38 }, ++ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ ++ { 0x00000001f6397b76, 0x00000000bdf081c4 }, ++ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ ++ { 0x0000000156335214, 0x000000016286d6b0 }, ++ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ ++ { 0x00000001d70e3986, 0x00000000c84f001c }, ++ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ ++ { 0x000000003701a774, 0x0000000064efe7c0 }, ++ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ ++ { 0x00000000ac81ef72, 0x000000000ac2d904 }, ++ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ ++ { 0x0000000133212464, 0x00000000fd226d14 }, ++ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ ++ { 0x00000000e4e45610, 0x000000011cfd42e0 }, ++ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ ++ { 0x000000000c1bd370, 0x000000016e5a5678 }, ++ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ ++ { 0x00000001a7b9e7a6, 0x00000001d888fe22 }, ++ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ ++ { 0x000000007d657a10, 0x00000001af77fcd4 } ++#else /* __LITTLE_ENDIAN__ */ ++ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ ++ { 0x00000001651797d2, 0x0000000099ea94a8 }, ++ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ ++ { 0x0000000021e0d56c, 0x00000000945a8420 }, ++ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ ++ { 0x000000000f95ecaa, 0x0000000030762706 }, ++ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ ++ { 0x00000001ebd224ac, 0x00000001a52fc582 }, ++ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ ++ { 0x000000000ccb97ca, 0x00000001a4a7167a }, ++ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ ++ { 0x00000001006ec8a8, 0x000000000c18249a }, ++ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ ++ { 0x000000014f58f196, 0x00000000a924ae7c }, ++ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ ++ { 0x00000001a7192ca6, 0x00000001e12ccc12 }, ++ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ ++ { 0x000000019a64bab2, 0x00000000a0b9d4ac }, ++ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ ++ { 0x0000000014f4ed2e, 0x0000000095e8ddfe }, ++ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ ++ { 0x000000011092b6a2, 0x00000000233fddc4 }, ++ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ ++ { 0x00000000c8a1629c, 0x00000001b4529b62 }, ++ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ ++ { 0x000000017bf32e8e, 0x00000001a7fa0e64 }, ++ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ ++ { 0x00000001f8cc6582, 0x00000001b5334592 }, ++ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ ++ { 0x000000008631ddf0, 0x000000011f8ee1b4 }, ++ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ ++ { 0x000000007e5a76d0, 0x000000006252e632 }, ++ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ ++ { 0x000000002b09b31c, 0x00000000ab973e84 }, ++ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ ++ { 0x00000001b2df1f84, 0x000000007734f5ec }, ++ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ ++ { 0x00000001d6f56afc, 0x000000007c547798 }, ++ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ ++ { 0x00000001b9b5e70c, 0x000000007ec40210 }, ++ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ ++ { 0x0000000034b626d2, 0x00000001ab1695a8 }, ++ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ ++ { 0x000000014c53479a, 0x0000000090494bba }, ++ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ ++ { 0x00000001a6d179a4, 0x00000001123fb816 }, ++ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ ++ { 0x000000015abd16b4, 0x00000001e188c74c }, ++ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ ++ { 0x00000000018f9852, 0x00000001c2d3451c }, ++ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ ++ { 0x000000001fb3084a, 0x00000000f55cf1ca }, ++ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ ++ { 0x00000000c53dfb04, 0x00000001a0531540 }, ++ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ ++ { 0x00000000e10c9ad6, 0x0000000132cd7ebc }, ++ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ ++ { 0x0000000025aa994a, 0x0000000073ab7f36 }, ++ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ ++ { 0x00000000fa3a74c4, 0x0000000041aed1c2 }, ++ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ ++ { 0x0000000033eb3f40, 0x0000000136c53800 }, ++ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ ++ { 0x000000017193f296, 0x0000000126835a30 }, ++ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ ++ { 0x0000000043f6c86a, 0x000000006241b502 }, ++ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ ++ { 0x000000016b513ec6, 0x00000000d5196ad4 }, ++ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ ++ { 0x00000000c8f25b4e, 0x000000009cfa769a }, ++ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ ++ { 0x00000001a45048ec, 0x00000000920e5df4 }, ++ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ ++ { 0x000000000c441004, 0x0000000169dc310e }, ++ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ ++ { 0x000000000e17cad6, 0x0000000009fc331c }, ++ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ ++ { 0x00000001253ae964, 0x000000010d94a81e }, ++ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ ++ { 0x00000001d7c88ebc, 0x0000000027a20ab2 }, ++ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ ++ { 0x00000001e7ca913a, 0x0000000114f87504 }, ++ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ ++ { 0x0000000033ed078a, 0x000000004b076d96 }, ++ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ ++ { 0x00000000e1839c78, 0x00000000da4d1e74 }, ++ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ ++ { 0x00000001322b267e, 0x000000001b81f672 }, ++ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ ++ { 0x00000000638231b6, 0x000000009367c988 }, ++ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ ++ { 0x00000001ee7f16f4, 0x00000001717214ca }, ++ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ ++ { 0x0000000117d9924a, 0x000000009f47d820 }, ++ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ ++ { 0x00000000e1a9e0c4, 0x000000010d9a47d2 }, ++ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ ++ { 0x00000001403731dc, 0x00000000a696c58c }, ++ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ ++ { 0x00000001a5ea9682, 0x000000002aa28ec6 }, ++ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ ++ { 0x0000000101c5c578, 0x00000001fe18fd9a }, ++ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ ++ { 0x00000000dddf6494, 0x000000019d4fc1ae }, ++ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ ++ { 0x00000000f1c3db28, 0x00000001ba0e3dea }, ++ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ ++ { 0x000000013112fb9c, 0x0000000074b59a5e }, ++ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ ++ { 0x00000000b680b906, 0x00000000f2b5ea98 }, ++ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ ++ { 0x000000001a282932, 0x0000000187132676 }, ++ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ ++ { 0x0000000089406e7e, 0x000000010a8c6ad4 }, ++ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ ++ { 0x00000001def6be8c, 0x00000001e21dfe70 }, ++ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ ++ { 0x0000000075258728, 0x00000001da0050e4 }, ++ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ ++ { 0x000000019536090a, 0x00000000772172ae }, ++ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ ++ { 0x00000000f2455bfc, 0x00000000e47724aa }, ++ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ ++ { 0x000000018c40baf4, 0x000000003cd63ac4 }, ++ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ ++ { 0x000000004cd390d4, 0x00000001bf47d352 }, ++ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ ++ { 0x00000001e4ece95a, 0x000000018dc1d708 }, ++ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ ++ { 0x000000001a3ee918, 0x000000002d4620a4 }, ++ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ ++ { 0x000000007c652fb8, 0x0000000058fd1740 }, ++ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ ++ { 0x000000011c67842c, 0x00000000dadd9bfc }, ++ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ ++ { 0x00000000254f759c, 0x00000001ea2140be }, ++ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ ++ { 0x000000007ece94ca, 0x000000009de128ba }, ++ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ ++ { 0x0000000038f258c2, 0x000000013ac3aa8e }, ++ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ ++ { 0x00000001cdf17b00, 0x0000000099980562 }, ++ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ ++ { 0x000000011f882c16, 0x00000001c1579c86 }, ++ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ ++ { 0x0000000100093fc8, 0x0000000068dbbf94 }, ++ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ ++ { 0x00000001cd684f16, 0x000000004509fb04 }, ++ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ ++ { 0x000000004bc6a70a, 0x00000001202f6398 }, ++ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ ++ { 0x000000004fc7e8e4, 0x000000013aea243e }, ++ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ ++ { 0x0000000130103f1c, 0x00000001b4052ae6 }, ++ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ ++ { 0x0000000111b0024c, 0x00000001cd2a0ae8 }, ++ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ ++ { 0x000000010b3079da, 0x00000001fe4aa8b4 }, ++ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ ++ { 0x000000010192bcc2, 0x00000001d1559a42 }, ++ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ ++ { 0x0000000074838d50, 0x00000001f3e05ecc }, ++ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ ++ { 0x000000001b20f520, 0x0000000104ddd2cc }, ++ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ ++ { 0x0000000050c3590a, 0x000000015393153c }, ++ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ ++ { 0x00000000b41cac8e, 0x0000000057e942c6 }, ++ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ ++ { 0x000000000c72cc78, 0x000000012c633850 }, ++ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ ++ { 0x0000000030cdb032, 0x00000000ebcaae4c }, ++ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ ++ { 0x000000013e09fc32, 0x000000013ee532a6 }, ++ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ ++ { 0x000000001ed624d2, 0x00000001bf0cbc7e }, ++ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ ++ { 0x00000000781aee1a, 0x00000000d50b7a5a }, ++ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ ++ { 0x00000001c4d8348c, 0x0000000002fca6e8 }, ++ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ ++ { 0x0000000057a40336, 0x000000007af40044 }, ++ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ ++ { 0x0000000085544940, 0x0000000016178744 }, ++ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ ++ { 0x000000019cd21e80, 0x000000014c177458 }, ++ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ ++ { 0x000000013eb95bc0, 0x000000011b6ddf04 }, ++ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ ++ { 0x00000001dfc9fdfc, 0x00000001f3e29ccc }, ++ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ ++ { 0x00000000cd028bc2, 0x0000000135ae7562 }, ++ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ ++ { 0x0000000090db8c44, 0x0000000190ef812c }, ++ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ ++ { 0x000000010010a4ce, 0x0000000067a2c786 }, ++ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ ++ { 0x00000001c8f4c72c, 0x0000000048b9496c }, ++ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ ++ { 0x000000001c26170c, 0x000000015a422de6 }, ++ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ ++ { 0x00000000e3fccf68, 0x00000001ef0e3640 }, ++ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ ++ { 0x00000000d513ed24, 0x00000001006d2d26 }, ++ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ ++ { 0x00000000141beada, 0x00000001170d56d6 }, ++ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ ++ { 0x000000011071aea0, 0x00000000a5fb613c }, ++ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ ++ { 0x000000012e19080a, 0x0000000040bbf7fc }, ++ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ ++ { 0x0000000100ecf826, 0x000000016ac3a5b2 }, ++ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ ++ { 0x0000000069b09412, 0x00000000abf16230 }, ++ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ ++ { 0x0000000122297bac, 0x00000001ebe23fac }, ++ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ ++ { 0x00000000e9e4b068, 0x000000008b6a0894 }, ++ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ ++ { 0x000000004b38651a, 0x00000001288ea478 }, ++ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ ++ { 0x00000001468360e2, 0x000000016619c442 }, ++ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ ++ { 0x00000000121c2408, 0x0000000086230038 }, ++ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ ++ { 0x00000000da7e7d08, 0x000000017746a756 }, ++ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ ++ { 0x00000001058d7652, 0x0000000191b8f8f8 }, ++ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ ++ { 0x000000014a098a90, 0x000000008e167708 }, ++ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ ++ { 0x0000000020dbe72e, 0x0000000148b22d54 }, ++ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ ++ { 0x000000011e7323e8, 0x0000000044ba2c3c }, ++ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ ++ { 0x00000000d5d4bf94, 0x00000000b54d2b52 }, ++ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ ++ { 0x0000000199d8746c, 0x0000000005a4fd8a }, ++ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ ++ { 0x00000000ce9ca8a0, 0x0000000139f9fc46 }, ++ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ ++ { 0x00000000136edece, 0x000000015a1fa824 }, ++ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ ++ { 0x000000019b92a068, 0x000000000a61ae4c }, ++ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ ++ { 0x0000000071d62206, 0x0000000145e9113e }, ++ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ ++ { 0x00000000dfc50158, 0x000000006a348448 }, ++ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ ++ { 0x00000001517626bc, 0x000000004d80a08c }, ++ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ ++ { 0x0000000148d1e4fa, 0x000000014b6837a0 }, ++ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ ++ { 0x0000000094d8266e, 0x000000016896a7fc }, ++ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ ++ { 0x00000000606c5e34, 0x000000014f187140 }, ++ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ ++ { 0x000000019766beaa, 0x000000019581b9da }, ++ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ ++ { 0x00000001d80c506c, 0x00000001091bc984 }, ++ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ ++ { 0x000000001e73837c, 0x000000001067223c }, ++ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ ++ { 0x0000000064d587de, 0x00000001ab16ea02 }, ++ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ ++ { 0x00000000f4a507b0, 0x000000013c4598a8 }, ++ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ ++ { 0x0000000040e342fc, 0x00000000b3735430 }, ++ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ ++ { 0x00000001d5ad9c3a, 0x00000001bb3fc0c0 }, ++ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ ++ { 0x0000000094a691a4, 0x00000001570ae19c }, ++ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ ++ { 0x00000001271ecdfa, 0x00000001ea910712 }, ++ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ ++ { 0x000000009e54475a, 0x0000000167127128 }, ++ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ ++ { 0x00000000c9c099ee, 0x0000000019e790a2 }, ++ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ ++ { 0x000000009a2f736c, 0x000000003788f710 }, ++ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ ++ { 0x00000000bb9f4996, 0x00000001682a160e }, ++ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ ++ { 0x00000001db688050, 0x000000007f0ebd2e }, ++ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ ++ { 0x00000000e9b10af4, 0x000000002b032080 }, ++ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ ++ { 0x000000012d4545e4, 0x00000000cfd1664a }, ++ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ ++ { 0x000000000361139c, 0x00000000aa1181c2 }, ++ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ ++ { 0x00000001a5a1a3a8, 0x00000000ddd08002 }, ++ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ ++ { 0x000000006844e0b0, 0x00000000e8dd0446 }, ++ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ ++ { 0x00000000c3762f28, 0x00000001bbd94a00 }, ++ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ ++ { 0x00000001d26287a2, 0x00000000ab6cd180 }, ++ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ ++ { 0x00000001f6f0bba8, 0x0000000031803ce2 }, ++ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ ++ { 0x000000002ffabd62, 0x0000000024f40b0c }, ++ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ ++ { 0x00000000fb4516b8, 0x00000001ba1d9834 }, ++ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ ++ { 0x000000018cfa961c, 0x0000000104de61aa }, ++ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ ++ { 0x000000019e588d52, 0x0000000113e40d46 }, ++ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ ++ { 0x00000001180f0bbc, 0x00000001415598a0 }, ++ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ ++ { 0x00000000e1d9177a, 0x00000000bf6c8c90 }, ++ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ ++ { 0x0000000105abc27c, 0x00000001788b0504 }, ++ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ ++ { 0x00000000972e4a58, 0x0000000038385d02 }, ++ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ ++ { 0x0000000183499a5e, 0x00000001b6c83844 }, ++ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ ++ { 0x00000001c96a8cca, 0x0000000051061a8a }, ++ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ ++ { 0x00000001a1a5b60c, 0x000000017351388a }, ++ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ ++ { 0x00000000e4b6ac9c, 0x0000000132928f92 }, ++ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ ++ { 0x00000001807e7f5a, 0x00000000e6b4f48a }, ++ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ ++ { 0x000000017a7e3bc8, 0x0000000039d15e90 }, ++ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ ++ { 0x00000000d73975da, 0x00000000312d6074 }, ++ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ ++ { 0x000000017375d038, 0x000000017bbb2cc4 }, ++ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ ++ { 0x00000000193680bc, 0x000000016ded3e18 }, ++ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ ++ { 0x00000000999b06f6, 0x00000000f1638b16 }, ++ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ ++ { 0x00000001f685d2b8, 0x00000001d38b9ecc }, ++ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ ++ { 0x00000001f4ecbed2, 0x000000018b8d09dc }, ++ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ ++ { 0x00000000ba16f1a0, 0x00000000e7bc27d2 }, ++ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ ++ { 0x0000000115aceac4, 0x00000000275e1e96 }, ++ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ ++ { 0x00000001aeff6292, 0x00000000e2e3031e }, ++ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ ++ { 0x000000009640124c, 0x00000001041c84d8 }, ++ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ ++ { 0x0000000114f41f02, 0x00000000706ce672 }, ++ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ ++ { 0x000000009c5f3586, 0x000000015d5070da }, ++ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ ++ { 0x00000001878275fa, 0x0000000038f9493a }, ++ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ ++ { 0x00000000ddc42ce8, 0x00000000a3348a76 }, ++ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ ++ { 0x0000000181d2c73a, 0x00000001ad0aab92 }, ++ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ ++ { 0x0000000141c9320a, 0x000000019e85f712 }, ++ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ ++ { 0x000000015235719a, 0x000000005a871e76 }, ++ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ ++ { 0x00000000be27d804, 0x000000017249c662 }, ++ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ ++ { 0x000000006242d45a, 0x000000003a084712 }, ++ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ ++ { 0x000000009a53638e, 0x00000000ed438478 }, ++ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ ++ { 0x00000001001ecfb6, 0x00000000abac34cc }, ++ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ ++ { 0x000000016d7c2d64, 0x000000005f35ef3e }, ++ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ ++ { 0x00000001d0ce46c0, 0x0000000047d6608c }, ++ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ ++ { 0x0000000124c907b4, 0x000000002d01470e }, ++ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ ++ { 0x0000000018a555ca, 0x0000000158bbc7b0 }, ++ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ ++ { 0x000000006b0980bc, 0x00000000c0a23e8e }, ++ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ ++ { 0x000000008bbba964, 0x00000001ebd85c88 }, ++ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ ++ { 0x00000001070a5a1e, 0x000000019ee20bb2 }, ++ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ ++ { 0x000000002204322a, 0x00000001acabf2d6 }, ++ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ ++ { 0x00000000a27524d0, 0x00000001b7963d56 }, ++ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ ++ { 0x0000000020b1e4ba, 0x000000017bffa1fe }, ++ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ ++ { 0x0000000032cc27fc, 0x000000001f15333e }, ++ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ ++ { 0x0000000044dd22b8, 0x000000018593129e }, ++ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ ++ { 0x00000000dffc9e0a, 0x000000019cb32602 }, ++ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ ++ { 0x00000001b7a0ed14, 0x0000000142b05cc8 }, ++ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ ++ { 0x00000000c7842488, 0x00000001be49e7a4 }, ++ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ ++ { 0x00000001c02a4fee, 0x0000000108f69d6c }, ++ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ ++ { 0x000000003c273778, 0x000000006c0971f0 }, ++ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ ++ { 0x00000001d63f8894, 0x000000005b16467a }, ++ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ ++ { 0x000000006be557d6, 0x00000001551a628e }, ++ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ ++ { 0x000000006a7806ea, 0x000000019e42ea92 }, ++ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ ++ { 0x000000016155aa0c, 0x000000012fa83ff2 }, ++ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ ++ { 0x00000000908650ac, 0x000000011ca9cde0 }, ++ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ ++ { 0x00000000aa5a8084, 0x00000000c8e5cd74 }, ++ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ ++ { 0x0000000191bb500a, 0x0000000096c27f0c }, ++ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ ++ { 0x0000000064e9bed0, 0x000000002baed926 }, ++ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ ++ { 0x000000009444f302, 0x000000017c8de8d2 }, ++ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ ++ { 0x000000019db07d3c, 0x00000000d43d6068 }, ++ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ ++ { 0x00000001359e3e6e, 0x00000000cb2c4b26 }, ++ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ ++ { 0x00000001e4f10dd2, 0x0000000145b8da26 }, ++ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ ++ { 0x0000000124f5735e, 0x000000018fff4b08 }, ++ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ ++ { 0x0000000124760a4c, 0x0000000150b58ed0 }, ++ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ ++ { 0x000000000f1fc186, 0x00000001549f39bc }, ++ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ ++ { 0x00000000150e4cc4, 0x00000000ef4d2f42 }, ++ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ ++ { 0x000000002a6204e8, 0x00000001b1468572 }, ++ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ ++ { 0x00000000beb1d432, 0x000000013d7403b2 }, ++ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ ++ { 0x0000000135f3f1f0, 0x00000001a4681842 }, ++ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ ++ { 0x0000000074fe2232, 0x0000000167714492 }, ++ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ ++ { 0x000000001ac6e2ba, 0x00000001e599099a }, ++ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ ++ { 0x0000000013fca91e, 0x00000000fe128194 }, ++ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ ++ { 0x0000000183f4931e, 0x0000000077e8b990 }, ++ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ ++ { 0x00000000b6d9b4e4, 0x00000001a267f63a }, ++ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ ++ { 0x00000000b5188656, 0x00000001945c245a }, ++ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ ++ { 0x0000000027a81a84, 0x0000000149002e76 }, ++ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ ++ { 0x0000000125699258, 0x00000001bb8310a4 }, ++ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ ++ { 0x00000001b23de796, 0x000000019ec60bcc }, ++ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ ++ { 0x00000000fe4365dc, 0x000000012d8590ae }, ++ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ ++ { 0x00000000c68f497a, 0x0000000065b00684 }, ++ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ ++ { 0x00000000fbf521ee, 0x000000015e5aeadc }, ++ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ ++ { 0x000000015eac3378, 0x00000000b77ff2b0 }, ++ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ ++ { 0x0000000134914b90, 0x0000000188da2ff6 }, ++ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ ++ { 0x0000000016335cfe, 0x0000000063da929a }, ++ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ ++ { 0x000000010372d10c, 0x00000001389caa80 }, ++ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ ++ { 0x000000015097b908, 0x000000013db599d2 }, ++ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ ++ { 0x00000001227a7572, 0x0000000122505a86 }, ++ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ ++ { 0x000000009a8f75c0, 0x000000016bd72746 }, ++ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ ++ { 0x00000000682c77a2, 0x00000001c3faf1d4 }, ++ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ ++ { 0x00000000231f091c, 0x00000001111c826c }, ++ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ ++ { 0x000000007d4439f2, 0x00000000153e9fb2 }, ++ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ ++ { 0x000000017e221efc, 0x000000002b1f7b60 }, ++ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ ++ { 0x0000000167457c38, 0x00000000b1dba570 }, ++ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ ++ { 0x00000000bdf081c4, 0x00000001f6397b76 }, ++ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ ++ { 0x000000016286d6b0, 0x0000000156335214 }, ++ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ ++ { 0x00000000c84f001c, 0x00000001d70e3986 }, ++ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ ++ { 0x0000000064efe7c0, 0x000000003701a774 }, ++ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ ++ { 0x000000000ac2d904, 0x00000000ac81ef72 }, ++ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ ++ { 0x00000000fd226d14, 0x0000000133212464 }, ++ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ ++ { 0x000000011cfd42e0, 0x00000000e4e45610 }, ++ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ ++ { 0x000000016e5a5678, 0x000000000c1bd370 }, ++ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ ++ { 0x00000001d888fe22, 0x00000001a7b9e7a6 }, ++ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ ++ { 0x00000001af77fcd4, 0x000000007d657a10 } ++#endif /* __LITTLE_ENDIAN__ */ ++ }; ++ ++/* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */ ++ ++static const __vector unsigned long long vcrc_short_const[16] ++ __attribute__((aligned (16))) = { ++#ifdef __LITTLE_ENDIAN__ ++ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ ++ { 0x99168a18ec447f11, 0xed837b2613e8221e }, ++ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ ++ { 0xe23e954e8fd2cd3c, 0xc8acdd8147b9ce5a }, ++ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ ++ { 0x92f8befe6b1d2b53, 0xd9ad6d87d4277e25 }, ++ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ ++ { 0xf38a3556291ea462, 0xc10ec5e033fbca3b }, ++ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ ++ { 0x974ac56262b6ca4b, 0xc0b55b0e82e02e2f }, ++ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ ++ { 0x855712b3784d2a56, 0x71aa1df0e172334d }, ++ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ ++ { 0xa5abe9f80eaee722, 0xfee3053e3969324d }, ++ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ ++ { 0x1fa0943ddb54814c, 0xf44779b93eb2bd08 }, ++ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ ++ { 0xa53ff440d7bbfe6a, 0xf5449b3f00cc3374 }, ++ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ ++ { 0xebe7e3566325605c, 0x6f8346e1d777606e }, ++ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ ++ { 0xc65a272ce5b592b8, 0xe3ab4f2ac0b95347 }, ++ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ ++ { 0x5705a9ca4721589f, 0xaa2215ea329ecc11 }, ++ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ ++ { 0xe3720acb88d14467, 0x1ed8f66ed95efd26 }, ++ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ ++ { 0xba1aca0315141c31, 0x78ed02d5a700e96a }, ++ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ ++ { 0xad2a31b3ed627dae, 0xba8ccbe832b39da3 }, ++ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ ++ { 0x6655004fa06a2517, 0xedb88320b1e6b092 } ++#else /* __LITTLE_ENDIAN__ */ ++ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ ++ { 0xed837b2613e8221e, 0x99168a18ec447f11 }, ++ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ ++ { 0xc8acdd8147b9ce5a, 0xe23e954e8fd2cd3c }, ++ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ ++ { 0xd9ad6d87d4277e25, 0x92f8befe6b1d2b53 }, ++ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ ++ { 0xc10ec5e033fbca3b, 0xf38a3556291ea462 }, ++ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ ++ { 0xc0b55b0e82e02e2f, 0x974ac56262b6ca4b }, ++ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ ++ { 0x71aa1df0e172334d, 0x855712b3784d2a56 }, ++ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ ++ { 0xfee3053e3969324d, 0xa5abe9f80eaee722 }, ++ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ ++ { 0xf44779b93eb2bd08, 0x1fa0943ddb54814c }, ++ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ ++ { 0xf5449b3f00cc3374, 0xa53ff440d7bbfe6a }, ++ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ ++ { 0x6f8346e1d777606e, 0xebe7e3566325605c }, ++ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ ++ { 0xe3ab4f2ac0b95347, 0xc65a272ce5b592b8 }, ++ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ ++ { 0xaa2215ea329ecc11, 0x5705a9ca4721589f }, ++ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ ++ { 0x1ed8f66ed95efd26, 0xe3720acb88d14467 }, ++ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ ++ { 0x78ed02d5a700e96a, 0xba1aca0315141c31 }, ++ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ ++ { 0xba8ccbe832b39da3, 0xad2a31b3ed627dae }, ++ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ ++ { 0xedb88320b1e6b092, 0x6655004fa06a2517 } ++#endif /* __LITTLE_ENDIAN__ */ ++ }; ++ ++/* Barrett constants */ ++/* 33 bit reflected Barrett constant m - (4^32)/n */ ++ ++static const __vector unsigned long long v_Barrett_const[2] ++ __attribute__((aligned (16))) = { ++ /* x^64 div p(x) */ ++#ifdef __LITTLE_ENDIAN__ ++ { 0x00000001f7011641, 0x0000000000000000 }, ++ { 0x00000001db710641, 0x0000000000000000 } ++#else /* __LITTLE_ENDIAN__ */ ++ { 0x0000000000000000, 0x00000001f7011641 }, ++ { 0x0000000000000000, 0x00000001db710641 } ++#endif /* __LITTLE_ENDIAN__ */ ++ }; ++#endif /* POWER8_INTRINSICS */ ++ ++#endif /* __ASSEMBLER__ */ +diff --git a/contrib/power/crc32_z_power8.c b/contrib/power/crc32_z_power8.c +new file mode 100644 +index 0000000..7858cfe +--- /dev/null ++++ b/contrib/power/crc32_z_power8.c +@@ -0,0 +1,679 @@ ++/* ++ * Calculate the checksum of data that is 16 byte aligned and a multiple of ++ * 16 bytes. ++ * ++ * The first step is to reduce it to 1024 bits. We do this in 8 parallel ++ * chunks in order to mask the latency of the vpmsum instructions. If we ++ * have more than 32 kB of data to checksum we repeat this step multiple ++ * times, passing in the previous 1024 bits. ++ * ++ * The next step is to reduce the 1024 bits to 64 bits. This step adds ++ * 32 bits of 0s to the end - this matches what a CRC does. We just ++ * calculate constants that land the data in this 32 bits. ++ * ++ * We then use fixed point Barrett reduction to compute a mod n over GF(2) ++ * for n = CRC using POWER8 instructions. We use x = 32. ++ * ++ * http://en.wikipedia.org/wiki/Barrett_reduction ++ * ++ * This code uses gcc vector builtins instead using assembly directly. ++ * ++ * Copyright (C) 2017 Rogerio Alves , IBM ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of either: ++ * ++ * a) the GNU General Public License as published by the Free Software ++ * Foundation; either version 2 of the License, or (at your option) ++ * any later version, or ++ * b) the Apache License, Version 2.0 ++ */ ++ ++#include ++#include "../../zutil.h" ++#include "power.h" ++ ++#define POWER8_INTRINSICS ++#define CRC_TABLE ++ ++#ifdef CRC32_CONSTANTS_HEADER ++#include CRC32_CONSTANTS_HEADER ++#else ++#include "crc32_constants.h" ++#endif ++ ++#define VMX_ALIGN 16 ++#define VMX_ALIGN_MASK (VMX_ALIGN-1) ++ ++#ifdef REFLECT ++static unsigned int crc32_align(unsigned int crc, const unsigned char *p, ++ unsigned long len) ++{ ++ while (len--) ++ crc = crc_table[(crc ^ *p++) & 0xff] ^ (crc >> 8); ++ return crc; ++} ++#else ++static unsigned int crc32_align(unsigned int crc, const unsigned char *p, ++ unsigned long len) ++{ ++ while (len--) ++ crc = crc_table[((crc >> 24) ^ *p++) & 0xff] ^ (crc << 8); ++ return crc; ++} ++#endif ++ ++static unsigned int __attribute__ ((aligned (32))) ++__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len); ++ ++unsigned long ZLIB_INTERNAL _crc32_z_power8(uLong _crc, const Bytef *_p, ++ z_size_t _len) ++{ ++ unsigned int prealign; ++ unsigned int tail; ++ ++ /* Map zlib API to crc32_vpmsum API */ ++ unsigned int crc = (unsigned int) (0xffffffff & _crc); ++ const unsigned char *p = _p; ++ unsigned long len = (unsigned long) _len; ++ ++ if (p == (const unsigned char *) 0x0) return 0; ++#ifdef CRC_XOR ++ crc ^= 0xffffffff; ++#endif ++ ++ if (len < VMX_ALIGN + VMX_ALIGN_MASK) { ++ crc = crc32_align(crc, p, len); ++ goto out; ++ } ++ ++ if ((unsigned long)p & VMX_ALIGN_MASK) { ++ prealign = VMX_ALIGN - ((unsigned long)p & VMX_ALIGN_MASK); ++ crc = crc32_align(crc, p, prealign); ++ len -= prealign; ++ p += prealign; ++ } ++ ++ crc = __crc32_vpmsum(crc, p, len & ~VMX_ALIGN_MASK); ++ ++ tail = len & VMX_ALIGN_MASK; ++ if (tail) { ++ p += len & ~VMX_ALIGN_MASK; ++ crc = crc32_align(crc, p, tail); ++ } ++ ++out: ++#ifdef CRC_XOR ++ crc ^= 0xffffffff; ++#endif ++ ++ /* Convert to zlib API */ ++ return (unsigned long) crc; ++} ++ ++#if defined (__clang__) ++#include "clang_workaround.h" ++#else ++#define __builtin_pack_vector(a, b) __builtin_pack_vector_int128 ((a), (b)) ++#define __builtin_unpack_vector_0(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 0) ++#define __builtin_unpack_vector_1(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 1) ++#endif ++ ++/* When we have a load-store in a single-dispatch group and address overlap ++ * such that foward is not allowed (load-hit-store) the group must be flushed. ++ * A group ending NOP prevents the flush. ++ */ ++#define GROUP_ENDING_NOP asm("ori 2,2,0" ::: "memory") ++ ++#if defined(__BIG_ENDIAN__) && defined (REFLECT) ++#define BYTESWAP_DATA ++#elif defined(__LITTLE_ENDIAN__) && !defined(REFLECT) ++#define BYTESWAP_DATA ++#endif ++ ++#ifdef BYTESWAP_DATA ++#define VEC_PERM(vr, va, vb, vc) vr = vec_perm(va, vb,\ ++ (__vector unsigned char) vc) ++#if defined(__LITTLE_ENDIAN__) ++/* Byte reverse permute constant LE. */ ++static const __vector unsigned long long vperm_const ++ __attribute__ ((aligned(16))) = { 0x08090A0B0C0D0E0FUL, ++ 0x0001020304050607UL }; ++#else ++static const __vector unsigned long long vperm_const ++ __attribute__ ((aligned(16))) = { 0x0F0E0D0C0B0A0908UL, ++ 0X0706050403020100UL }; ++#endif ++#else ++#define VEC_PERM(vr, va, vb, vc) ++#endif ++ ++static unsigned int __attribute__ ((aligned (32))) ++__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len) { ++ ++ const __vector unsigned long long vzero = {0,0}; ++ const __vector unsigned long long vones = {0xffffffffffffffffUL, ++ 0xffffffffffffffffUL}; ++ ++#ifdef REFLECT ++ const __vector unsigned long long vmask_32bit = ++ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, ++ (__vector unsigned char)vones, 4); ++#endif ++ ++ const __vector unsigned long long vmask_64bit = ++ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, ++ (__vector unsigned char)vones, 8); ++ ++ __vector unsigned long long vcrc; ++ ++ __vector unsigned long long vconst1, vconst2; ++ ++ /* vdata0-vdata7 will contain our data (p). */ ++ __vector unsigned long long vdata0, vdata1, vdata2, vdata3, vdata4, ++ vdata5, vdata6, vdata7; ++ ++ /* v0-v7 will contain our checksums */ ++ __vector unsigned long long v0 = {0,0}; ++ __vector unsigned long long v1 = {0,0}; ++ __vector unsigned long long v2 = {0,0}; ++ __vector unsigned long long v3 = {0,0}; ++ __vector unsigned long long v4 = {0,0}; ++ __vector unsigned long long v5 = {0,0}; ++ __vector unsigned long long v6 = {0,0}; ++ __vector unsigned long long v7 = {0,0}; ++ ++ ++ /* Vector auxiliary variables. */ ++ __vector unsigned long long va0, va1, va2, va3, va4, va5, va6, va7; ++ ++ unsigned int result = 0; ++ unsigned int offset; /* Constant table offset. */ ++ ++ unsigned long i; /* Counter. */ ++ unsigned long chunks; ++ ++ unsigned long block_size; ++ int next_block = 0; ++ ++ /* Align by 128 bits. The last 128 bit block will be processed at end. */ ++ unsigned long length = len & 0xFFFFFFFFFFFFFF80UL; ++ ++#ifdef REFLECT ++ vcrc = (__vector unsigned long long)__builtin_pack_vector(0UL, crc); ++#else ++ vcrc = (__vector unsigned long long)__builtin_pack_vector(crc, 0UL); ++ ++ /* Shift into top 32 bits */ ++ vcrc = (__vector unsigned long long)vec_sld((__vector unsigned char)vcrc, ++ (__vector unsigned char)vzero, 4); ++#endif ++ ++ /* Short version. */ ++ if (len < 256) { ++ /* Calculate where in the constant table we need to start. */ ++ offset = 256 - len; ++ ++ vconst1 = vec_ld(offset, vcrc_short_const); ++ vdata0 = vec_ld(0, (__vector unsigned long long*) p); ++ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); ++ ++ /* xor initial value*/ ++ vdata0 = vec_xor(vdata0, vcrc); ++ ++ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw ++ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); ++ v0 = vec_xor(v0, vdata0); ++ ++ for (i = 16; i < len; i += 16) { ++ vconst1 = vec_ld(offset + i, vcrc_short_const); ++ vdata0 = vec_ld(i, (__vector unsigned long long*) p); ++ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); ++ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw ++ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); ++ v0 = vec_xor(v0, vdata0); ++ } ++ } else { ++ ++ /* Load initial values. */ ++ vdata0 = vec_ld(0, (__vector unsigned long long*) p); ++ vdata1 = vec_ld(16, (__vector unsigned long long*) p); ++ ++ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); ++ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); ++ ++ vdata2 = vec_ld(32, (__vector unsigned long long*) p); ++ vdata3 = vec_ld(48, (__vector unsigned long long*) p); ++ ++ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); ++ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); ++ ++ vdata4 = vec_ld(64, (__vector unsigned long long*) p); ++ vdata5 = vec_ld(80, (__vector unsigned long long*) p); ++ ++ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); ++ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); ++ ++ vdata6 = vec_ld(96, (__vector unsigned long long*) p); ++ vdata7 = vec_ld(112, (__vector unsigned long long*) p); ++ ++ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); ++ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); ++ ++ /* xor in initial value */ ++ vdata0 = vec_xor(vdata0, vcrc); ++ ++ p = (char *)p + 128; ++ ++ do { ++ /* Checksum in blocks of MAX_SIZE. */ ++ block_size = length; ++ if (block_size > MAX_SIZE) { ++ block_size = MAX_SIZE; ++ } ++ ++ length = length - block_size; ++ ++ /* ++ * Work out the offset into the constants table to start at. Each ++ * constant is 16 bytes, and it is used against 128 bytes of input ++ * data - 128 / 16 = 8 ++ */ ++ offset = (MAX_SIZE/8) - (block_size/8); ++ /* We reduce our final 128 bytes in a separate step */ ++ chunks = (block_size/128)-1; ++ ++ vconst1 = vec_ld(offset, vcrc_const); ++ ++ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata0, ++ (__vector unsigned long long)vconst1); ++ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata1, ++ (__vector unsigned long long)vconst1); ++ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata2, ++ (__vector unsigned long long)vconst1); ++ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata3, ++ (__vector unsigned long long)vconst1); ++ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata4, ++ (__vector unsigned long long)vconst1); ++ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata5, ++ (__vector unsigned long long)vconst1); ++ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata6, ++ (__vector unsigned long long)vconst1); ++ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata7, ++ (__vector unsigned long long)vconst1); ++ ++ if (chunks > 1) { ++ offset += 16; ++ vconst2 = vec_ld(offset, vcrc_const); ++ GROUP_ENDING_NOP; ++ ++ vdata0 = vec_ld(0, (__vector unsigned long long*) p); ++ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); ++ ++ vdata1 = vec_ld(16, (__vector unsigned long long*) p); ++ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); ++ ++ vdata2 = vec_ld(32, (__vector unsigned long long*) p); ++ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); ++ ++ vdata3 = vec_ld(48, (__vector unsigned long long*) p); ++ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); ++ ++ vdata4 = vec_ld(64, (__vector unsigned long long*) p); ++ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); ++ ++ vdata5 = vec_ld(80, (__vector unsigned long long*) p); ++ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); ++ ++ vdata6 = vec_ld(96, (__vector unsigned long long*) p); ++ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); ++ ++ vdata7 = vec_ld(112, (__vector unsigned long long*) p); ++ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); ++ ++ p = (char *)p + 128; ++ ++ /* ++ * main loop. We modulo schedule it such that it takes three ++ * iterations to complete - first iteration load, second ++ * iteration vpmsum, third iteration xor. ++ */ ++ for (i = 0; i < chunks-2; i++) { ++ vconst1 = vec_ld(offset, vcrc_const); ++ offset += 16; ++ GROUP_ENDING_NOP; ++ ++ v0 = vec_xor(v0, va0); ++ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata0, (__vector unsigned long long)vconst2); ++ vdata0 = vec_ld(0, (__vector unsigned long long*) p); ++ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v1 = vec_xor(v1, va1); ++ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata1, (__vector unsigned long long)vconst2); ++ vdata1 = vec_ld(16, (__vector unsigned long long*) p); ++ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v2 = vec_xor(v2, va2); ++ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata2, (__vector unsigned long long)vconst2); ++ vdata2 = vec_ld(32, (__vector unsigned long long*) p); ++ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v3 = vec_xor(v3, va3); ++ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata3, (__vector unsigned long long)vconst2); ++ vdata3 = vec_ld(48, (__vector unsigned long long*) p); ++ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); ++ ++ vconst2 = vec_ld(offset, vcrc_const); ++ GROUP_ENDING_NOP; ++ ++ v4 = vec_xor(v4, va4); ++ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata4, (__vector unsigned long long)vconst1); ++ vdata4 = vec_ld(64, (__vector unsigned long long*) p); ++ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v5 = vec_xor(v5, va5); ++ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata5, (__vector unsigned long long)vconst1); ++ vdata5 = vec_ld(80, (__vector unsigned long long*) p); ++ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v6 = vec_xor(v6, va6); ++ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata6, (__vector unsigned long long)vconst1); ++ vdata6 = vec_ld(96, (__vector unsigned long long*) p); ++ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); ++ GROUP_ENDING_NOP; ++ ++ v7 = vec_xor(v7, va7); ++ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata7, (__vector unsigned long long)vconst1); ++ vdata7 = vec_ld(112, (__vector unsigned long long*) p); ++ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); ++ ++ p = (char *)p + 128; ++ } ++ ++ /* First cool down*/ ++ vconst1 = vec_ld(offset, vcrc_const); ++ offset += 16; ++ ++ v0 = vec_xor(v0, va0); ++ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata0, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v1 = vec_xor(v1, va1); ++ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata1, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v2 = vec_xor(v2, va2); ++ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata2, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v3 = vec_xor(v3, va3); ++ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata3, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v4 = vec_xor(v4, va4); ++ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata4, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v5 = vec_xor(v5, va5); ++ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata5, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v6 = vec_xor(v6, va6); ++ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata6, (__vector unsigned long long)vconst1); ++ GROUP_ENDING_NOP; ++ ++ v7 = vec_xor(v7, va7); ++ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long ++ long)vdata7, (__vector unsigned long long)vconst1); ++ }/* else */ ++ ++ /* Second cool down. */ ++ v0 = vec_xor(v0, va0); ++ v1 = vec_xor(v1, va1); ++ v2 = vec_xor(v2, va2); ++ v3 = vec_xor(v3, va3); ++ v4 = vec_xor(v4, va4); ++ v5 = vec_xor(v5, va5); ++ v6 = vec_xor(v6, va6); ++ v7 = vec_xor(v7, va7); ++ ++#ifdef REFLECT ++ /* ++ * vpmsumd produces a 96 bit result in the least significant bits ++ * of the register. Since we are bit reflected we have to shift it ++ * left 32 bits so it occupies the least significant bits in the ++ * bit reflected domain. ++ */ ++ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, ++ (__vector unsigned char)vzero, 4); ++ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v1, ++ (__vector unsigned char)vzero, 4); ++ v2 = (__vector unsigned long long)vec_sld((__vector unsigned char)v2, ++ (__vector unsigned char)vzero, 4); ++ v3 = (__vector unsigned long long)vec_sld((__vector unsigned char)v3, ++ (__vector unsigned char)vzero, 4); ++ v4 = (__vector unsigned long long)vec_sld((__vector unsigned char)v4, ++ (__vector unsigned char)vzero, 4); ++ v5 = (__vector unsigned long long)vec_sld((__vector unsigned char)v5, ++ (__vector unsigned char)vzero, 4); ++ v6 = (__vector unsigned long long)vec_sld((__vector unsigned char)v6, ++ (__vector unsigned char)vzero, 4); ++ v7 = (__vector unsigned long long)vec_sld((__vector unsigned char)v7, ++ (__vector unsigned char)vzero, 4); ++#endif ++ ++ /* xor with the last 1024 bits. */ ++ va0 = vec_ld(0, (__vector unsigned long long*) p); ++ VEC_PERM(va0, va0, va0, vperm_const); ++ ++ va1 = vec_ld(16, (__vector unsigned long long*) p); ++ VEC_PERM(va1, va1, va1, vperm_const); ++ ++ va2 = vec_ld(32, (__vector unsigned long long*) p); ++ VEC_PERM(va2, va2, va2, vperm_const); ++ ++ va3 = vec_ld(48, (__vector unsigned long long*) p); ++ VEC_PERM(va3, va3, va3, vperm_const); ++ ++ va4 = vec_ld(64, (__vector unsigned long long*) p); ++ VEC_PERM(va4, va4, va4, vperm_const); ++ ++ va5 = vec_ld(80, (__vector unsigned long long*) p); ++ VEC_PERM(va5, va5, va5, vperm_const); ++ ++ va6 = vec_ld(96, (__vector unsigned long long*) p); ++ VEC_PERM(va6, va6, va6, vperm_const); ++ ++ va7 = vec_ld(112, (__vector unsigned long long*) p); ++ VEC_PERM(va7, va7, va7, vperm_const); ++ ++ p = (char *)p + 128; ++ ++ vdata0 = vec_xor(v0, va0); ++ vdata1 = vec_xor(v1, va1); ++ vdata2 = vec_xor(v2, va2); ++ vdata3 = vec_xor(v3, va3); ++ vdata4 = vec_xor(v4, va4); ++ vdata5 = vec_xor(v5, va5); ++ vdata6 = vec_xor(v6, va6); ++ vdata7 = vec_xor(v7, va7); ++ ++ /* Check if we have more blocks to process */ ++ next_block = 0; ++ if (length != 0) { ++ next_block = 1; ++ ++ /* zero v0-v7 */ ++ v0 = vec_xor(v0, v0); ++ v1 = vec_xor(v1, v1); ++ v2 = vec_xor(v2, v2); ++ v3 = vec_xor(v3, v3); ++ v4 = vec_xor(v4, v4); ++ v5 = vec_xor(v5, v5); ++ v6 = vec_xor(v6, v6); ++ v7 = vec_xor(v7, v7); ++ } ++ length = length + 128; ++ ++ } while (next_block); ++ ++ /* Calculate how many bytes we have left. */ ++ length = (len & 127); ++ ++ /* Calculate where in (short) constant table we need to start. */ ++ offset = 128 - length; ++ ++ v0 = vec_ld(offset, vcrc_short_const); ++ v1 = vec_ld(offset + 16, vcrc_short_const); ++ v2 = vec_ld(offset + 32, vcrc_short_const); ++ v3 = vec_ld(offset + 48, vcrc_short_const); ++ v4 = vec_ld(offset + 64, vcrc_short_const); ++ v5 = vec_ld(offset + 80, vcrc_short_const); ++ v6 = vec_ld(offset + 96, vcrc_short_const); ++ v7 = vec_ld(offset + 112, vcrc_short_const); ++ ++ offset += 128; ++ ++ v0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata0,(__vector unsigned int)v0); ++ v1 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata1,(__vector unsigned int)v1); ++ v2 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata2,(__vector unsigned int)v2); ++ v3 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata3,(__vector unsigned int)v3); ++ v4 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata4,(__vector unsigned int)v4); ++ v5 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata5,(__vector unsigned int)v5); ++ v6 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata6,(__vector unsigned int)v6); ++ v7 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata7,(__vector unsigned int)v7); ++ ++ /* Now reduce the tail (0-112 bytes). */ ++ for (i = 0; i < length; i+=16) { ++ vdata0 = vec_ld(i,(__vector unsigned long long*)p); ++ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); ++ va0 = vec_ld(offset + i,vcrc_short_const); ++ va0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( ++ (__vector unsigned int)vdata0,(__vector unsigned int)va0); ++ v0 = vec_xor(v0, va0); ++ } ++ ++ /* xor all parallel chunks together. */ ++ v0 = vec_xor(v0, v1); ++ v2 = vec_xor(v2, v3); ++ v4 = vec_xor(v4, v5); ++ v6 = vec_xor(v6, v7); ++ ++ v0 = vec_xor(v0, v2); ++ v4 = vec_xor(v4, v6); ++ ++ v0 = vec_xor(v0, v4); ++ } ++ ++ /* Barrett Reduction */ ++ vconst1 = vec_ld(0, v_Barrett_const); ++ vconst2 = vec_ld(16, v_Barrett_const); ++ ++ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, ++ (__vector unsigned char)v0, 8); ++ v0 = vec_xor(v1,v0); ++ ++#ifdef REFLECT ++ /* shift left one bit */ ++ __vector unsigned char vsht_splat = vec_splat_u8 (1); ++ v0 = (__vector unsigned long long)vec_sll ((__vector unsigned char)v0, ++ vsht_splat); ++#endif ++ ++ v0 = vec_and(v0, vmask_64bit); ++ ++#ifndef REFLECT ++ ++ /* ++ * Now for the actual algorithm. The idea is to calculate q, ++ * the multiple of our polynomial that we need to subtract. By ++ * doing the computation 2x bits higher (ie 64 bits) and shifting the ++ * result back down 2x bits, we round down to the nearest multiple. ++ */ ++ ++ /* ma */ ++ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v0, ++ (__vector unsigned long long)vconst1); ++ /* q = floor(ma/(2^64)) */ ++ v1 = (__vector unsigned long long)vec_sld ((__vector unsigned char)vzero, ++ (__vector unsigned char)v1, 8); ++ /* qn */ ++ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, ++ (__vector unsigned long long)vconst2); ++ /* a - qn, subtraction is xor in GF(2) */ ++ v0 = vec_xor (v0, v1); ++ /* ++ * Get the result into r3. We need to shift it left 8 bytes: ++ * V0 [ 0 1 2 X ] ++ * V0 [ 0 X 2 3 ] ++ */ ++ result = __builtin_unpack_vector_1 (v0); ++#else ++ ++ /* ++ * The reflected version of Barrett reduction. Instead of bit ++ * reflecting our data (which is expensive to do), we bit reflect our ++ * constants and our algorithm, which means the intermediate data in ++ * our vector registers goes from 0-63 instead of 63-0. We can reflect ++ * the algorithm because we don't carry in mod 2 arithmetic. ++ */ ++ ++ /* bottom 32 bits of a */ ++ v1 = vec_and(v0, vmask_32bit); ++ ++ /* ma */ ++ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, ++ (__vector unsigned long long)vconst1); ++ ++ /* bottom 32bits of ma */ ++ v1 = vec_and(v1, vmask_32bit); ++ /* qn */ ++ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, ++ (__vector unsigned long long)vconst2); ++ /* a - qn, subtraction is xor in GF(2) */ ++ v0 = vec_xor (v0, v1); ++ ++ /* ++ * Since we are bit reflected, the result (ie the low 32 bits) is in ++ * the high 32 bits. We just need to shift it left 4 bytes ++ * V0 [ 0 1 X 3 ] ++ * V0 [ 0 X 2 3 ] ++ */ ++ ++ /* shift result into top 64 bits of */ ++ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, ++ (__vector unsigned char)vzero, 4); ++ ++ result = __builtin_unpack_vector_0 (v0); ++#endif ++ ++ return result; ++} +diff --git a/contrib/power/crc32_z_resolver.c b/contrib/power/crc32_z_resolver.c +new file mode 100644 +index 0000000..f4e9aa4 +--- /dev/null ++++ b/contrib/power/crc32_z_resolver.c +@@ -0,0 +1,15 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "../gcc/zifunc.h" ++#include "power.h" ++ ++Z_IFUNC(crc32_z) { ++#ifdef Z_POWER8 ++ if (__builtin_cpu_supports("arch_2_07")) ++ return _crc32_z_power8; ++#endif ++ ++ return crc32_z_default; ++} +diff --git a/contrib/power/power.h b/contrib/power/power.h +index b42c7d6..79123aa 100644 +--- a/contrib/power/power.h ++++ b/contrib/power/power.h +@@ -2,3 +2,7 @@ + * 2019 Rogerio Alves , IBM + * For conditions of distribution and use, see copyright notice in zlib.h + */ ++ ++#include "../../zconf.h" ++ ++unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); +diff --git a/crc32.c b/crc32.c +index a1bdce5..ae7b7e7 100644 +--- a/crc32.c ++++ b/crc32.c +@@ -736,6 +736,13 @@ local z_word_t crc_word_big(data) + #endif + + /* ========================================================================= */ ++#ifdef Z_POWER_OPT ++/* Rename function so resolver can use its symbol. The default version will be ++ * returned by the resolver if the host has no support for an optimized version. ++ */ ++#define crc32_z crc32_z_default ++#endif /* Z_POWER_OPT */ ++ + unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; +@@ -1057,6 +1064,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + return crc ^ 0xffffffff; + } + ++#ifdef Z_POWER_OPT ++#undef crc32_z ++#include "contrib/power/crc32_z_resolver.c" ++#endif /* Z_POWER_OPT */ ++ + #endif + + /* ========================================================================= */ +diff --git a/test/crc32_test.c b/test/crc32_test.c +new file mode 100644 +index 0000000..3155553 +--- /dev/null ++++ b/test/crc32_test.c +@@ -0,0 +1,205 @@ ++/* crc32_tes.c -- unit test for crc32 in the zlib compression library ++ * Copyright (C) 1995-2006, 2010, 2011, 2016, 2019 Rogerio Alves ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "zlib.h" ++#include ++ ++#ifdef STDC ++# include ++# include ++#endif ++ ++void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); ++int main OF((void)); ++ ++typedef struct { ++ int line; ++ uLong crc; ++ char* buf; ++ int len; ++ uLong expect; ++} crc32_test; ++ ++void test_crc32(crc, buf, len, chk, line) ++ uLong crc; ++ Byte *buf; ++ z_size_t len; ++ uLong chk; ++ int line; ++{ ++ uLong res = crc32(crc, buf, len); ++ if (res != chk) { ++ fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", ++ line, (unsigned int)res, (unsigned int)chk); ++ exit(1); ++ } ++} ++ ++static const crc32_test tests[] = { ++ {__LINE__, 0x0, 0x0, 0, 0x0}, ++ {__LINE__, 0xffffffff, 0x0, 0, 0x0}, ++ {__LINE__, 0x0, 0x0, 255, 0x0}, /* BZ 174799. */ ++ {__LINE__, 0x0, 0x0, 256, 0x0}, ++ {__LINE__, 0x0, 0x0, 257, 0x0}, ++ {__LINE__, 0x0, 0x0, 32767, 0x0}, ++ {__LINE__, 0x0, 0x0, 32768, 0x0}, ++ {__LINE__, 0x0, 0x0, 32769, 0x0}, ++ {__LINE__, 0x0, "", 0, 0x0}, ++ {__LINE__, 0xffffffff, "", 0, 0xffffffff}, ++ {__LINE__, 0x0, "abacus", 6, 0xc3d7115b}, ++ {__LINE__, 0x0, "backlog", 7, 0x269205}, ++ {__LINE__, 0x0, "campfire", 8, 0x22a515f8}, ++ {__LINE__, 0x0, "delta", 5, 0x9643fed9}, ++ {__LINE__, 0x0, "executable", 10, 0xd68eda01}, ++ {__LINE__, 0x0, "file", 4, 0x8c9f3610}, ++ {__LINE__, 0x0, "greatest", 8, 0xc1abd6cd}, ++ {__LINE__, 0x0, "hello", 5, 0x3610a686}, ++ {__LINE__, 0x0, "inverter", 8, 0xc9e962c9}, ++ {__LINE__, 0x0, "jigsaw", 6, 0xce4e3f69}, ++ {__LINE__, 0x0, "karate", 6, 0x890be0e2}, ++ {__LINE__, 0x0, "landscape", 9, 0xc4e0330b}, ++ {__LINE__, 0x0, "machine", 7, 0x1505df84}, ++ {__LINE__, 0x0, "nanometer", 9, 0xd4e19f39}, ++ {__LINE__, 0x0, "oblivion", 8, 0xdae9de77}, ++ {__LINE__, 0x0, "panama", 6, 0x66b8979c}, ++ {__LINE__, 0x0, "quest", 5, 0x4317f817}, ++ {__LINE__, 0x0, "resource", 8, 0xbc91f416}, ++ {__LINE__, 0x0, "secret", 6, 0x5ca2e8e5}, ++ {__LINE__, 0x0, "test", 4, 0xd87f7e0c}, ++ {__LINE__, 0x0, "ultimate", 8, 0x3fc79b0b}, ++ {__LINE__, 0x0, "vector", 6, 0x1b6e485b}, ++ {__LINE__, 0x0, "walrus", 6, 0xbe769b97}, ++ {__LINE__, 0x0, "xeno", 4, 0xe7a06444}, ++ {__LINE__, 0x0, "yelling", 7, 0xfe3944e5}, ++ {__LINE__, 0x0, "zlib", 4, 0x73887d3a}, ++ {__LINE__, 0x0, "4BJD7PocN1VqX0jXVpWB", 20, 0xd487a5a1}, ++ {__LINE__, 0x0, "F1rPWI7XvDs6nAIRx41l", 20, 0x61a0132e}, ++ {__LINE__, 0x0, "ldhKlsVkPFOveXgkGtC2", 20, 0xdf02f76}, ++ {__LINE__, 0x0, "5KKnGOOrs8BvJ35iKTOS", 20, 0x579b2b0a}, ++ {__LINE__, 0x0, "0l1tw7GOcem06Ddu7yn4", 20, 0xf7d16e2d}, ++ {__LINE__, 0x0, "MCr47CjPIn9R1IvE1Tm5", 20, 0x731788f5}, ++ {__LINE__, 0x0, "UcixbzPKTIv0SvILHVdO", 20, 0x7112bb11}, ++ {__LINE__, 0x0, "dGnAyAhRQDsWw0ESou24", 20, 0xf32a0dac}, ++ {__LINE__, 0x0, "di0nvmY9UYMYDh0r45XT", 20, 0x625437bb}, ++ {__LINE__, 0x0, "2XKDwHfAhFsV0RhbqtvH", 20, 0x896930f9}, ++ {__LINE__, 0x0, "ZhrANFIiIvRnqClIVyeD", 20, 0x8579a37}, ++ {__LINE__, 0x0, "v7Q9ehzioTOVeDIZioT1", 20, 0x632aa8e0}, ++ {__LINE__, 0x0, "Yod5hEeKcYqyhfXbhxj2", 20, 0xc829af29}, ++ {__LINE__, 0x0, "GehSWY2ay4uUKhehXYb0", 20, 0x1b08b7e8}, ++ {__LINE__, 0x0, "kwytJmq6UqpflV8Y8GoE", 20, 0x4e33b192}, ++ {__LINE__, 0x0, "70684206568419061514", 20, 0x59a179f0}, ++ {__LINE__, 0x0, "42015093765128581010", 20, 0xcd1013d7}, ++ {__LINE__, 0x0, "88214814356148806939", 20, 0xab927546}, ++ {__LINE__, 0x0, "43472694284527343838", 20, 0x11f3b20c}, ++ {__LINE__, 0x0, "49769333513942933689", 20, 0xd562d4ca}, ++ {__LINE__, 0x0, "54979784887993251199", 20, 0x233395f7}, ++ {__LINE__, 0x0, "58360544869206793220", 20, 0x2d167fd5}, ++ {__LINE__, 0x0, "27347953487840714234", 20, 0x8b5108ba}, ++ {__LINE__, 0x0, "07650690295365319082", 20, 0xc46b3cd8}, ++ {__LINE__, 0x0, "42655507906821911703", 20, 0xc10b2662}, ++ {__LINE__, 0x0, "29977409200786225655", 20, 0xc9a0f9d2}, ++ {__LINE__, 0x0, "85181542907229116674", 20, 0x9341357b}, ++ {__LINE__, 0x0, "87963594337989416799", 20, 0xf0424937}, ++ {__LINE__, 0x0, "21395988329504168551", 20, 0xd7c4c31f}, ++ {__LINE__, 0x0, "51991013580943379423", 20, 0xf11edcc4}, ++ {__LINE__, 0x0, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x40795df4}, ++ {__LINE__, 0x0, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xdd61a631}, ++ {__LINE__, 0x0, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xca907a99}, ++ {__LINE__, 0x0, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0xf652deac}, ++ {__LINE__, 0x0, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0xaf39a5a9}, ++ {__LINE__, 0x0, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x6bebb4cf}, ++ {__LINE__, 0x0, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x76430bac}, ++ {__LINE__, 0x0, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x6c80c388}, ++ {__LINE__, 0x0, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xd54d977d}, ++ {__LINE__, 0x0, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0xe3966ad5}, ++ {__LINE__, 0x0, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xe7c71db9}, ++ {__LINE__, 0x0, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xeaa52777}, ++ {__LINE__, 0x0, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xcd472048}, ++ {__LINE__, 0x7a30360d, "abacus", 6, 0xf8655a84}, ++ {__LINE__, 0x6fd767ee, "backlog", 7, 0x1ed834b1}, ++ {__LINE__, 0xefeb7589, "campfire", 8, 0x686cfca}, ++ {__LINE__, 0x61cf7e6b, "delta", 5, 0x1554e4b1}, ++ {__LINE__, 0xdc712e2, "executable", 10, 0x761b4254}, ++ {__LINE__, 0xad23c7fd, "file", 4, 0x7abdd09b}, ++ {__LINE__, 0x85cb2317, "greatest", 8, 0x4ba91c6b}, ++ {__LINE__, 0x9eed31b0, "inverter", 8, 0xd5e78ba5}, ++ {__LINE__, 0xb94f34ca, "jigsaw", 6, 0x23649109}, ++ {__LINE__, 0xab058a2, "karate", 6, 0xc5591f41}, ++ {__LINE__, 0x5bff2b7a, "landscape", 9, 0xf10eb644}, ++ {__LINE__, 0x605c9a5f, "machine", 7, 0xbaa0a636}, ++ {__LINE__, 0x51bdeea5, "nanometer", 9, 0x6af89afb}, ++ {__LINE__, 0x85c21c79, "oblivion", 8, 0xecae222b}, ++ {__LINE__, 0x97216f56, "panama", 6, 0x47dffac4}, ++ {__LINE__, 0x18444af2, "quest", 5, 0x70c2fe36}, ++ {__LINE__, 0xbe6ce359, "resource", 8, 0x1471d925}, ++ {__LINE__, 0x843071f1, "secret", 6, 0x50c9a0db}, ++ {__LINE__, 0xf2480c60, "ultimate", 8, 0xf973daf8}, ++ {__LINE__, 0x2d2feb3d, "vector", 6, 0x344ac03d}, ++ {__LINE__, 0x7490310a, "walrus", 6, 0x6d1408ef}, ++ {__LINE__, 0x97d247d4, "xeno", 4, 0xe62670b5}, ++ {__LINE__, 0x93cf7599, "yelling", 7, 0x1b36da38}, ++ {__LINE__, 0x73c84278, "zlib", 4, 0x6432d127}, ++ {__LINE__, 0x228a87d1, "4BJD7PocN1VqX0jXVpWB", 20, 0x997107d0}, ++ {__LINE__, 0xa7a048d0, "F1rPWI7XvDs6nAIRx41l", 20, 0xdc567274}, ++ {__LINE__, 0x1f0ded40, "ldhKlsVkPFOveXgkGtC2", 20, 0xdcc63870}, ++ {__LINE__, 0xa804a62f, "5KKnGOOrs8BvJ35iKTOS", 20, 0x6926cffd}, ++ {__LINE__, 0x508fae6a, "0l1tw7GOcem06Ddu7yn4", 20, 0xb52b38bc}, ++ {__LINE__, 0xe5adaf4f, "MCr47CjPIn9R1IvE1Tm5", 20, 0xf83b8178}, ++ {__LINE__, 0x67136a40, "UcixbzPKTIv0SvILHVdO", 20, 0xc5213070}, ++ {__LINE__, 0xb00c4a10, "dGnAyAhRQDsWw0ESou24", 20, 0xbc7648b0}, ++ {__LINE__, 0x2e0c84b5, "di0nvmY9UYMYDh0r45XT", 20, 0xd8123a72}, ++ {__LINE__, 0x81238d44, "2XKDwHfAhFsV0RhbqtvH", 20, 0xd5ac5620}, ++ {__LINE__, 0xf853aa92, "ZhrANFIiIvRnqClIVyeD", 20, 0xceae099d}, ++ {__LINE__, 0x5a692325, "v7Q9ehzioTOVeDIZioT1", 20, 0xb07d2b24}, ++ {__LINE__, 0x3275b9f, "Yod5hEeKcYqyhfXbhxj2", 20, 0x24ce91df}, ++ {__LINE__, 0x38371feb, "GehSWY2ay4uUKhehXYb0", 20, 0x707b3b30}, ++ {__LINE__, 0xafc8bf62, "kwytJmq6UqpflV8Y8GoE", 20, 0x16abc6a9}, ++ {__LINE__, 0x9b07db73, "70684206568419061514", 20, 0xae1fb7b7}, ++ {__LINE__, 0xe75b214, "42015093765128581010", 20, 0xd4eecd2d}, ++ {__LINE__, 0x72d0fe6f, "88214814356148806939", 20, 0x4660ec7}, ++ {__LINE__, 0xf857a4b1, "43472694284527343838", 20, 0xfd8afdf7}, ++ {__LINE__, 0x54b8e14, "49769333513942933689", 20, 0xc6d1b5f2}, ++ {__LINE__, 0xd6aa5616, "54979784887993251199", 20, 0x32476461}, ++ {__LINE__, 0x11e63098, "58360544869206793220", 20, 0xd917cf1a}, ++ {__LINE__, 0xbe92385, "27347953487840714234", 20, 0x4ad14a12}, ++ {__LINE__, 0x49511de0, "07650690295365319082", 20, 0xe37b5c6c}, ++ {__LINE__, 0x3db13bc1, "42655507906821911703", 20, 0x7cc497f1}, ++ {__LINE__, 0xbb899bea, "29977409200786225655", 20, 0x99781bb2}, ++ {__LINE__, 0xf6cd9436, "85181542907229116674", 20, 0x132256a1}, ++ {__LINE__, 0x9109e6c3, "87963594337989416799", 20, 0xbfdb2c83}, ++ {__LINE__, 0x75770fc, "21395988329504168551", 20, 0x8d9d1e81}, ++ {__LINE__, 0x69b1d19b, "51991013580943379423", 20, 0x7b6d4404}, ++ {__LINE__, 0xc6132975, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x8619f010}, ++ {__LINE__, 0xd58cb00c, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x15746ac3}, ++ {__LINE__, 0xb63b8caa, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xaccf812f}, ++ {__LINE__, 0x8a45a2b8, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x78af45de}, ++ {__LINE__, 0xcbe95b78, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x25b06b59}, ++ {__LINE__, 0x4ef8a54b, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x4ba0d08f}, ++ {__LINE__, 0x76ad267a, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0xe26b6aac}, ++ {__LINE__, 0x569e613c, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x7e2b0a66}, ++ {__LINE__, 0x36aa61da, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xb3430dc7}, ++ {__LINE__, 0xf67222df, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x626c17a}, ++ {__LINE__, 0x74b34fd3, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xccf98060}, ++ {__LINE__, 0x351fd770, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xd8b95312}, ++ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xbb1c9912}, ++ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" ++ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" ++ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" ++ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" ++ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" ++ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 600, 0x888AFA5B} ++}; ++ ++static const int test_size = sizeof(tests) / sizeof(tests[0]); ++ ++int main(void) ++{ ++ int i; ++ for (i = 0; i < test_size; i++) { ++ test_crc32(tests[i].crc, (Byte*) tests[i].buf, tests[i].len, ++ tests[i].expect, tests[i].line); ++ } ++ return 0; ++} +-- +2.34.3 + + +From aae9203a38e8ba5933cde40918f6157cf90e78fb Mon Sep 17 00:00:00 2001 +From: Tulio Magno Quites Machado Filho +Date: Wed, 25 Mar 2020 12:16:41 -0300 +Subject: [PATCH 3/9] Fix clang's behavior on versions >= 7 + +Clang 7 changed the behavior of vec_xxpermdi in order to match GCC's +behavior. After this change, code that used to work on Clang 6 stopped +to work on Clang >= 7. + +Tested on Clang 6, 7, 8 and 9. + +Reference: https://bugs.llvm.org/show_bug.cgi?id=38192 + +Signed-off-by: Tulio Magno Quites Machado Filho +--- + contrib/power/clang_workaround.h | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +diff --git a/contrib/power/clang_workaround.h b/contrib/power/clang_workaround.h +index b5e7dae..915f7e5 100644 +--- a/contrib/power/clang_workaround.h ++++ b/contrib/power/clang_workaround.h +@@ -39,7 +39,12 @@ __vector unsigned long long __builtin_pack_vector (unsigned long __a, + return __v; + } + +-#ifndef vec_xxpermdi ++/* ++ * Clang 7 changed the behavior of vec_xxpermdi in order to provide the same ++ * behavior of GCC. That means code adapted to Clang >= 7 does not work on ++ * Clang <= 6. So, fallback to __builtin_unpack_vector() on Clang <= 6. ++ */ ++#if !defined vec_xxpermdi || __clang_major__ <= 6 + + static inline + unsigned long __builtin_unpack_vector (__vector unsigned long long __v, +@@ -62,9 +67,9 @@ static inline + unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v) + { + #if defined(__BIG_ENDIAN__) +- return vec_xxpermdi(__v, __v, 0x0)[1]; +- #else + return vec_xxpermdi(__v, __v, 0x0)[0]; ++ #else ++ return vec_xxpermdi(__v, __v, 0x3)[0]; + #endif + } + +@@ -72,9 +77,9 @@ static inline + unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v) + { + #if defined(__BIG_ENDIAN__) +- return vec_xxpermdi(__v, __v, 0x3)[1]; +- #else + return vec_xxpermdi(__v, __v, 0x3)[0]; ++ #else ++ return vec_xxpermdi(__v, __v, 0x0)[0]; + #endif + } + #endif /* vec_xxpermdi */ +-- +2.34.3 + + +From 772f4bd0f880c4c193ab7da78728f38821572a02 Mon Sep 17 00:00:00 2001 +From: Rogerio Alves +Date: Mon, 9 Dec 2019 14:40:53 -0300 +Subject: [PATCH 4/9] Adler32 vector optimization for Power. + +This commit implements a Power (POWER8+) vector optimization for Adler32 +checksum using VSX (vector) instructions. The VSX adler32 checksum is up +to 10x fast than the adler32 baseline code. + +Author: Rogerio Alves +--- + CMakeLists.txt | 1 + + Makefile.in | 8 ++ + adler32.c | 11 ++ + configure | 4 +- + contrib/power/adler32_power8.c | 196 +++++++++++++++++++++++++++++++ + contrib/power/adler32_resolver.c | 15 +++ + contrib/power/power.h | 4 +- + 7 files changed, 236 insertions(+), 3 deletions(-) + create mode 100644 contrib/power/adler32_power8.c + create mode 100644 contrib/power/adler32_resolver.c + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 581e1fa..c6296ee 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -185,6 +185,7 @@ if(CMAKE_COMPILER_IS_GNUCC) + if(POWER8) + add_definitions(-DZ_POWER8) + set(ZLIB_POWER8 ++ contrib/power/adler32_power8.c + contrib/power/crc32_z_power8.c) + + set_source_files_properties( +diff --git a/Makefile.in b/Makefile.in +index 1694304..a0ffac8 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -165,6 +165,9 @@ minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + adler32.o: $(SRCDIR)adler32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c + ++adler32_power8.o: $(SRCDIR)contrib/power/adler32_power8.c ++ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/adler32_power8.c ++ + crc32.o: $(SRCDIR)crc32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c + +@@ -216,6 +219,11 @@ adler32.lo: $(SRCDIR)adler32.c + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c + -@mv objs/adler32.o $@ + ++adler32_power8.lo: $(SRCDIR)contrib/power/adler32_power8.c ++ -@mkdir objs 2>/dev/null || test -d objs ++ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/adler32_power8.o $(SRCDIR)contrib/power/adler32_power8.c ++ -@mv objs/adler32_power8.o $@ ++ + crc32.lo: $(SRCDIR)crc32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c +diff --git a/adler32.c b/adler32.c +index d0be438..4bde0fa 100644 +--- a/adler32.c ++++ b/adler32.c +@@ -131,6 +131,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) + } + + /* ========================================================================= */ ++ ++#ifdef Z_POWER_OPT ++/* Rename the default function to avoid naming conflicts */ ++#define adler32 adler32_default ++#endif /* Z_POWER_OPT */ ++ + uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; +@@ -139,6 +145,11 @@ uLong ZEXPORT adler32(adler, buf, len) + return adler32_z(adler, buf, len); + } + ++#ifdef Z_POWER_OPT ++#undef adler32 ++#include "contrib/power/adler32_resolver.c" ++#endif /* Z_POWER_OPT */ ++ + /* ========================================================================= */ + local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; +diff --git a/configure b/configure +index 914d9f4..810a740 100755 +--- a/configure ++++ b/configure +@@ -879,8 +879,8 @@ if tryboth $CC -c $CFLAGS $test.c; then + + if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then + POWER8="-DZ_POWER8" +- PIC_OBJC="${PIC_OBJC} crc32_z_power8.lo" +- OBJC="${OBJC} crc32_z_power8.o" ++ PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo" ++ OBJC="${OBJC} adler32_power8.o crc32_z_power8.o" + echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log + else + echo "Checking for -mcpu=power8 support... No." | tee -a configure.log +diff --git a/contrib/power/adler32_power8.c b/contrib/power/adler32_power8.c +new file mode 100644 +index 0000000..473c394 +--- /dev/null ++++ b/contrib/power/adler32_power8.c +@@ -0,0 +1,196 @@ ++/* ++ * Adler32 for POWER 8+ using VSX instructions. ++ * ++ * Calculate adler32 checksum for 16 bytes at once using POWER8+ VSX (vector) ++ * instructions. ++ * ++ * If adler32 do 1 byte at time on the first iteration s1 is s1_0 (_n means ++ * iteration n) is the initial value of adler - at start _0 is 1 unless ++ * adler initial value is different than 1. So s1_1 = s1_0 + c[0] after ++ * the first calculation. For the iteration s1_2 = s1_1 + c[1] and so on. ++ * Hence, for iteration N, s1_N = s1_(N-1) + c[N] is the value of s1 on ++ * after iteration N. ++ * ++ * Therefore, for s2 and iteration N, s2_N = s2_0 + N*s1_N + N*c[0] + ++ * N-1*c[1] + ... + c[N] ++ * ++ * In a more general way: ++ * ++ * s1_N = s1_0 + sum(i=1 to N)c[i] ++ * s2_N = s2_0 + N*s1 + sum (i=1 to N)(N-i+1)*c[i] ++ * ++ * Where s1_N, s2_N are the values for s1, s2 after N iterations. So if we ++ * can process N-bit at time we can do this at once. ++ * ++ * Since VSX can support 16-bit vector instructions, we can process ++ * 16-bit at time using N = 16 we have: ++ * ++ * s1 = s1_16 = s1_(16-1) + c[16] = s1_0 + sum(i=1 to 16)c[i] ++ * s2 = s2_16 = s2_0 + 16*s1 + sum(i=1 to 16)(16-i+1)*c[i] ++ * ++ * After the first iteration we calculate the adler32 checksum for 16 bytes. ++ * ++ * For more background about adler32 please check the RFC: ++ * https://www.ietf.org/rfc/rfc1950.txt ++ * ++ * Copyright (C) 2019 Rogerio Alves , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ * ++ */ ++ ++#include "../../zutil.h" ++#include ++ ++/* Largest prime smaller than 65536. */ ++#define BASE 65521U ++#define NMAX 5552 ++/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1. */ ++ ++#define DO1(s1,s2,buf,i) {(s1) += buf[(i)]; (s2) += (s1);} ++#define DO2(s1,s2,buf,i) {DO1(s1,s2,buf,i); DO1(s1,s2,buf,i+1);} ++#define DO4(s1,s2,buf,i) {DO2(s1,s2,buf,i); DO2(s1,s2,buf,i+2);} ++#define DO8(s1,s2,buf,i) {DO4(s1,s2,buf,i); DO4(s1,s2,buf,i+4);} ++#define DO16(s1,s2,buf) {DO8(s1,s2,buf,0); DO8(s1,s2,buf,8);} ++ ++/* Vector across sum unsigned int (saturate). */ ++inline vector unsigned int vec_sumsu (vector unsigned int __a, ++ vector unsigned int __b) ++{ ++ __b = vec_sld(__a, __a, 8); ++ __b = vec_add(__b, __a); ++ __a = vec_sld(__b, __b, 4); ++ __a = vec_add(__a, __b); ++ ++ return __a; ++} ++ ++uLong ZLIB_INTERNAL _adler32_power8 (uLong adler, const Bytef* buf, uInt len) ++{ ++ /* If buffer is empty or len=0 we need to return adler initial value. */ ++ if (buf == NULL) ++ return 1; ++ ++ unsigned int s1 = adler & 0xffff; ++ unsigned int s2 = (adler >> 16) & 0xffff; ++ ++ /* in case user likes doing a byte at a time, keep it fast */ ++ if (len == 1) { ++ s1 += buf[0]; ++ if (s1 >= BASE) ++ s1 -= BASE; ++ s2 += s1; ++ if (s2 >= BASE) ++ s2 -= BASE; ++ return (s2 << 16) | s1; ++ } ++ ++ /* Keep it fast for short length buffers. */ ++ if (len < 16) { ++ while (len--) { ++ s1 += *buf++; ++ s2 += s1; ++ } ++ if (s1 >= BASE) ++ s1 -= BASE; ++ s2 %= BASE; ++ return (s2 << 16) | s1; ++ } ++ ++ /* This is faster than VSX code for len < 64. */ ++ if (len < 64) { ++ while (len >= 16) { ++ len -= 16; ++ DO16(s1,s2,buf); ++ buf += 16; ++ } ++ } else { ++ /* Use POWER VSX instructions for len >= 64. */ ++ const vector unsigned int v_zeros = { 0 }; ++ const vector unsigned char v_mul = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, ++ 6, 5, 4, 3, 2, 1}; ++ const vector unsigned char vsh = vec_splat_u8(4); ++ const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0}; ++ vector unsigned int vs1 = vec_xl(0, &s1); ++ vector unsigned int vs2 = vec_xl(0, &s2); ++ vector unsigned int vs1_save = { 0 }; ++ vector unsigned int vsum1, vsum2; ++ vector unsigned char vbuf; ++ int n; ++ ++ /* Zeros the undefined values of vectors vs1, vs2. */ ++ vs1 = vec_and(vs1, vmask); ++ vs2 = vec_and(vs2, vmask); ++ ++ /* Do length bigger than NMAX in blocks of NMAX size. */ ++ while (len >= NMAX) { ++ len -= NMAX; ++ n = NMAX / 16; ++ do { ++ vbuf = vec_xl(0, (unsigned char *) buf); ++ vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ ++ /* sum(i=1 to 16) buf[i]*(16-i+1). */ ++ vsum2 = vec_msum(vbuf, v_mul, v_zeros); ++ /* Save vs1. */ ++ vs1_save = vec_add(vs1_save, vs1); ++ /* Accumulate the sums. */ ++ vs1 = vec_add(vsum1, vs1); ++ vs2 = vec_add(vsum2, vs2); ++ ++ buf += 16; ++ } while (--n); ++ /* Once each block of NMAX size. */ ++ vs1 = vec_sumsu(vs1, vsum1); ++ vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ ++ vs2 = vec_add(vs1_save, vs2); ++ vs2 = vec_sumsu(vs2, vsum2); ++ ++ /* vs1[0] = (s1_i + sum(i=1 to 16)buf[i]) mod 65521. */ ++ vs1[0] = vs1[0] % BASE; ++ /* vs2[0] = s2_i + 16*s1_save + ++ sum(i=1 to 16)(16-i+1)*buf[i] mod 65521. */ ++ vs2[0] = vs2[0] % BASE; ++ ++ vs1 = vec_and(vs1, vmask); ++ vs2 = vec_and(vs2, vmask); ++ vs1_save = v_zeros; ++ } ++ ++ /* len is less than NMAX one modulo is needed. */ ++ if (len >= 16) { ++ while (len >= 16) { ++ len -= 16; ++ ++ vbuf = vec_xl(0, (unsigned char *) buf); ++ ++ vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ ++ /* sum(i=1 to 16) buf[i]*(16-i+1). */ ++ vsum2 = vec_msum(vbuf, v_mul, v_zeros); ++ /* Save vs1. */ ++ vs1_save = vec_add(vs1_save, vs1); ++ /* Accumulate the sums. */ ++ vs1 = vec_add(vsum1, vs1); ++ vs2 = vec_add(vsum2, vs2); ++ ++ buf += 16; ++ } ++ /* Since the size will be always less than NMAX we do this once. */ ++ vs1 = vec_sumsu(vs1, vsum1); ++ vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ ++ vs2 = vec_add(vs1_save, vs2); ++ vs2 = vec_sumsu(vs2, vsum2); ++ } ++ /* Copy result back to s1, s2 (mod 65521). */ ++ s1 = vs1[0] % BASE; ++ s2 = vs2[0] % BASE; ++ } ++ ++ /* Process tail (len < 16). */ ++ while (len--) { ++ s1 += *buf++; ++ s2 += s1; ++ } ++ s1 %= BASE; ++ s2 %= BASE; ++ ++ return (s2 << 16) | s1; ++} +diff --git a/contrib/power/adler32_resolver.c b/contrib/power/adler32_resolver.c +new file mode 100644 +index 0000000..07a1a2c +--- /dev/null ++++ b/contrib/power/adler32_resolver.c +@@ -0,0 +1,15 @@ ++/* Copyright (C) 2019 Rogerio Alves , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "../gcc/zifunc.h" ++#include "power.h" ++ ++Z_IFUNC(adler32) { ++#ifdef Z_POWER8 ++ if (__builtin_cpu_supports("arch_2_07")) ++ return _adler32_power8; ++#endif ++ ++ return adler32_default; ++} +diff --git a/contrib/power/power.h b/contrib/power/power.h +index 79123aa..f57c761 100644 +--- a/contrib/power/power.h ++++ b/contrib/power/power.h +@@ -2,7 +2,9 @@ + * 2019 Rogerio Alves , IBM + * For conditions of distribution and use, see copyright notice in zlib.h + */ +- + #include "../../zconf.h" ++#include "../../zutil.h" ++ ++uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); + + unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); +-- +2.34.3 + + +From f5de1ed4288561443323ba41de68d65b31bc3a19 Mon Sep 17 00:00:00 2001 +From: Rogerio Alves +Date: Tue, 10 Dec 2019 15:04:28 -0300 +Subject: [PATCH 5/9] Tests for Adler32 vector optimization for Power. + +This commit add tests for adler32 vector optimization for Power (POWER8+). + +Author: Rogerio Alves +--- + CMakeLists.txt | 10 ++ + Makefile.in | 36 +++-- + test/adler32_test.c | 339 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 378 insertions(+), 10 deletions(-) + create mode 100644 test/adler32_test.c + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index c6296ee..44de486 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -299,6 +299,10 @@ endif() + # Example binaries + #============================================================================ + ++add_executable(adler32_test test/adler32_test.c) ++target_link_libraries(adler32_test zlib) ++add_test(adler32_test adler32_test) ++ + add_executable(example test/example.c) + target_link_libraries(example zlib) + add_test(example example) +@@ -311,6 +315,12 @@ add_executable(minigzip test/minigzip.c) + target_link_libraries(minigzip zlib) + + if(HAVE_OFF64_T) ++ ++ add_executable(adler32_test64 test/adler32_test.c) ++ target_link_libraries(adler32_test64 zlib) ++ set_target_properties(adler32_test64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") ++ add_test(adler32_test64 adler32_test64) ++ + add_executable(example64 test/example.c) + target_link_libraries(example64 zlib) + set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +diff --git a/Makefile.in b/Makefile.in +index a0ffac8..9ef9fa9 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -75,11 +75,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + + all: static shared + +-static: crc32_test$(EXE) example$(EXE) minigzip$(EXE) ++static: adler32_test$(EXE) crc32_test$(EXE) example$(EXE) minigzip$(EXE) + +-shared: crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) ++shared: adler32_testsh$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) + +-all64: crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) ++all64: adler32_test64$(EXE) crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) + + check: test + +@@ -87,7 +87,7 @@ test: all teststatic testshared + + teststatic: static + @TMPST=tmpst_$$; \ +- if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./crc32_test; then \ ++ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./adler32_test && ./crc32_test; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; false; \ +@@ -100,7 +100,7 @@ testshared: shared + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=tmpsh_$$; \ +- if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./crc32_testsh; then \ ++ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./adler32_testsh && ./crc32_testsh; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ +@@ -109,7 +109,7 @@ testshared: shared + + test64: all64 + @TMP64=tmp64_$$; \ +- if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./crc32_test64; then \ ++ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./adler32_test64 && ./crc32_test64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ +@@ -143,6 +143,9 @@ match.lo: match.S + mv _match.o match.lo + rm -f _match.s + ++adler32_test.o: $(SRCDIR)test/adler32_test.c $(SRCDIR)zlib.h zconf.h ++ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/adler32_test.c ++ + crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c + +@@ -152,6 +155,9 @@ example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c + ++adler32_test64.o: $(SRCDIR)test/adler32_test.c $(SRCDIR)zlib.h zconf.h ++ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/adler32_test.c ++ + crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c + +@@ -307,6 +313,9 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + ln -s $@ $(SHAREDLIBM) + -@rmdir objs + ++adler32_test$(EXE): adler32_test.o $(STATICLIB) ++ $(CC) $(CFLAGS) -o $@ adler32_test.o $(TEST_LDFLAGS) ++ + crc32_test$(EXE): crc32_test.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ crc32_test.o $(TEST_LDFLAGS) + +@@ -316,6 +325,9 @@ example$(EXE): example.o $(STATICLIB) + minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + ++adler32_testsh$(EXE): adler32_test.o $(SHAREDLIBV) ++ $(CC) $(CFLAGS) -o $@ adler32_test.o -L. $(SHAREDLIBV) ++ + crc32_testsh$(EXE): crc32_test.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) + +@@ -325,6 +337,9 @@ examplesh$(EXE): example.o $(SHAREDLIBV) + minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + ++adler32_test64$(EXE): adler32_test64.o $(STATICLIB) ++ $(CC) $(CFLAGS) -o $@ adler32_test64.o $(TEST_LDFLAGS) ++ + crc32_test64$(EXE): crc32_test64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) + +@@ -397,8 +412,9 @@ zconf: $(SRCDIR)zconf.h.in + mostlyclean: clean + clean: + rm -f *.o *.lo *~ \ +- crc32_test$(EXE) example$(EXE) minigzip$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ +- crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ ++ adler32_test$(EXE) crc32_test$(EXE) example$(EXE) minigzip$(EXE) \ ++ adler32_testsh$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ ++ adler32_test64$(EXE) crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ + infcover \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o +@@ -418,7 +434,7 @@ distclean: clean zconf zconf.h.cmakein + tags: + etags $(SRCDIR)*.[ch] + +-adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h ++adler32.o adler32_test.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h + compress.o crc32_test.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h + crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +@@ -428,7 +444,7 @@ inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR + inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h + trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h + +-adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h ++adler32.lo adler32_test.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h + gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h + compress.lo crc32_test.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h + crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +diff --git a/test/adler32_test.c b/test/adler32_test.c +new file mode 100644 +index 0000000..6cf3e2b +--- /dev/null ++++ b/test/adler32_test.c +@@ -0,0 +1,339 @@ ++/* adler32_test.c -- unit test for adler32 in the zlib compression library ++ * Copyright (C) 2019 Rogerio Alves , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "zlib.h" ++#include ++ ++#ifdef STDC ++# include ++# include ++#endif ++ ++void test_adler32 OF((uLong adler, Byte* buf, z_size_t len, uLong chk, int line)); ++int main OF((void)); ++ ++typedef struct { ++ int line; ++ uLong adler; ++ Byte* buf; ++ int len; ++ uLong expect; ++} adler32_test; ++ ++void test_adler32(adler, buf, len, chk, line) ++ uLong adler; ++ Byte *buf; ++ z_size_t len; ++ uLong chk; ++ int line; ++{ ++ uLong res = adler32(adler, buf, len); ++ if (res != chk) { ++ fprintf(stderr, "FAIL [%d]: adler32 returned 0x%08X expected 0x%08X\n", ++ line, (unsigned int)res, (unsigned int)chk); ++ exit(1); ++ } ++} ++ ++static const adler32_test tests[] = { ++ {__LINE__,0x1, 0x0, 0, 0x1}, ++ {__LINE__,0x1, "", 1, 0x10001}, ++ {__LINE__,0x1, "a", 1, 0x620062}, ++ {__LINE__,0x1, "abacus", 6, 0x8400270}, ++ {__LINE__,0x1, "backlog", 7, 0xb1f02d4}, ++ {__LINE__,0x1, "campfire", 8, 0xea10348}, ++ {__LINE__,0x1, "delta", 5, 0x61a020b}, ++ {__LINE__,0x1, "executable", 10, 0x16fa0423}, ++ {__LINE__,0x1, "file", 4, 0x41401a1}, ++ {__LINE__,0x1, "greatest", 8, 0xefa0360}, ++ {__LINE__,0x1, "inverter", 8, 0xf6f0370}, ++ {__LINE__,0x1, "jigsaw", 6, 0x8bd0286}, ++ {__LINE__,0x1, "karate", 6, 0x8a50279}, ++ {__LINE__,0x1, "landscape", 9, 0x126a03ac}, ++ {__LINE__,0x1, "machine", 7, 0xb5302d6}, ++ {__LINE__,0x1, "nanometer", 9, 0x12d803ca}, ++ {__LINE__,0x1, "oblivion", 8, 0xf220363}, ++ {__LINE__,0x1, "panama", 6, 0x8a1026f}, ++ {__LINE__,0x1, "quest", 5, 0x6970233}, ++ {__LINE__,0x1, "resource", 8, 0xf8d0369}, ++ {__LINE__,0x1, "secret", 6, 0x8d10287}, ++ {__LINE__,0x1, "ultimate", 8, 0xf8d0366}, ++ {__LINE__,0x1, "vector", 6, 0x8fb0294}, ++ {__LINE__,0x1, "walrus", 6, 0x918029f}, ++ {__LINE__,0x1, "xeno", 4, 0x45e01bb}, ++ {__LINE__,0x1, "yelling", 7, 0xbfe02f5}, ++ {__LINE__,0x1, "zero", 4, 0x46e01c1}, ++ {__LINE__,0x1, "4BJD7PocN1VqX0jXVpWB", 20, 0x3eef064d}, ++ {__LINE__,0x1, "F1rPWI7XvDs6nAIRx41l", 20, 0x425d065f}, ++ {__LINE__,0x1, "ldhKlsVkPFOveXgkGtC2", 20, 0x4f1a073e}, ++ {__LINE__,0x1, "5KKnGOOrs8BvJ35iKTOS", 20, 0x42290650}, ++ {__LINE__,0x1, "0l1tw7GOcem06Ddu7yn4", 20, 0x43fd0690}, ++ {__LINE__,0x1, "MCr47CjPIn9R1IvE1Tm5", 20, 0x3f770609}, ++ {__LINE__,0x1, "UcixbzPKTIv0SvILHVdO", 20, 0x4c7c0703}, ++ {__LINE__,0x1, "dGnAyAhRQDsWw0ESou24", 20, 0x48ac06b7}, ++ {__LINE__,0x1, "di0nvmY9UYMYDh0r45XT", 20, 0x489a0698}, ++ {__LINE__,0x1, "2XKDwHfAhFsV0RhbqtvH", 20, 0x44a906e6}, ++ {__LINE__,0x1, "ZhrANFIiIvRnqClIVyeD", 20, 0x4a29071c}, ++ {__LINE__,0x1, "v7Q9ehzioTOVeDIZioT1", 20, 0x4a7706f9}, ++ {__LINE__,0x1, "Yod5hEeKcYqyhfXbhxj2", 20, 0x4ce60769}, ++ {__LINE__,0x1, "GehSWY2ay4uUKhehXYb0", 20, 0x48ae06e5}, ++ {__LINE__,0x1, "kwytJmq6UqpflV8Y8GoE", 20, 0x51d60750}, ++ {__LINE__,0x1, "70684206568419061514", 20, 0x2b100414}, ++ {__LINE__,0x1, "42015093765128581010", 20, 0x2a550405}, ++ {__LINE__,0x1, "88214814356148806939", 20, 0x2b450423}, ++ {__LINE__,0x1, "43472694284527343838", 20, 0x2b460421}, ++ {__LINE__,0x1, "49769333513942933689", 20, 0x2bc1042b}, ++ {__LINE__,0x1, "54979784887993251199", 20, 0x2ccd043d}, ++ {__LINE__,0x1, "58360544869206793220", 20, 0x2b68041a}, ++ {__LINE__,0x1, "27347953487840714234", 20, 0x2b84041d}, ++ {__LINE__,0x1, "07650690295365319082", 20, 0x2afa0417}, ++ {__LINE__,0x1, "42655507906821911703", 20, 0x2aff0412}, ++ {__LINE__,0x1, "29977409200786225655", 20, 0x2b8d0420}, ++ {__LINE__,0x1, "85181542907229116674", 20, 0x2b140419}, ++ {__LINE__,0x1, "87963594337989416799", 20, 0x2c8e043f}, ++ {__LINE__,0x1, "21395988329504168551", 20, 0x2b68041f}, ++ {__LINE__,0x1, "51991013580943379423", 20, 0x2af10417}, ++ {__LINE__,0x1, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x7c9d0841}, ++ {__LINE__,0x1, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x71060751}, ++ {__LINE__,0x1, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x7095070a}, ++ {__LINE__,0x1, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x82530815}, ++ {__LINE__,0x1, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x61250661}, ++ {__LINE__,0x1, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x642006a3}, ++ {__LINE__,0x1, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x674206cb}, ++ {__LINE__,0x1, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x67670680}, ++ {__LINE__,0x1, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0x7547070f}, ++ {__LINE__,0x1, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x69ea06ee}, ++ {__LINE__,0x1, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x1b01e92}, ++ {__LINE__,0x1, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xfbdb1e96}, ++ {__LINE__,0x1, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0x47a61ec8}, ++ {__LINE__,0x1, "qjdwq48mBukJVUzVVfMjiqSWL5GnFSPQQDi6mE9ZaAPh9drb5tXUULwqekEH6W7kAxNQRkdV5ynU" ++ "NWQYiW59RpDCxpuhCamrznzAdJ6uNerx7Q3vVhHSHSfKfeET9JfKwtxJ2y7BxXXpGbTg3kU6EZMtJ" ++ "qvnST6x5x4PzpMFVbdmfGnJmwzK8aqEDeb3hBVgy3PL58rzXbQgH7LcZB3C4ytukzhvCYpp8Hv5Xw" ++ "4LRVV4UC84TEaNZS7UuzfHpPJuYZhT6evzVFhuyHbkJMf36gyLEWtBBdd9uMZkFGfhqk5kfrM7cM7" ++ "ynu8bd7QfEmFKxWfB2F85qzy3RiUmXkhNJyBChux4fkJ56XTWh8J4mKpN3gCgAEeZxAP2E4tQ5XYj" ++ "6mbhGav6tv6CMGPuBCAVb29d2c5abXwVG6a7c8G6KUQmwPV5NxbvxENCANtvNBzXBRqUniAQdmaD7" ++ "Yf3J8YmwZbwrHqEjcuEiiSbnGPaFjcRDDGFviaiM7BewmLEF2Y447YCtyq72VGmmEeVumLpRXWzVK" ++ "EkpVrJdN3tiuSVw2wUQ3Fq4hqkB7RXBFQZbb4EKvTBwkVCxdKgNSukp9zwcyUMVE2YPFh9Tyhwb9P" ++ "wGcWWkjJQNBUG69UbvaN9NCGnxR69QChejPUhURi4TBW5wmJpe7r9tc9ZjprFCeUPxTAN76aiyewF" ++ "CXHYGCqqmAt7zuDSLUCf7etGVFucx5M7NiM6h2nHShKMdTzXdxx4qzdDa2XrprRmUUySHcaFeZaUP" ++ "9VJeqjYMxevK7MPN2b6fPhH4UXknfQM99aJNewyfFPpaFYaMLWiTMB3UvXvGp7afu4SyX9ggbBGci" ++ "MUnma7qf9nQ2VL6eTR249d6QBYq249GQEbY5u2TQGL5n4Y2yGFjc8MGLe3aNvAAWtRS2iDR8jdQ36" ++ "CVMewjUZwM4bm8JPQLPRcrbVC3N8K4dWDNUAA2JpbDdpjNCkAjBacuvLXUB4UXWeCbCudAvUzPtDe" ++ "5yYcxK47jeeDM5KBQ6dpTTRjMEEMrN687qxFSxEU4dB65WCemJe5jwVJwvd7vfKum8hWTeQjM8RYd" ++ "BR2rFj7dEqVkejP93XRpRbAv74AM2krE7X37k5cB7W5uJBQR2V7hQh9gGyccxMz7G2Jwvj59EbkzW" ++ "TCb4KRXTkVSG2jd6yE4PHKwamFZx9ji2dXua4aMz8ppzgtH5YLQcRFmEnGXdf7x8jgJzDSaShy5hY" ++ "NpwYWhENv8QDWZkferZD7RDT2HXzGXfvEzPvUHe4RWUxtt4wprzK9fghPrfvkhce58aLFJMGRaNqS" ++ "gWe7RKRABz6vSpwnexkErjfYx89zeT6EGv9fDANvyU7DM2E5WG6b9qgYFfkqQExYCRG6Rh4JdUDb9" ++ "b8rfVdgb2zZdmXvjYdwK8GrvjNychu5zgJHaZbzGCrPfyP6FPh79w7yR3nEhGD4mYEqkafaRBqtWE" ++ "TpH7kX2dX6WnHmwMiYMEF5RppycbqR9YtT7wuKMQznP7gx6R4xNvwM6jKv7aY4aM6nz3E2VN4iEfu" ++ "WJWe83QeaFPc3PkizdqmqMad8D3FMedEjzVedzHDJ8XgEiuc7AwSJ2Ae8rqCm99ag2yyPMe83Trm8" ++ "jvrpMZYga92dHBm946aZVuSHg3XhiN3BSEk9k29RAi3LXMBS4SFFFwudMT9KB7RUR8D8T5UtERxnx" ++ "hvkBNkEUTtpruZhtE4iPzfzqMpfAK2DtjfcYENMxkg7TU2cdVg2zLijYqbTAyvatN5tZ5nDayGnPx" ++ "VkM8tJZGg59RhPPJNXpGJp2yAvdGUz3VMyqUNMYpBZUhjqzqxw7dJQuFq3m9cQWd67bVM7Pjrk9hR" ++ "zmbiBuEL9kvhhW2KeMUQpAQYJGETULfqG4zKKyaUWKDPcNDVSY6TpRyyJaTJWQ9pFPXyk9zz4Gdaz" ++ "Xnh4JPWVDrUma8abXFJXL4SX5WpWhyxBfdCXw7rgVTHai4Nvcwn23AiAJ9Ncz7nn3nhniRibEhkUc" ++ "cU6fxqNyHMeJBUBrga8VaGVyuccvCHWygzQ24kSmfeGHvQ3PefSVPcUe3Pxdc7cfgDw2tqyg2QV4K" ++ "aQgBbLx9maK4ixgQM9WN2wpv2kBy9kAcfZDRASdvwffqtK3jxDGPnurvUkA2dRNTG4Bgkth7JkFAC" ++ "gWgJFzSQcvMbDeHQSjvGERkfiPEFN6ypbtMcQB7gwJ73dVEmz66PPdirJHDHJrbnvzWeugBuZ2mD5" ++ "hFXB2r6wuY4NXKavV3jBrrCcwRgS8VbF2NMcK8YEENKXKVBxnQpaqfktzYEPZynacBVaxbdXrd8PH" ++ "FvrV5gJw6ihddpJccYSqWmU5GbHNzEZKEyMcGidwZDNNwStgyaYbHeMNfYY7a9bMUkaVkCnakUHAM" ++ "ivktadi3Fd52ApUcJURhGdAYvqXcwrx4j34bFdaLNJ3Zg6WQRuPtMA3F6yKYG2tvupwbGSK5p4dEw" ++ "6gtV4b2nbZ33fmd2camjXUED66FwH97ZYdXCKigpFYn2bF4RuVkfdJiabXH7vKaQiWMjMiainFhrq" ++ "4wxm4qyF8wi4DBALBUuKvKnaQiekvQU5wQcrA6MwygnevK7Wu2yfQueryawVpfQzCuii9SPqLrCHS" ++ "3Ep8SmQSKrVbJRmwcnQNQ4MufXSfUZxU4jK4GzX7QjRhiGmqcVTxUaEbQqEiFK7KiRJ5YFVB7R8Mi" ++ "fjZwjbBupNYrSrfhEJTBPRDVKAZARjzfBiYLFGVYwRCPGm97C5eywNKNaQjaW32fGwnM6FuK8g8MG" ++ "re9Zzy2GUkG6mAD4nb8aqSmS65R5D5SBgXT8QVdAngy8ah7K9HDJFwG4wTJFfi8XeBJKH7VyX7E8S" ++ "AdbwS8YaJdjEVJTEUR57VMEvD3z5rkzvemA7P8jXEfQq8Dgy8jAeBccMzk2cqvvyQyhgpvMmmCGDk" ++ "8uTnQHGHfbJj5Xci77qbR8bbzffhYQ7uBXeijMqCTMvtJJwbFvJme2ue8LVGqAjm7mgm5irppUyF6" ++ "fbu6qLMEtVWCtepwanwyXh8eGCHqrXG9ch7k8MGbamYQw8JzaFr4WMjPqazUyu3bZfY57gNMhMa3C" ++ "K66fapifqkTizwfZcHLXg6mgrwYuK8Lp8PRARAbZVaxVcGAHtY6PTLWNzgzkdEvCtZMZK4w95DWfU" ++ "85u6b5B8gyCEQze9pNSPDDfxkZ4RvXVkpbntcFRex9CDJ26fZDwJRjj9bwNNpRfZzjFrQeFxftVVA" ++ "yJGWZHrD5MuHVLNUVXzj9rvedRcuVxrc6kLhqwUWQgGFCtEaDhx95PRZEM5f42tA6frXGXYB8GEnB" ++ "vxfMRfBzY32qzGtPC66rzJrcnd6hewDDhVLuib5KdSy9NpErDkBzuvdQpK5mJrbYZ7pMJFEqxfEKU" ++ "U4fa6g5aqDU8FyRaP55xz6VTPDmy7U5CA7Qhwr6xgQibKFpBXQhiErCzvxWQ6p6bMKVxukdRSkQpn" ++ "hdQYxnx5Kt5wA5pkFzWpjUyVxGmyLAXHGAaJ5EPqEU7p6A9ndGDgihtWbcE2PdyJMu4gPSXJvw3vD" ++ "qUiUTqEY52tbjP2jD9yiB5Y3XLwmVXzXrZdHLAHkRX5iLmq3paGPjghRPYUzM5RMAEQVcwr4MSkND" ++ "iRRxtqTiuNKRxZKagGy9cjJS93HTfFq6DWFKheppbqNkACmyuBJvqDejeb2wRtJNjFTA8LmXiTgjc" ++ "V4Vh2hRp29kccGDhztihtWRnYi8u6G9TP99JPYRhXKzhLWrCU2LTk2m6WLPTZztiH5GwtEvzkbHbb" ++ "WWubihCQnHNu5uKXrMWU3YkP2kxfxCwzzbG8yWejv2vrtqzpYdw6ZDJL9FzGU4a8H6Uaq7yQJvmDP" ++ "Sjqvtntgj3t8fKK7bWdFiNKaRVVVvmAQ2yjctfkj7XyjbUFwW396ASJpq2Z7Lpb7b5iprrhPMhjcy" ++ "euhBd99ufdgupwu9ScLUgAyVFV6DDXiVmuYPJvLTAFMQHZ6v8pALPzCVaChXjW8GzjdM4uxwHgVqK" ++ "zbg23DNyGXFTvTLyvL9gcCR8LA7YNtnR6bnm9ihtTFaVNJJ3JqpW7bTGrMka7DHvyTACUPuqLRY4q" ++ "hyfFJxK7NBv3aZMtUx89VEtjKruYYAuwY2yQzSnJB2tXxKzg6dni7ZNFQ6wNrbkdWXStcUm642ew6" ++ "xZaQA74hHzreJqjw4qciR4xnrjrPgE7tkbZrAbdgiGVDEULbJUq2SKmAULkQ4NpkGC6RZByBBjyxL" ++ "dhLG6xHzT5dY42mqQyH6cNumUviYZ74LKFbv2Yhx8aRwqxEaTymC2QUTDQvuM9D8r8bmpE7CT9BAG" ++ "kbGzZGLNkh3kJefdxF8WK7T6hHVChPuHevwzPKrDGXZBXfHQ4eDyWZ64KAeaFSNhxSWJcEPgjawTm" ++ "ZXEPYRM2R2XNFXYWxzpJgnD4ip6Nr9GkEhThUhxBQ9H7wUPQdG6qpjjvCaXJNGYwfHCxFkz39rh87" ++ "5ViVCRqxN22iWFU7THfzEanuQtUYGt3Amr6dfenezFuUN8mhpRNSH66VMStqPEiuyg8LQYYGeWWCG" ++ "ybytuPRP5mNKBZwftkx3LbqdwSGEhRF4qe56F2nqTRyfnYh2FuxMiihwGCZviCaXUCY8dhRxVnvGi" ++ "DaUpUaebFwPdXnKh9Hrbg2fmXkmq6n5bGHdR9DUcrZYWSZxptxy4kjFUtCieibpe4Czh335QPnGiA" ++ "8cQzBaV42B2zuu3iLwygKHky2Bbe5e4eU4znPzacEfuMGCgzj4E7RtDKctpgWHCHJQJcF54WK7jhA" ++ "TKztSffjCc8n7cTURQE7AWZzK5j2HkajggWw4TA9JUeSNPKdkLQGZeWiHujCz4E2v5Lu9Za9AbCMG" ++ "XBC2YZeUnE5YnyFhHp9jYFVwYr8QfCJ4TtzQNMe743yEMmbSchwaXEdEzth9kpAkKHxqKZBua93UU" ++ "u8EDvykWYXkrRDXnQVdeDgxEVYwkmKrHDt26NUg3tB9tuMDzYKzKrV5iepMdtw6affWkLigMVMYbx" ++ "e4hhYgwZmee6RWMxGyVn6egAgKaN7pauE46MtXhgbjp5xxBP3JM7jZPyeQZetj3tFVxmbbByJLL93" ++ "Ra5jSVte26mHwrwr6Q3xzmAdxtEHcZxcPjruUWk6gXgnfn7HMBtv6vxgMfe2wmydHSqcKUH2XhdpQ" ++ "7JXiXfazVAF28zvhChe4gzwzhqp6Bnm8hWU7zhT6Jf4ZnQWz2N4tg7u4X2CFLnJnmj3P3YeJRAHeR" ++ "Dz7uXYyDwJmGUPH5SdaFFYcMf33LvVBUCAdNHQh784rpGvMDH7eEriKQiBDMZpcRGucHaNkEf9R7x" ++ "635ux3hvp6qrjufWTqPnYLB6UwP2TWRg233eNVajbe4TuJuuFBDGHxxk5Ge34BmLSbitTpMDZAAir" ++ "Jp4HUAGydQ5URF8qaSHn5z9g3uRHmGmbpcLZYumiKAQRTXGtb8776wMNfRGrLmqn75kX8guK7YwKq" ++ "UeWAriZapqL5PuntyGxCNXqPrUvArrqefczM7N6azZatfp4vJYjhMDtkABpQAyxX7pS8mMyKBA527" ++ "byRKqAu3J", 5552, 0x8b81718f}, ++ {__LINE__,0x7a30360d, 0x0, 0, 0x1}, ++ {__LINE__,0x6fd767ee, "", 1, 0xd7c567ee}, ++ {__LINE__,0xefeb7589, "a", 1, 0x65e475ea}, ++ {__LINE__,0x61cf7e6b, "abacus", 6, 0x60b880da}, ++ {__LINE__,0xdc712e2, "backlog", 7, 0x9d0d15b5}, ++ {__LINE__,0xad23c7fd, "campfire", 8, 0xfbfecb44}, ++ {__LINE__,0x85cb2317, "delta", 5, 0x3b622521}, ++ {__LINE__,0x9eed31b0, "executable", 10, 0xa6db35d2}, ++ {__LINE__,0xb94f34ca, "file", 4, 0x9096366a}, ++ {__LINE__,0xab058a2, "greatest", 8, 0xded05c01}, ++ {__LINE__,0x5bff2b7a, "inverter", 8, 0xc7452ee9}, ++ {__LINE__,0x605c9a5f, "jigsaw", 6, 0x7899ce4}, ++ {__LINE__,0x51bdeea5, "karate", 6, 0xf285f11d}, ++ {__LINE__,0x85c21c79, "landscape", 9, 0x98732024}, ++ {__LINE__,0x97216f56, "machine", 7, 0xadf4722b}, ++ {__LINE__,0x18444af2, "nanometer", 9, 0xcdb34ebb}, ++ {__LINE__,0xbe6ce359, "oblivion", 8, 0xe8b7e6bb}, ++ {__LINE__,0x843071f1, "panama", 6, 0x389e745f}, ++ {__LINE__,0xf2480c60, "quest", 5, 0x36c90e92}, ++ {__LINE__,0x2d2feb3d, "resource", 8, 0x9705eea5}, ++ {__LINE__,0x7490310a, "secret", 6, 0xa3a63390}, ++ {__LINE__,0x97d247d4, "ultimate", 8, 0xe6154b39}, ++ {__LINE__,0x93cf7599, "vector", 6, 0x5e87782c}, ++ {__LINE__,0x73c84278, "walrus", 6, 0xbc84516}, ++ {__LINE__,0x228a87d1, "xeno", 4, 0x4646898b}, ++ {__LINE__,0xa7a048d0, "yelling", 7, 0xb1654bc4}, ++ {__LINE__,0x1f0ded40, "zero", 4, 0xd8a4ef00}, ++ {__LINE__,0xa804a62f, "4BJD7PocN1VqX0jXVpWB", 20, 0xe34eac7b}, ++ {__LINE__,0x508fae6a, "F1rPWI7XvDs6nAIRx41l", 20, 0x33f2b4c8}, ++ {__LINE__,0xe5adaf4f, "ldhKlsVkPFOveXgkGtC2", 20, 0xe7b1b68c}, ++ {__LINE__,0x67136a40, "5KKnGOOrs8BvJ35iKTOS", 20, 0xf6a0708f}, ++ {__LINE__,0xb00c4a10, "0l1tw7GOcem06Ddu7yn4", 20, 0xbd8f509f}, ++ {__LINE__,0x2e0c84b5, "MCr47CjPIn9R1IvE1Tm5", 20, 0xcc298abd}, ++ {__LINE__,0x81238d44, "UcixbzPKTIv0SvILHVdO", 20, 0xd7809446}, ++ {__LINE__,0xf853aa92, "dGnAyAhRQDsWw0ESou24", 20, 0x9525b148}, ++ {__LINE__,0x5a692325, "di0nvmY9UYMYDh0r45XT", 20, 0x620029bc}, ++ {__LINE__,0x3275b9f, "2XKDwHfAhFsV0RhbqtvH", 20, 0x70916284}, ++ {__LINE__,0x38371feb, "ZhrANFIiIvRnqClIVyeD", 20, 0xd52706}, ++ {__LINE__,0xafc8bf62, "v7Q9ehzioTOVeDIZioT1", 20, 0xeeb4c65a}, ++ {__LINE__,0x9b07db73, "Yod5hEeKcYqyhfXbhxj2", 20, 0xde3e2db}, ++ {__LINE__,0xe75b214, "GehSWY2ay4uUKhehXYb0", 20, 0x4171b8f8}, ++ {__LINE__,0x72d0fe6f, "kwytJmq6UqpflV8Y8GoE", 20, 0xa66a05cd}, ++ {__LINE__,0xf857a4b1, "70684206568419061514", 20, 0x1f9a8c4}, ++ {__LINE__,0x54b8e14, "42015093765128581010", 20, 0x49c19218}, ++ {__LINE__,0xd6aa5616, "88214814356148806939", 20, 0xbbfc5a38}, ++ {__LINE__,0x11e63098, "43472694284527343838", 20, 0x93434b8}, ++ {__LINE__,0xbe92385, "49769333513942933689", 20, 0xfe1827af}, ++ {__LINE__,0x49511de0, "54979784887993251199", 20, 0xcba8221c}, ++ {__LINE__,0x3db13bc1, "58360544869206793220", 20, 0x14643fda}, ++ {__LINE__,0xbb899bea, "27347953487840714234", 20, 0x1604a006}, ++ {__LINE__,0xf6cd9436, "07650690295365319082", 20, 0xb69f984c}, ++ {__LINE__,0x9109e6c3, "42655507906821911703", 20, 0xc43eead4}, ++ {__LINE__,0x75770fc, "29977409200786225655", 20, 0x707751b}, ++ {__LINE__,0x69b1d19b, "85181542907229116674", 20, 0xf5bdd5b3}, ++ {__LINE__,0xc6132975, "87963594337989416799", 20, 0x2fed2db3}, ++ {__LINE__,0xd58cb00c, "21395988329504168551", 20, 0xc2a2b42a}, ++ {__LINE__,0xb63b8caa, "51991013580943379423", 20, 0xdf0590c0}, ++ {__LINE__,0x8a45a2b8, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x1980aaf8}, ++ {__LINE__,0xcbe95b78, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xf58662c8}, ++ {__LINE__,0x4ef8a54b, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x1f65ac54}, ++ {__LINE__,0x76ad267a, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x7b792e8e}, ++ {__LINE__,0x569e613c, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x1d61679c}, ++ {__LINE__,0x36aa61da, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x12ec687c}, ++ {__LINE__,0xf67222df, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x740329a9}, ++ {__LINE__,0x74b34fd3, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x374c5652}, ++ {__LINE__,0x351fd770, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xeadfde7e}, ++ {__LINE__,0xc45aef77, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x3fcbf664}, ++ {__LINE__,0xd034ea71, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x6b080911}, ++ {__LINE__,0xdeadc0de, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0x355fdf73}, ++ {__LINE__,0xba5eba11, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xb48bd8d8}, ++ {__LINE__,0x7712aa45, "qjdwq48mBukJVUzVVfMjiqSWL5GnFSPQQDi6mE9ZaAPh9drb5tXUULwqekEH6W7kAxNQRkdV5ynU" ++ "NWQYiW59RpDCxpuhCamrznzAdJ6uNerx7Q3vVhHSHSfKfeET9JfKwtxJ2y7BxXXpGbTg3kU6EZMtJ" ++ "qvnST6x5x4PzpMFVbdmfGnJmwzK8aqEDeb3hBVgy3PL58rzXbQgH7LcZB3C4ytukzhvCYpp8Hv5Xw" ++ "4LRVV4UC84TEaNZS7UuzfHpPJuYZhT6evzVFhuyHbkJMf36gyLEWtBBdd9uMZkFGfhqk5kfrM7cM7" ++ "ynu8bd7QfEmFKxWfB2F85qzy3RiUmXkhNJyBChux4fkJ56XTWh8J4mKpN3gCgAEeZxAP2E4tQ5XYj" ++ "6mbhGav6tv6CMGPuBCAVb29d2c5abXwVG6a7c8G6KUQmwPV5NxbvxENCANtvNBzXBRqUniAQdmaD7" ++ "Yf3J8YmwZbwrHqEjcuEiiSbnGPaFjcRDDGFviaiM7BewmLEF2Y447YCtyq72VGmmEeVumLpRXWzVK" ++ "EkpVrJdN3tiuSVw2wUQ3Fq4hqkB7RXBFQZbb4EKvTBwkVCxdKgNSukp9zwcyUMVE2YPFh9Tyhwb9P" ++ "wGcWWkjJQNBUG69UbvaN9NCGnxR69QChejPUhURi4TBW5wmJpe7r9tc9ZjprFCeUPxTAN76aiyewF" ++ "CXHYGCqqmAt7zuDSLUCf7etGVFucx5M7NiM6h2nHShKMdTzXdxx4qzdDa2XrprRmUUySHcaFeZaUP" ++ "9VJeqjYMxevK7MPN2b6fPhH4UXknfQM99aJNewyfFPpaFYaMLWiTMB3UvXvGp7afu4SyX9ggbBGci" ++ "MUnma7qf9nQ2VL6eTR249d6QBYq249GQEbY5u2TQGL5n4Y2yGFjc8MGLe3aNvAAWtRS2iDR8jdQ36" ++ "CVMewjUZwM4bm8JPQLPRcrbVC3N8K4dWDNUAA2JpbDdpjNCkAjBacuvLXUB4UXWeCbCudAvUzPtDe" ++ "5yYcxK47jeeDM5KBQ6dpTTRjMEEMrN687qxFSxEU4dB65WCemJe5jwVJwvd7vfKum8hWTeQjM8RYd" ++ "BR2rFj7dEqVkejP93XRpRbAv74AM2krE7X37k5cB7W5uJBQR2V7hQh9gGyccxMz7G2Jwvj59EbkzW" ++ "TCb4KRXTkVSG2jd6yE4PHKwamFZx9ji2dXua4aMz8ppzgtH5YLQcRFmEnGXdf7x8jgJzDSaShy5hY" ++ "NpwYWhENv8QDWZkferZD7RDT2HXzGXfvEzPvUHe4RWUxtt4wprzK9fghPrfvkhce58aLFJMGRaNqS" ++ "gWe7RKRABz6vSpwnexkErjfYx89zeT6EGv9fDANvyU7DM2E5WG6b9qgYFfkqQExYCRG6Rh4JdUDb9" ++ "b8rfVdgb2zZdmXvjYdwK8GrvjNychu5zgJHaZbzGCrPfyP6FPh79w7yR3nEhGD4mYEqkafaRBqtWE" ++ "TpH7kX2dX6WnHmwMiYMEF5RppycbqR9YtT7wuKMQznP7gx6R4xNvwM6jKv7aY4aM6nz3E2VN4iEfu" ++ "WJWe83QeaFPc3PkizdqmqMad8D3FMedEjzVedzHDJ8XgEiuc7AwSJ2Ae8rqCm99ag2yyPMe83Trm8" ++ "jvrpMZYga92dHBm946aZVuSHg3XhiN3BSEk9k29RAi3LXMBS4SFFFwudMT9KB7RUR8D8T5UtERxnx" ++ "hvkBNkEUTtpruZhtE4iPzfzqMpfAK2DtjfcYENMxkg7TU2cdVg2zLijYqbTAyvatN5tZ5nDayGnPx" ++ "VkM8tJZGg59RhPPJNXpGJp2yAvdGUz3VMyqUNMYpBZUhjqzqxw7dJQuFq3m9cQWd67bVM7Pjrk9hR" ++ "zmbiBuEL9kvhhW2KeMUQpAQYJGETULfqG4zKKyaUWKDPcNDVSY6TpRyyJaTJWQ9pFPXyk9zz4Gdaz" ++ "Xnh4JPWVDrUma8abXFJXL4SX5WpWhyxBfdCXw7rgVTHai4Nvcwn23AiAJ9Ncz7nn3nhniRibEhkUc" ++ "cU6fxqNyHMeJBUBrga8VaGVyuccvCHWygzQ24kSmfeGHvQ3PefSVPcUe3Pxdc7cfgDw2tqyg2QV4K" ++ "aQgBbLx9maK4ixgQM9WN2wpv2kBy9kAcfZDRASdvwffqtK3jxDGPnurvUkA2dRNTG4Bgkth7JkFAC" ++ "gWgJFzSQcvMbDeHQSjvGERkfiPEFN6ypbtMcQB7gwJ73dVEmz66PPdirJHDHJrbnvzWeugBuZ2mD5" ++ "hFXB2r6wuY4NXKavV3jBrrCcwRgS8VbF2NMcK8YEENKXKVBxnQpaqfktzYEPZynacBVaxbdXrd8PH" ++ "FvrV5gJw6ihddpJccYSqWmU5GbHNzEZKEyMcGidwZDNNwStgyaYbHeMNfYY7a9bMUkaVkCnakUHAM" ++ "ivktadi3Fd52ApUcJURhGdAYvqXcwrx4j34bFdaLNJ3Zg6WQRuPtMA3F6yKYG2tvupwbGSK5p4dEw" ++ "6gtV4b2nbZ33fmd2camjXUED66FwH97ZYdXCKigpFYn2bF4RuVkfdJiabXH7vKaQiWMjMiainFhrq" ++ "4wxm4qyF8wi4DBALBUuKvKnaQiekvQU5wQcrA6MwygnevK7Wu2yfQueryawVpfQzCuii9SPqLrCHS" ++ "3Ep8SmQSKrVbJRmwcnQNQ4MufXSfUZxU4jK4GzX7QjRhiGmqcVTxUaEbQqEiFK7KiRJ5YFVB7R8Mi" ++ "fjZwjbBupNYrSrfhEJTBPRDVKAZARjzfBiYLFGVYwRCPGm97C5eywNKNaQjaW32fGwnM6FuK8g8MG" ++ "re9Zzy2GUkG6mAD4nb8aqSmS65R5D5SBgXT8QVdAngy8ah7K9HDJFwG4wTJFfi8XeBJKH7VyX7E8S" ++ "AdbwS8YaJdjEVJTEUR57VMEvD3z5rkzvemA7P8jXEfQq8Dgy8jAeBccMzk2cqvvyQyhgpvMmmCGDk" ++ "8uTnQHGHfbJj5Xci77qbR8bbzffhYQ7uBXeijMqCTMvtJJwbFvJme2ue8LVGqAjm7mgm5irppUyF6" ++ "fbu6qLMEtVWCtepwanwyXh8eGCHqrXG9ch7k8MGbamYQw8JzaFr4WMjPqazUyu3bZfY57gNMhMa3C" ++ "K66fapifqkTizwfZcHLXg6mgrwYuK8Lp8PRARAbZVaxVcGAHtY6PTLWNzgzkdEvCtZMZK4w95DWfU" ++ "85u6b5B8gyCEQze9pNSPDDfxkZ4RvXVkpbntcFRex9CDJ26fZDwJRjj9bwNNpRfZzjFrQeFxftVVA" ++ "yJGWZHrD5MuHVLNUVXzj9rvedRcuVxrc6kLhqwUWQgGFCtEaDhx95PRZEM5f42tA6frXGXYB8GEnB" ++ "vxfMRfBzY32qzGtPC66rzJrcnd6hewDDhVLuib5KdSy9NpErDkBzuvdQpK5mJrbYZ7pMJFEqxfEKU" ++ "U4fa6g5aqDU8FyRaP55xz6VTPDmy7U5CA7Qhwr6xgQibKFpBXQhiErCzvxWQ6p6bMKVxukdRSkQpn" ++ "hdQYxnx5Kt5wA5pkFzWpjUyVxGmyLAXHGAaJ5EPqEU7p6A9ndGDgihtWbcE2PdyJMu4gPSXJvw3vD" ++ "qUiUTqEY52tbjP2jD9yiB5Y3XLwmVXzXrZdHLAHkRX5iLmq3paGPjghRPYUzM5RMAEQVcwr4MSkND" ++ "iRRxtqTiuNKRxZKagGy9cjJS93HTfFq6DWFKheppbqNkACmyuBJvqDejeb2wRtJNjFTA8LmXiTgjc" ++ "V4Vh2hRp29kccGDhztihtWRnYi8u6G9TP99JPYRhXKzhLWrCU2LTk2m6WLPTZztiH5GwtEvzkbHbb" ++ "WWubihCQnHNu5uKXrMWU3YkP2kxfxCwzzbG8yWejv2vrtqzpYdw6ZDJL9FzGU4a8H6Uaq7yQJvmDP" ++ "Sjqvtntgj3t8fKK7bWdFiNKaRVVVvmAQ2yjctfkj7XyjbUFwW396ASJpq2Z7Lpb7b5iprrhPMhjcy" ++ "euhBd99ufdgupwu9ScLUgAyVFV6DDXiVmuYPJvLTAFMQHZ6v8pALPzCVaChXjW8GzjdM4uxwHgVqK" ++ "zbg23DNyGXFTvTLyvL9gcCR8LA7YNtnR6bnm9ihtTFaVNJJ3JqpW7bTGrMka7DHvyTACUPuqLRY4q" ++ "hyfFJxK7NBv3aZMtUx89VEtjKruYYAuwY2yQzSnJB2tXxKzg6dni7ZNFQ6wNrbkdWXStcUm642ew6" ++ "xZaQA74hHzreJqjw4qciR4xnrjrPgE7tkbZrAbdgiGVDEULbJUq2SKmAULkQ4NpkGC6RZByBBjyxL" ++ "dhLG6xHzT5dY42mqQyH6cNumUviYZ74LKFbv2Yhx8aRwqxEaTymC2QUTDQvuM9D8r8bmpE7CT9BAG" ++ "kbGzZGLNkh3kJefdxF8WK7T6hHVChPuHevwzPKrDGXZBXfHQ4eDyWZ64KAeaFSNhxSWJcEPgjawTm" ++ "ZXEPYRM2R2XNFXYWxzpJgnD4ip6Nr9GkEhThUhxBQ9H7wUPQdG6qpjjvCaXJNGYwfHCxFkz39rh87" ++ "5ViVCRqxN22iWFU7THfzEanuQtUYGt3Amr6dfenezFuUN8mhpRNSH66VMStqPEiuyg8LQYYGeWWCG" ++ "ybytuPRP5mNKBZwftkx3LbqdwSGEhRF4qe56F2nqTRyfnYh2FuxMiihwGCZviCaXUCY8dhRxVnvGi" ++ "DaUpUaebFwPdXnKh9Hrbg2fmXkmq6n5bGHdR9DUcrZYWSZxptxy4kjFUtCieibpe4Czh335QPnGiA" ++ "8cQzBaV42B2zuu3iLwygKHky2Bbe5e4eU4znPzacEfuMGCgzj4E7RtDKctpgWHCHJQJcF54WK7jhA" ++ "TKztSffjCc8n7cTURQE7AWZzK5j2HkajggWw4TA9JUeSNPKdkLQGZeWiHujCz4E2v5Lu9Za9AbCMG" ++ "XBC2YZeUnE5YnyFhHp9jYFVwYr8QfCJ4TtzQNMe743yEMmbSchwaXEdEzth9kpAkKHxqKZBua93UU" ++ "u8EDvykWYXkrRDXnQVdeDgxEVYwkmKrHDt26NUg3tB9tuMDzYKzKrV5iepMdtw6affWkLigMVMYbx" ++ "e4hhYgwZmee6RWMxGyVn6egAgKaN7pauE46MtXhgbjp5xxBP3JM7jZPyeQZetj3tFVxmbbByJLL93" ++ "Ra5jSVte26mHwrwr6Q3xzmAdxtEHcZxcPjruUWk6gXgnfn7HMBtv6vxgMfe2wmydHSqcKUH2XhdpQ" ++ "7JXiXfazVAF28zvhChe4gzwzhqp6Bnm8hWU7zhT6Jf4ZnQWz2N4tg7u4X2CFLnJnmj3P3YeJRAHeR" ++ "Dz7uXYyDwJmGUPH5SdaFFYcMf33LvVBUCAdNHQh784rpGvMDH7eEriKQiBDMZpcRGucHaNkEf9R7x" ++ "635ux3hvp6qrjufWTqPnYLB6UwP2TWRg233eNVajbe4TuJuuFBDGHxxk5Ge34BmLSbitTpMDZAAir" ++ "Jp4HUAGydQ5URF8qaSHn5z9g3uRHmGmbpcLZYumiKAQRTXGtb8776wMNfRGrLmqn75kX8guK7YwKq" ++ "UeWAriZapqL5PuntyGxCNXqPrUvArrqefczM7N6azZatfp4vJYjhMDtkABpQAyxX7pS8mMyKBA527" ++ "byRKqAu3J", 5552, 0x7dc51be2}, ++}; ++ ++static const int test_size = sizeof(tests) / sizeof(tests[0]); ++ ++int main(void) ++{ ++ int i; ++ for (i = 0; i < test_size; i++) { ++ test_adler32(tests[i].adler, tests[i].buf, tests[i].len, ++ tests[i].expect, tests[i].line); ++ } ++ return 0; ++} +-- +2.34.3 + + +From f06e8c232a94d75f26c993cc879c914c066d3fd5 Mon Sep 17 00:00:00 2001 +From: Matheus Castanho +Date: Mon, 9 Mar 2020 16:30:11 -0300 +Subject: [PATCH 6/9] adler32_test: Fix warning when compiling with -Wall + +--- + test/adler32_test.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/test/adler32_test.c b/test/adler32_test.c +index 6cf3e2b..8042295 100644 +--- a/test/adler32_test.c ++++ b/test/adler32_test.c +@@ -17,7 +17,7 @@ int main OF((void)); + typedef struct { + int line; + uLong adler; +- Byte* buf; ++ char* buf; + int len; + uLong expect; + } adler32_test; +@@ -332,7 +332,7 @@ int main(void) + { + int i; + for (i = 0; i < test_size; i++) { +- test_adler32(tests[i].adler, tests[i].buf, tests[i].len, ++ test_adler32(tests[i].adler, (Byte*) tests[i].buf, tests[i].len, + tests[i].expect, tests[i].line); + } + return 0; +-- +2.34.3 + + +From 11b722e4ae91b611f605221587ec8e0829c27949 Mon Sep 17 00:00:00 2001 +From: Matheus Castanho +Date: Tue, 23 Jun 2020 10:26:19 -0300 +Subject: [PATCH 7/9] Fix invalid memory access on ppc and ppc64 + +--- + contrib/power/adler32_power8.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/contrib/power/adler32_power8.c b/contrib/power/adler32_power8.c +index 473c394..fdd0864 100644 +--- a/contrib/power/adler32_power8.c ++++ b/contrib/power/adler32_power8.c +@@ -110,16 +110,15 @@ uLong ZLIB_INTERNAL _adler32_power8 (uLong adler, const Bytef* buf, uInt len) + 6, 5, 4, 3, 2, 1}; + const vector unsigned char vsh = vec_splat_u8(4); + const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0}; +- vector unsigned int vs1 = vec_xl(0, &s1); +- vector unsigned int vs2 = vec_xl(0, &s2); ++ vector unsigned int vs1 = { 0 }; ++ vector unsigned int vs2 = { 0 }; + vector unsigned int vs1_save = { 0 }; + vector unsigned int vsum1, vsum2; + vector unsigned char vbuf; + int n; + +- /* Zeros the undefined values of vectors vs1, vs2. */ +- vs1 = vec_and(vs1, vmask); +- vs2 = vec_and(vs2, vmask); ++ vs1[0] = s1; ++ vs2[0] = s2; + + /* Do length bigger than NMAX in blocks of NMAX size. */ + while (len >= NMAX) { +-- +2.34.3 + + +From 4a8d89ae49aa17d1634a2816c8d159f533a07eae Mon Sep 17 00:00:00 2001 +From: Matheus Castanho +Date: Wed, 27 Nov 2019 10:18:10 -0300 +Subject: [PATCH 8/9] Add optimized slide_hash for Power + +Considerable time is spent on deflate.c:slide_hash() during +deflate. This commit introduces a new slide_hash function that +uses VSX vector instructions to slide 8 hash elements at a time, +instead of just one as the standard code does. + +The choice between the optimized and default versions is made only +on the first call to the function, enabling a fallback to standard +behavior if the host processor does not support VSX instructions, +so the same binary can be used for multiple Power processor +versions. + +Author: Matheus Castanho +--- + CMakeLists.txt | 3 +- + Makefile.in | 8 ++++ + configure | 4 +- + contrib/power/power.h | 3 ++ + contrib/power/slide_hash_power8.c | 63 +++++++++++++++++++++++++++++ + contrib/power/slide_hash_resolver.c | 15 +++++++ + deflate.c | 12 ++++++ + 7 files changed, 105 insertions(+), 3 deletions(-) + create mode 100644 contrib/power/slide_hash_power8.c + create mode 100644 contrib/power/slide_hash_resolver.c + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 44de486..8208c62 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -186,7 +186,8 @@ if(CMAKE_COMPILER_IS_GNUCC) + add_definitions(-DZ_POWER8) + set(ZLIB_POWER8 + contrib/power/adler32_power8.c +- contrib/power/crc32_z_power8.c) ++ contrib/power/crc32_z_power8.c ++ contrib/power/slide_hash_power8.c) + + set_source_files_properties( + ${ZLIB_POWER8} +diff --git a/Makefile.in b/Makefile.in +index 9ef9fa9..f71c6ea 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -183,6 +183,9 @@ crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c + deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + ++slide_hash_power8.o: $(SRCDIR)contrib/power/slide_hash_power8.c ++ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/slide_hash_power8.c ++ + infback.o: $(SRCDIR)infback.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c + +@@ -245,6 +248,11 @@ deflate.lo: $(SRCDIR)deflate.c + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + -@mv objs/deflate.o $@ + ++slide_hash_power8.lo: $(SRCDIR)contrib/power/slide_hash_power8.c ++ -@mkdir objs 2>/dev/null || test -d objs ++ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/slide_hash_power8.o $(SRCDIR)contrib/power/slide_hash_power8.c ++ -@mv objs/slide_hash_power8.o $@ ++ + infback.lo: $(SRCDIR)infback.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c +diff --git a/configure b/configure +index 810a740..d0dacf9 100755 +--- a/configure ++++ b/configure +@@ -879,8 +879,8 @@ if tryboth $CC -c $CFLAGS $test.c; then + + if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then + POWER8="-DZ_POWER8" +- PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo" +- OBJC="${OBJC} adler32_power8.o crc32_z_power8.o" ++ PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo slide_hash_power8.lo" ++ OBJC="${OBJC} adler32_power8.o crc32_z_power8.o slide_hash_power8.o" + echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log + else + echo "Checking for -mcpu=power8 support... No." | tee -a configure.log +diff --git a/contrib/power/power.h b/contrib/power/power.h +index f57c761..28c8f78 100644 +--- a/contrib/power/power.h ++++ b/contrib/power/power.h +@@ -4,7 +4,10 @@ + */ + #include "../../zconf.h" + #include "../../zutil.h" ++#include "../../deflate.h" + + uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); + + unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); ++ ++void _slide_hash_power8(deflate_state *s); +diff --git a/contrib/power/slide_hash_power8.c b/contrib/power/slide_hash_power8.c +new file mode 100644 +index 0000000..c5a0eb5 +--- /dev/null ++++ b/contrib/power/slide_hash_power8.c +@@ -0,0 +1,63 @@ ++ /* Copyright (C) 2019 Matheus Castanho , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include ++#include "../../deflate.h" ++ ++local inline void slide_hash_power8_loop OF((deflate_state *s, ++ unsigned n_elems, Posf *table_end)) __attribute__((always_inline)); ++ ++local void slide_hash_power8_loop( ++ deflate_state *s, ++ unsigned n_elems, ++ Posf *table_end) ++{ ++ vector unsigned short vw, vm, *vp; ++ unsigned chunks; ++ ++ /* Each vector register (chunk) corresponds to 128 bits == 8 Posf, ++ * so instead of processing each of the n_elems in the hash table ++ * individually, we can do it in chunks of 8 with vector instructions. ++ * ++ * This function is only called from slide_hash_power8(), and both calls ++ * pass n_elems as a power of 2 higher than 2^7, as defined by ++ * deflateInit2_(), so n_elems will always be a multiple of 8. */ ++ chunks = n_elems >> 3; ++ Assert(n_elems % 8 == 0, "Weird hash table size!"); ++ ++ /* This type casting is safe since s->w_size is always <= 64KB ++ * as defined by deflateInit2_() and Posf == unsigned short */ ++ vw[0] = (Posf) s->w_size; ++ vw = vec_splat(vw,0); ++ ++ vp = (vector unsigned short *) table_end; ++ ++ do { ++ /* Processing 8 elements at a time */ ++ vp--; ++ vm = *vp; ++ ++ /* This is equivalent to: m >= w_size ? m - w_size : 0 ++ * Since we are using a saturated unsigned subtraction, any ++ * values that are > w_size will be set to 0, while the others ++ * will be subtracted by w_size. */ ++ *vp = vec_subs(vm,vw); ++ } while (--chunks); ++}; ++ ++void ZLIB_INTERNAL _slide_hash_power8(deflate_state *s) ++{ ++ unsigned n; ++ Posf *p; ++ ++ n = s->hash_size; ++ p = &s->head[n]; ++ slide_hash_power8_loop(s,n,p); ++ ++#ifndef FASTEST ++ n = s->w_size; ++ p = &s->prev[n]; ++ slide_hash_power8_loop(s,n,p); ++#endif ++} +diff --git a/contrib/power/slide_hash_resolver.c b/contrib/power/slide_hash_resolver.c +new file mode 100644 +index 0000000..54fa1eb +--- /dev/null ++++ b/contrib/power/slide_hash_resolver.c +@@ -0,0 +1,15 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "../gcc/zifunc.h" ++#include "power.h" ++ ++Z_IFUNC(slide_hash) { ++#ifdef Z_POWER8 ++ if (__builtin_cpu_supports("arch_2_07")) ++ return _slide_hash_power8; ++#endif ++ ++ return slide_hash_default; ++} +diff --git a/deflate.c b/deflate.c +index 799fb93..b2db576 100644 +--- a/deflate.c ++++ b/deflate.c +@@ -196,6 +196,13 @@ local const config configuration_table[10] = { + (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ + } while (0) + ++#ifdef Z_POWER_OPT ++/* Rename function so resolver can use its symbol. The default version will be ++ * returned by the resolver if the host has no support for an optimized version. ++ */ ++#define slide_hash slide_hash_default ++#endif /* Z_POWER_OPT */ ++ + /* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to +@@ -227,6 +234,11 @@ local void slide_hash(s) + #endif + } + ++#ifdef Z_POWER_OPT ++#undef slide_hash ++#include "contrib/power/slide_hash_resolver.c" ++#endif /* Z_POWER_OPT */ ++ + /* ========================================================================= */ + int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; +-- +2.34.3 + + +From aecdff0646c7e188b48f6db285d8d63a74f246c1 Mon Sep 17 00:00:00 2001 +From: Matheus Castanho +Date: Tue, 29 Oct 2019 18:04:11 -0300 +Subject: [PATCH 9/9] Add vectorized longest_match for Power + +This commit introduces an optimized version of the longest_match +function for Power processors. It uses VSX instructions to match +16 bytes at a time on each comparison, instead of one by one. + +Author: Matheus Castanho +--- + CMakeLists.txt | 3 +- + Makefile.in | 8 + + configure | 4 +- + contrib/power/longest_match_power9.c | 194 +++++++++++++++++++++++++ + contrib/power/longest_match_resolver.c | 15 ++ + contrib/power/power.h | 2 + + deflate.c | 13 ++ + 7 files changed, 236 insertions(+), 3 deletions(-) + create mode 100644 contrib/power/longest_match_power9.c + create mode 100644 contrib/power/longest_match_resolver.c + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8208c62..017f88a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -199,7 +199,8 @@ if(CMAKE_COMPILER_IS_GNUCC) + + if(POWER9) + add_definitions(-DZ_POWER9) +- set(ZLIB_POWER9 ) ++ set(ZLIB_POWER9 ++ contrib/power/longest_match_power9.c) + + set_source_files_properties( + ${ZLIB_POWER9} +diff --git a/Makefile.in b/Makefile.in +index f71c6ea..be0a2bc 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -183,6 +183,9 @@ crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c + deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + ++longest_match_power9.o: $(SRCDIR)contrib/power/longest_match_power9.c ++ $(CC) $(CFLAGS) -mcpu=power9 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/longest_match_power9.c ++ + slide_hash_power8.o: $(SRCDIR)contrib/power/slide_hash_power8.c + $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/slide_hash_power8.c + +@@ -248,6 +251,11 @@ deflate.lo: $(SRCDIR)deflate.c + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + -@mv objs/deflate.o $@ + ++longest_match_power9.lo: $(SRCDIR)contrib/power/longest_match_power9.c ++ -@mkdir objs 2>/dev/null || test -d objs ++ $(CC) $(SFLAGS) -mcpu=power9 $(ZINC) -DPIC -c -o objs/longest_match_power9.o $(SRCDIR)contrib/power/longest_match_power9.c ++ -@mv objs/longest_match_power9.o $@ ++ + slide_hash_power8.lo: $(SRCDIR)contrib/power/slide_hash_power8.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/slide_hash_power8.o $(SRCDIR)contrib/power/slide_hash_power8.c +diff --git a/configure b/configure +index d0dacf9..b723b64 100755 +--- a/configure ++++ b/configure +@@ -888,8 +888,8 @@ if tryboth $CC -c $CFLAGS $test.c; then + + if tryboth $CC -c $CFLAGS -mcpu=power9 $test.c; then + POWER9="-DZ_POWER9" +- PIC_OBJC="${PIC_OBJC}" +- OBJC="${OBJC}" ++ PIC_OBJC="$PIC_OBJC longest_match_power9.lo" ++ OBJC="$OBJC longest_match_power9.o" + echo "Checking for -mcpu=power9 support... Yes." | tee -a configure.log + else + echo "Checking for -mcpu=power9 support... No." | tee -a configure.log +diff --git a/contrib/power/longest_match_power9.c b/contrib/power/longest_match_power9.c +new file mode 100644 +index 0000000..5177873 +--- /dev/null ++++ b/contrib/power/longest_match_power9.c +@@ -0,0 +1,194 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include ++#include "../../deflate.h" ++ ++local inline int vec_match OF((Bytef* scan, Bytef* match)) ++ __attribute__((always_inline)); ++ ++local inline int vec_match(Bytef* scan, Bytef* match) ++{ ++ vector unsigned char vscan, vmatch, vc; ++ int len; ++ ++ vscan = *((vector unsigned char *) scan); ++ vmatch = *((vector unsigned char *) match); ++ ++ /* Compare 16 bytes at a time. ++ * Each byte of vc will be either all ones or all zeroes, ++ * depending on the result of the comparison ++ */ ++ vc = (vector unsigned char) vec_cmpne(vscan,vmatch); ++ ++ /* Since the index of matching bytes will contain only zeroes ++ * on vc (since we used cmpne), counting the number of consecutive ++ * bytes where LSB == 0 is the same as counting the length of the match. ++ * ++ * There was an issue in the way the vec_cnttz_lsbb builtin was implemented ++ * that got fixed on GCC 12, but now we have to use different builtins ++ * depending on the compiler version. To avoid that, let's use inline asm to ++ * generate the exact instruction we need. ++ */ ++ #ifdef __LITTLE_ENDIAN__ ++ asm volatile("vctzlsbb %0, %1\n\t" : "=r" (len) : "v" (vc)); ++ #else ++ asm volatile("vclzlsbb %0, %1\n\t" : "=r" (len) : "v" (vc)); ++ #endif ++ ++ return len; ++} ++ ++uInt ZLIB_INTERNAL _longest_match_power9(deflate_state *s, IPos cur_match) ++{ ++ unsigned chain_length = s->max_chain_length;/* max hash chain length */ ++ register Bytef *scan = s->window + s->strstart; /* current string */ ++ register Bytef *match; /* matched string */ ++ register int len; /* length of current match */ ++ int best_len = (int)s->prev_length; /* best match length so far */ ++ int nice_match = s->nice_match; /* stop if match long enough */ ++ int mbytes; /* matched bytes inside loop */ ++ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? ++ s->strstart - (IPos)MAX_DIST(s) : 0; ++ /* Stop when cur_match becomes <= limit. To simplify the code, ++ * we prevent matches with the string of window index 0. ++ */ ++ Posf *prev = s->prev; ++ uInt wmask = s->w_mask; ++ ++#if (MAX_MATCH == 258) ++ /* Compare the last two bytes at once. */ ++ register Bytef *strend2 = s->window + s->strstart + MAX_MATCH - 2; ++ register ush scan_end = *(ushf*)(scan+best_len-1); ++#else ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH; ++ register Byte scan_end1 = scan[best_len-1]; ++ register Byte scan_end = scan[best_len]; ++#endif ++ ++ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. ++ * It is easy to get rid of this optimization if necessary. ++ */ ++ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); ++ ++ /* Do not waste too much time if we already have a good match: */ ++ if (s->prev_length >= s->good_match) { ++ chain_length >>= 2; ++ } ++ /* Do not look for matches beyond the end of the input. This is necessary ++ * to make deflate deterministic. ++ */ ++ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; ++ ++ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); ++ ++ do { ++ Assert(cur_match < s->strstart, "no future"); ++ match = s->window + cur_match; ++ ++ /* Skip to next match if the match length cannot increase ++ * or if the match length is less than 2. Note that the checks below ++ * for insufficient lookahead only occur occasionally for performance ++ * reasons. Therefore uninitialized memory will be accessed, and ++ * conditional jumps will be made that depend on those values. ++ * However the length of the match is limited to the lookahead, so ++ * the output of deflate is not affected by the uninitialized values. ++ */ ++ ++/* MAX_MATCH - 2 should be a multiple of 16 for this optimization to work. */ ++#if (MAX_MATCH == 258) ++ ++ /* Compare ending (2 bytes) and beginning of potential match. ++ * ++ * On Power processors, loading a 16-byte vector takes only 1 extra ++ * cycle compared to a regular byte load. So instead of comparing the ++ * first two bytes and then the rest later if they match, we can compare ++ * the first 16 at once, and when we have a match longer than 2, we will ++ * already have the result of comparing the first 16 bytes saved in mbytes. ++ */ ++ if (*(ushf*)(match+best_len-1) != scan_end || ++ (mbytes = vec_match(scan,match)) < 3) continue; ++ ++ scan += mbytes; ++ match += mbytes; ++ ++ /* In case when we may have a match longer than 16, we perform further ++ * comparisons in chunks of 16 and keep going while all bytes match. ++ */ ++ while(mbytes == 16) { ++ mbytes = vec_match(scan,match); ++ scan += mbytes; ++ match += mbytes; ++ ++ /* We also have to limit the maximum match based on MAX_MATCH. ++ * Since we are comparing 16 bytes at a time and MAX_MATCH == 258 (to ++ * comply with default implementation), we should stop comparing when ++ * we have matched 256 bytes, which happens when scan == strend2. ++ * In this ("rare") case, we have to check the remaining 2 bytes ++ * individually using common load and compare operations. ++ */ ++ if(scan >= strend2) { ++ if(*scan == *match) { ++ if(*++scan == *++match) ++ scan++; ++ } ++ break; ++ } ++ } ++ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ ++ len = (MAX_MATCH - 2) - (int)(strend2 - scan); ++ scan = strend2 - (MAX_MATCH - 2); ++ ++#else /* MAX_MATCH == 258 */ ++ ++ if (match[best_len] != scan_end || ++ match[best_len-1] != scan_end1 || ++ *match != *scan || ++ *++match != scan[1]) continue; ++ ++ /* The check at best_len-1 can be removed because it will be made ++ * again later. (This heuristic is not always a win.) ++ * It is not necessary to compare scan[2] and match[2] since they ++ * are always equal when the other bytes match, given that ++ * the hash keys are equal and that HASH_BITS >= 8. ++ */ ++ scan += 2, match++; ++ Assert(*scan == *match, "match[2]?"); ++ ++ /* We check for insufficient lookahead only every 8th comparison; ++ * the 256th check will be made at strstart+258. ++ */ ++ do { ++ } while (*++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ scan < strend); ++ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ ++ len = MAX_MATCH - (int)(strend - scan); ++ scan = strend - MAX_MATCH; ++ ++#endif /* MAX_MATCH == 258 */ ++ ++ if (len > best_len) { ++ s->match_start = cur_match; ++ best_len = len; ++ if (len >= nice_match) break; ++#if (MAX_MATCH == 258) ++ scan_end = *(ushf*)(scan+best_len-1); ++#else ++ scan_end1 = scan[best_len-1]; ++ scan_end = scan[best_len]; ++#endif ++ } ++ } while ((cur_match = prev[cur_match & wmask]) > limit ++ && --chain_length != 0); ++ ++ if ((uInt)best_len <= s->lookahead) return (uInt)best_len; ++ return s->lookahead; ++} +diff --git a/contrib/power/longest_match_resolver.c b/contrib/power/longest_match_resolver.c +new file mode 100644 +index 0000000..e81f28a +--- /dev/null ++++ b/contrib/power/longest_match_resolver.c +@@ -0,0 +1,15 @@ ++/* Copyright (C) 2019 Matheus Castanho , IBM ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "../gcc/zifunc.h" ++#include "power.h" ++ ++Z_IFUNC(longest_match) { ++#ifdef Z_POWER9 ++ if (__builtin_cpu_supports("arch_3_00")) ++ return _longest_match_power9; ++#endif ++ ++ return longest_match_default; ++} +diff --git a/contrib/power/power.h b/contrib/power/power.h +index 28c8f78..62ca81b 100644 +--- a/contrib/power/power.h ++++ b/contrib/power/power.h +@@ -10,4 +10,6 @@ uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); + + unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); + ++uInt _longest_match_power9(deflate_state *s, IPos cur_match); ++ + void _slide_hash_power8(deflate_state *s); +diff --git a/deflate.c b/deflate.c +index b2db576..d7b30b5 100644 +--- a/deflate.c ++++ b/deflate.c +@@ -1285,6 +1285,14 @@ local void lm_init (s) + /* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ ++ ++#ifdef Z_POWER_OPT ++/* Rename function so resolver can use its symbol. The default version will be ++ * returned by the resolver if the host has no support for an optimized version. ++ */ ++#define longest_match longest_match_default ++#endif /* Z_POWER_OPT */ ++ + local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +@@ -1429,6 +1437,11 @@ local uInt longest_match(s, cur_match) + } + #endif /* ASMV */ + ++#ifdef Z_POWER_OPT ++#undef longest_match ++#include "contrib/power/longest_match_resolver.c" ++#endif /* Z_POWER_OPT */ ++ + #else /* FASTEST */ + + /* --------------------------------------------------------------------------- +-- +2.34.3 + From 4e76ca623c10b7ae2aaaecf96afbc3411a3234ac Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:36:03 +0000 Subject: [PATCH 07/28] [4/6] Fix configure file Source: https://github.com/madler/zlib/pull/607 --- zlib-1.2.12-fix-configure.patch | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 zlib-1.2.12-fix-configure.patch diff --git a/zlib-1.2.12-fix-configure.patch b/zlib-1.2.12-fix-configure.patch new file mode 100644 index 0000000..d1b72cf --- /dev/null +++ b/zlib-1.2.12-fix-configure.patch @@ -0,0 +1,46 @@ +From a6cd9e1230acdb535bd57bbc350020da3d24eaf3 Mon Sep 17 00:00:00 2001 +From: Sam James +Date: Mon, 28 Mar 2022 08:40:45 +0100 +Subject: [PATCH] Fix CC logic in configure + +In https://github.com/madler/zlib/commit/e9a52aa129efe3834383e415580716a7c4027f8d, +the logic was changed to try check harder for GCC, but it dropped +the default setting of cc=${CC}. It was throwing away any pre-set CC value as +a result. + +The rest of the script then cascades down a bad path because it's convinced +it's not GCC or a GCC-like compiler. + +This led to e.g. misdetection of inability to build shared libs +for say, multilib cases (w/ CC being one thing from the environment being used +for one test (e.g. x86_64-unknown-linux-gnu-gcc -m32 and then 'cc' used for +shared libs (but missing "-m32"!)). Obviously just one example of how +the old logic could break. + +This restores the old default of 'CC' if nothing overrides it later +in configure. + +Bug: https://bugs.gentoo.org/836308 +Signed-off-by: Sam James +--- + configure | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/configure b/configure +index a21be36..cdf0e5b 100755 +--- a/configure ++++ b/configure +@@ -185,7 +185,10 @@ if test -z "$CC"; then + else + cc=${CROSS_PREFIX}cc + fi ++else ++ cc=${CC} + fi ++ + cflags=${CFLAGS-"-O3"} + # to force the asm version use: CFLAGS="-O3 -DASMV" ./configure + case "$cc" in +-- +2.34.3 + From 37728e12c3f24934f0c1071fc52caa64b8fa21ae Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:38:58 +0000 Subject: [PATCH 08/28] [5/6] Rebase patches on new 1.2.12 release --- zlib-1.2.11-covscan-issues-rhel9.patch | 35 ---- zlib-1.2.11-covscan-issues.patch | 41 +---- zlib-1.2.11-optimized-s390.patch | 8 +- ...=> zlib-1.2.12-s390x-vectorize-crc32.patch | 171 +++++++++++------- 4 files changed, 116 insertions(+), 139 deletions(-) rename zlib-1.2.11-s390x-vectorize-crc32.patch => zlib-1.2.12-s390x-vectorize-crc32.patch (76%) diff --git a/zlib-1.2.11-covscan-issues-rhel9.patch b/zlib-1.2.11-covscan-issues-rhel9.patch index d692589..2763cbc 100644 --- a/zlib-1.2.11-covscan-issues-rhel9.patch +++ b/zlib-1.2.11-covscan-issues-rhel9.patch @@ -28,38 +28,3 @@ index 96891c2..1197928 100644 } return err; } -diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c -index 44e88a9..a753c17 100644 ---- a/contrib/minizip/zip.c -+++ b/contrib/minizip/zip.c -@@ -526,8 +526,8 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f - break; - } - -- if (uPosFound!=0) -- break; -+ if (uPosFound!=0) -+ break; - } - TRYFREE(buf); - return uPosFound; -diff --git a/deflate.c b/deflate.c -index 085abbe..3963e79 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -203,9 +203,10 @@ local const config configuration_table[10] = { - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ --#define CLEAR_HASH(s) \ -+#define CLEAR_HASH(s) do { \ - s->head[s->hash_size-1] = NIL; \ -- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); -+ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ -+} while (0) - - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 --- -2.26.0 - diff --git a/zlib-1.2.11-covscan-issues.patch b/zlib-1.2.11-covscan-issues.patch index 28e8604..b816a5a 100644 --- a/zlib-1.2.11-covscan-issues.patch +++ b/zlib-1.2.11-covscan-issues.patch @@ -4,24 +4,10 @@ Date: Tue, 15 Oct 2019 11:27:15 +0200 Subject: [PATCH] fixed covscan issues --- - crc32.c | 2 +- deflate.c | 2 +- test/crc32_test.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) -diff --git a/crc32.c b/crc32.c -index 406d350..34132ea 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -302,7 +302,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - - if (!crc32_func) - crc32_func = crc32_z_ifunc(); -- return (*crc32_func)(crc, buf, len); -+ return (*crc32_func)(crc, buf, len); - } - - #endif /* defined(Z_IFUNC_ASM) || defined(Z_IFUNC_NATIVE) */ diff --git a/deflate.c b/deflate.c index 089285a..9b09718 100644 --- a/deflate.c @@ -35,27 +21,20 @@ index 089285a..9b09718 100644 bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : s->level == 0 ? deflate_stored(s, flush) : -diff --git a/test/crc32_test.c b/test/crc32_test.c -index 5d73128..2d2a6c7 100644 ---- a/test/crc32_test.c -+++ b/test/crc32_test.c -@@ -11,25 +11,25 @@ +diff -rup zlib-1.2.12/test/crc32_test.c.old zlib-1.2.12/test/crc32_test.c +--- zlib-1.2.12/test/crc32_test.c.old 2022-06-23 11:20:52.393574517 +0000 ++++ zlib-1.2.12/test/crc32_test.c 2022-06-23 11:21:50.195574517 +0000 +@@ -11,7 +11,7 @@ # include #endif - + -void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); +void test_crc32 OF((uLong crc, char* buf, z_size_t len, uLong chk, int line)); int main OF((void)); - + typedef struct { - int line; - uLong crc; -- Byte* buf; -+ char* buf; - int len; - uLong expect; - } crc32_test; - +@@ -24,12 +24,12 @@ typedef struct { + void test_crc32(crc, buf, len, chk, line) uLong crc; - Byte *buf; @@ -66,9 +45,7 @@ index 5d73128..2d2a6c7 100644 { - uLong res = crc32(crc, buf, len); + uLong res = crc32(crc, (Bytef *) buf, len); - if (res != chk) { + if (res != chk) { fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", line, (unsigned int)res, (unsigned int)chk); --- -2.19.1 diff --git a/zlib-1.2.11-optimized-s390.patch b/zlib-1.2.11-optimized-s390.patch index 50a5151..3999592 100644 --- a/zlib-1.2.11-optimized-s390.patch +++ b/zlib-1.2.11-optimized-s390.patch @@ -2,10 +2,10 @@ diff --git a/deflate.c b/deflate.c index 1ec7614..b724c8d 100644 --- a/deflate.c +++ b/deflate.c -@@ -1233,15 +1233,16 @@ local void lm_init (s) - /* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ +@@ -1322,15 +1322,16 @@ local void lm_init (s) + #define longest_match longest_match_default + #endif /* Z_POWER_OPT */ + -local uInt longest_match(s, cur_match) +local uInt longest_match(s, pcur_match) deflate_state *s; diff --git a/zlib-1.2.11-s390x-vectorize-crc32.patch b/zlib-1.2.12-s390x-vectorize-crc32.patch similarity index 76% rename from zlib-1.2.11-s390x-vectorize-crc32.patch rename to zlib-1.2.12-s390x-vectorize-crc32.patch index 71af7ad..d354940 100644 --- a/zlib-1.2.11-s390x-vectorize-crc32.patch +++ b/zlib-1.2.12-s390x-vectorize-crc32.patch @@ -1,4 +1,4 @@ -From 2dfdc5b7d6943c0ac60eef63e361e2a50f9da610 Mon Sep 17 00:00:00 2001 +From 957bc67cfb4e01403c01fe6243850383183a7c19 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Thu, 19 Mar 2020 11:52:03 +0100 Subject: [PATCH] s390x: vectorize crc32 @@ -8,15 +8,18 @@ about them. At runtime, check whether kernel supports vector extensions (it has to be not just the CPU, but also the kernel) and choose between the regular and the vectorized implementations. --- - Makefile.in | 9 ++ - configure | 28 ++++++ - contrib/s390/crc32-vx.c | 195 ++++++++++++++++++++++++++++++++++++++++ - crc32.c | 55 +++++++++++- - 4 files changed, 285 insertions(+), 2 deletions(-) + Makefile.in | 9 ++ + configure | 28 +++++ + contrib/gcc/zifunc.h | 21 +++- + contrib/s390/crc32-vx.c | 195 ++++++++++++++++++++++++++++++++ + contrib/s390/crc32_z_resolver.c | 41 +++++++ + crc32.c | 11 +- + 6 files changed, 301 insertions(+), 4 deletions(-) create mode 100644 contrib/s390/crc32-vx.c + create mode 100644 contrib/s390/crc32_z_resolver.c diff --git a/Makefile.in b/Makefile.in -index 6070dcc..9e9743b 100644 +index 2e78f38..04c2f5d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -29,6 +29,7 @@ LDFLAGS= @@ -27,9 +30,9 @@ index 6070dcc..9e9743b 100644 STATICLIB=libz.a SHAREDLIB=libz.so -@@ -179,6 +180,9 @@ crc32_power8.o: $(SRCDIR)contrib/power8-crc/vec_crc32.c - crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c +@@ -179,6 +180,9 @@ crc32.o: $(SRCDIR)crc32.c + crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c + $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c +crc32-vx.o: $(SRCDIR)contrib/s390/crc32-vx.c + $(CC) $(CFLAGS) $(VGFMAFLAG) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/crc32-vx.c @@ -37,7 +40,7 @@ index 6070dcc..9e9743b 100644 deflate.o: $(SRCDIR)deflate.c $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c -@@ -234,6 +238,11 @@ crc32.lo: $(SRCDIR)crc32.c +@@ -229,6 +233,11 @@ crc32.lo: $(SRCDIR)crc32.c $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -@mv objs/crc32.o $@ @@ -46,15 +49,15 @@ index 6070dcc..9e9743b 100644 + $(CC) $(SFLAGS) $(VGFMAFLAG) $(ZINC) -DPIC -c -o objs/crc32-vx.o $(SRCDIR)contrib/s390/crc32-vx.c + -@mv objs/crc32-vx.o $@ + - deflate.lo: $(SRCDIR)deflate.c + crc32_z_power8.lo: $(SRCDIR)contrib/power/crc32_z_power8.c -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c diff --git a/configure b/configure -index 70ed86b..7941f75 100755 +index dd01b5c..acf94a5 100755 --- a/configure +++ b/configure -@@ -923,6 +923,32 @@ EOF - fi +@@ -927,6 +927,32 @@ else + echo "Checking for sys/sdt.h ... No." | tee -a configure.log fi +# check if we are compiling for s390 and binutils support vector extensions @@ -86,7 +89,7 @@ index 70ed86b..7941f75 100755 # show the results in the log echo >> configure.log echo ALL = $ALL >> configure.log -@@ -955,6 +981,7 @@ echo mandir = $mandir >> configure.log +@@ -960,6 +986,7 @@ echo mandir = $mandir >> configure.log echo prefix = $prefix >> configure.log echo sharedlibdir = $sharedlibdir >> configure.log echo uname = $uname >> configure.log @@ -94,7 +97,7 @@ index 70ed86b..7941f75 100755 # udpate Makefile with the configure results sed < ${SRCDIR}Makefile.in " -@@ -964,6 +991,7 @@ sed < ${SRCDIR}Makefile.in " +@@ -969,6 +996,7 @@ sed < ${SRCDIR}Makefile.in " /^LDFLAGS *=/s#=.*#=$LDFLAGS# /^LDSHARED *=/s#=.*#=$LDSHARED# /^CPP *=/s#=.*#=$CPP# @@ -102,6 +105,40 @@ index 70ed86b..7941f75 100755 /^STATICLIB *=/s#=.*#=$STATICLIB# /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +diff --git a/contrib/gcc/zifunc.h b/contrib/gcc/zifunc.h +index daf4fe4..b62379e 100644 +--- a/contrib/gcc/zifunc.h ++++ b/contrib/gcc/zifunc.h +@@ -8,9 +8,28 @@ + + /* Helpers for arch optimizations */ + ++#if defined(__clang__) ++#if __has_feature(coverage_sanitizer) ++#define Z_IFUNC_NO_SANCOV __attribute__((no_sanitize("coverage"))) ++#else /* __has_feature(coverage_sanitizer) */ ++#define Z_IFUNC_NO_SANCOV ++#endif /* __has_feature(coverage_sanitizer) */ ++#else /* __clang__ */ ++#define Z_IFUNC_NO_SANCOV ++#endif /* __clang__ */ ++ ++#ifdef __s390__ ++#define Z_IFUNC_PARAMS unsigned long hwcap ++#define Z_IFUNC_ATTRS Z_IFUNC_NO_SANCOV ++#else /* __s390__ */ ++#define Z_IFUNC_PARAMS void ++#define Z_IFUNC_ATTRS ++#endif /* __s390__ */ ++ + #define Z_IFUNC(fname) \ + typeof(fname) fname __attribute__ ((ifunc (#fname "_resolver"))); \ +- local typeof(fname) *fname##_resolver(void) ++ Z_IFUNC_ATTRS \ ++ local typeof(fname) *fname##_resolver(Z_IFUNC_PARAMS) + /* This is a helper macro to declare a resolver for an indirect function + * (ifunc). Let's say you have function + * diff --git a/contrib/s390/crc32-vx.c b/contrib/s390/crc32-vx.c new file mode 100644 index 0000000..fa5387c @@ -303,16 +340,14 @@ index 0000000..fa5387c + + return ((uv4si)v2)[2]; +} -diff --git a/crc32.c b/crc32.c -index 34132ea..dfa33ef 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -252,12 +252,54 @@ unsigned long crc32_vpmsum(unsigned long, const unsigned char FAR *, z_size_t); - #endif - #endif - -+#ifdef HAVE_S390X_VX +diff --git a/contrib/s390/crc32_z_resolver.c b/contrib/s390/crc32_z_resolver.c +new file mode 100644 +index 0000000..9749cab +--- /dev/null ++++ b/contrib/s390/crc32_z_resolver.c +@@ -0,0 +1,41 @@ +#include ++#include "../gcc/zifunc.h" + +#define VX_MIN_LEN 64 +#define VX_ALIGNMENT 16L @@ -322,17 +357,17 @@ index 34132ea..dfa33ef 100644 + +local unsigned long s390_crc32_vx(unsigned long crc, const unsigned char FAR *buf, z_size_t len) +{ -+ uint64_t prealign, aligned, remaining; ++ uintptr_t prealign, aligned, remaining; + + if (buf == Z_NULL) return 0UL; + + if (len < VX_MIN_LEN + VX_ALIGN_MASK) -+ return crc32_big(crc, buf, len); ++ return crc32_z_default(crc, buf, len); + + if ((uintptr_t)buf & VX_ALIGN_MASK) { + prealign = VX_ALIGNMENT - ((uintptr_t)buf & VX_ALIGN_MASK); + len -= prealign; -+ crc = crc32_big(crc, buf, prealign); ++ crc = crc32_z_default(crc, buf, prealign); + buf += prealign; + } + aligned = len & ~VX_ALIGN_MASK; @@ -341,53 +376,53 @@ index 34132ea..dfa33ef 100644 + crc = crc32_le_vgfm_16(crc ^ 0xffffffff, buf, (size_t)aligned) ^ 0xffffffff; + + if (remaining) -+ crc = crc32_big(crc, buf + aligned, remaining); ++ crc = crc32_z_default(crc, buf + aligned, remaining); + + return crc; +} -+#endif + - /* due to a quirk of gnu_indirect_function - "local" (aka static) is applied to - * crc32_z which is not desired. crc32_z_ifunc is implictly "local" */ - #ifndef Z_IFUNC_ASM - local - #endif --unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, z_size_t) -+unsigned long (*(crc32_z_ifunc( -+#ifdef __s390__ -+unsigned long hwcap -+#else -+void -+#endif -+)))(unsigned long, const unsigned char FAR *, z_size_t) - { - #if _ARCH_PWR8==1 - #if defined(__BUILTIN_CPU_SUPPORTS__) -@@ -269,6 +311,11 @@ unsigned long (*(crc32_z_ifunc(void)))(unsigned long, const unsigned char FAR *, - #endif - #endif /* _ARCH_PWR8 */ - -+#ifdef HAVE_S390X_VX ++Z_IFUNC(crc32_z) ++{ + if (hwcap & HWCAP_S390_VX) + return s390_crc32_vx; -+#endif -+ - /* return a function pointer for optimized arches here */ ++ return crc32_z_default; ++} +diff --git a/crc32.c b/crc32.c +index ae7b7e7..c212261 100644 +--- a/crc32.c ++++ b/crc32.c +@@ -736,12 +736,12 @@ local z_word_t crc_word_big(data) + #endif - #ifdef DYNAMIC_CRC_TABLE -@@ -301,7 +348,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - static unsigned long ZEXPORT (*crc32_func)(unsigned long, const unsigned char FAR *, z_size_t) = NULL; + /* ========================================================================= */ +-#ifdef Z_POWER_OPT ++#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) + /* Rename function so resolver can use its symbol. The default version will be + * returned by the resolver if the host has no support for an optimized version. + */ + #define crc32_z crc32_z_default +-#endif /* Z_POWER_OPT */ ++#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ - if (!crc32_func) -- crc32_func = crc32_z_ifunc(); -+ crc32_func = crc32_z_ifunc( -+#ifdef __s390__ -+ getauxval(AT_HWCAP) -+#endif -+ ); - return (*crc32_func)(crc, buf, len); + unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; +@@ -1064,10 +1064,15 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + return crc ^ 0xffffffff; } +-#ifdef Z_POWER_OPT ++#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) + #undef crc32_z ++#ifdef Z_POWER_OPT + #include "contrib/power/crc32_z_resolver.c" + #endif /* Z_POWER_OPT */ ++#ifdef HAVE_S390X_VX ++#include "contrib/s390/crc32_z_resolver.c" ++#endif /* HAVE_S390X_VX */ ++#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ + + #endif + -- -2.25.1 +2.35.1 From 872735211ab9f1436eaf4567b3047b25063f1a9c Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 22 Jun 2022 17:39:57 +0000 Subject: [PATCH 09/28] [6/6] Cleanup old patches and use the new ones --- zlib.spec | 55 +++++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/zlib.spec b/zlib.spec index 254067f..2fa9366 100644 --- a/zlib.spec +++ b/zlib.spec @@ -13,30 +13,24 @@ Source: https://www.zlib.net/zlib-%{version}.tar.xz Patch0: zlib-1.2.5-minizip-fixuncrypt.patch # resolves: #805113 Patch1: zlib-1.2.11-optimized-s390.patch -# IBM Z optimalizations -Patch7: zlib-1.2.11-IBM-Z-hw-accelrated-deflate-s390x.patch -# IBM CRC32 optimalization for POWER archs -Patch8: zlib-1.2.11-optimized-CRC32-framework.patch -# fixed firefox crash + added test case -Patch9: zlib-1.2.11-firefox-crash-fix.patch +# IBM Z hardware-accelerated deflate +# ref: https://github.com/madler/zlib/pull/410 +Patch18: zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch +# IBM optimized crc32 for Power 8+ processors +# ref: https://github.com/madler/zlib/pull/478 +Patch19: zlib-1.2.12-power-optimizations.patch +# Patch for s390x crc32vx +# ref: https://github.com/iii-i/zlib/releases/tag/crc32vx-v3 +Patch20: zlib-1.2.12-s390x-vectorize-crc32.patch +# Fix for configure +# ref: https://github.com/madler/zlib/pull/607/commits/80d086357a55b94a13e43756cf3e131f25eef0e4 +Patch21: zlib-1.2.12-fix-configure.patch # fixed covscan issues -Patch10: zlib-1.2.11-covscan-issues.patch -# fix for IBM Z optimalizations -Patch11: zlib-1.2.11-IBM-Z-hw-accelrated-deflate-fix.patch -# permit a deflateParams() parameter change -Patch12: zlib-1.2.11-permit-deflateParams-change.patch -# fixed DFLTCC compression level switching issues -# enabled HW compression for compression levels 1 through 6 -Patch13: zlib-1.2.11-IBM-DFLTCC-compression-level-switching-issues.patch -# fixed inflateSyncPoint() bad return value on z15 -Patch14: zlib-1.2.11-inflateSyncPoint-return-value-fix.patch +Patch22: zlib-1.2.11-covscan-issues.patch # fixed issues found by covscan for rhel-9 # ref: https://github.com/madler/zlib/pull/554 -Patch15: zlib-1.2.11-covscan-issues-rhel9.patch -# Fix for s390x vectorize CRC32 -Patch16: zlib-1.2.11-s390x-vectorize-crc32.patch -# Fix the compressBound() on z15 -Patch17: zlib-1.2.11-IBM-Z-hw-accelrated-deflate-compressBound-fix.patch +Patch23: zlib-1.2.11-covscan-issues-rhel9.patch + BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -92,20 +86,17 @@ developing applications which use minizip. %prep %setup -q %patch0 -p1 -b .fixuncrypt +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +# Patch19 conflicts with Patch1, so the Patch1 has to be applied after, +# because it is arch specific %ifarch s390 s390x %patch1 -p1 -b .optimized-deflate %endif -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 -%patch11 -p1 -%patch12 -p1 -%patch13 -p1 -%patch14 -p1 -%patch15 -p1 -%patch16 -p1 -%patch17 -p1 iconv -f iso-8859-2 -t utf-8 < ChangeLog > ChangeLog.tmp From 7a6d1b10bf32e3d9af6eda3b1f6ec25ec8ff0463 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Tue, 28 Jun 2022 17:04:46 +0000 Subject: [PATCH 10/28] Fix covscan patch that caused compiler warnings --- zlib-1.2.11-covscan-issues.patch | 28 ---------------------------- zlib.spec | 5 ++++- 2 files changed, 4 insertions(+), 29 deletions(-) diff --git a/zlib-1.2.11-covscan-issues.patch b/zlib-1.2.11-covscan-issues.patch index b816a5a..24f9947 100644 --- a/zlib-1.2.11-covscan-issues.patch +++ b/zlib-1.2.11-covscan-issues.patch @@ -21,31 +21,3 @@ index 089285a..9b09718 100644 bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : s->level == 0 ? deflate_stored(s, flush) : -diff -rup zlib-1.2.12/test/crc32_test.c.old zlib-1.2.12/test/crc32_test.c ---- zlib-1.2.12/test/crc32_test.c.old 2022-06-23 11:20:52.393574517 +0000 -+++ zlib-1.2.12/test/crc32_test.c 2022-06-23 11:21:50.195574517 +0000 -@@ -11,7 +11,7 @@ - # include - #endif - --void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); -+void test_crc32 OF((uLong crc, char* buf, z_size_t len, uLong chk, int line)); - int main OF((void)); - - typedef struct { -@@ -24,12 +24,12 @@ typedef struct { - - void test_crc32(crc, buf, len, chk, line) - uLong crc; -- Byte *buf; -+ char *buf; - z_size_t len; - uLong chk; - int line; - { -- uLong res = crc32(crc, buf, len); -+ uLong res = crc32(crc, (Bytef *) buf, len); - if (res != chk) { - fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", - line, (unsigned int)res, (unsigned int)chk); - diff --git a/zlib.spec b/zlib.spec index 2fa9366..47934e6 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.12 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -174,6 +174,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Tue Jun 28 2022 Lukas Javorsky - 1.2.12-2 +- Fix covscan patch that caused compiler warnings + * Tue Apr 05 2022 Lukas Javorsky - 1.2.12-1 - Rebase to 1.2.12 - Resolves: CVE-2018-25032 From 59c603eb22e8e8bfcad2970df2f2dc85ca01a561 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Fri, 8 Jul 2022 08:29:44 +0000 Subject: [PATCH 11/28] Correct incorrect inputs provided to the CRC functions This issue was reported to us by ruby package: https://github.com/ruby/spec/issues/932 Patch source: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 --- ...-correct-inputs-provided-to-crc-func.patch | 54 +++++++++++++++++++ zlib.spec | 9 +++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 zlib-1.2.12-correct-inputs-provided-to-crc-func.patch diff --git a/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch b/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch new file mode 100644 index 0000000..5581949 --- /dev/null +++ b/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch @@ -0,0 +1,54 @@ +From ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Mon Sep 17 00:00:00 2001 +From: Mark Adler +Date: Wed, 30 Mar 2022 11:14:53 -0700 +Subject: [PATCH] Correct incorrect inputs provided to the CRC functions. + +The previous releases of zlib were not sensitive to incorrect CRC +inputs with bits set above the low 32. This commit restores that +behavior, so that applications with such bugs will continue to +operate as before. +--- + crc32.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/crc32.c b/crc32.c +index a1bdce5..451887b 100644 +--- a/crc32.c ++++ b/crc32.c +@@ -630,7 +630,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + #endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ +- crc ^= 0xffffffff; ++ crc = (~crc) & 0xffffffff; + + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { +@@ -749,7 +749,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) + #endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ +- crc ^= 0xffffffff; ++ crc = (~crc) & 0xffffffff; + + #ifdef W + +@@ -1077,7 +1077,7 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + #ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); + #endif /* DYNAMIC_CRC_TABLE */ +- return multmodp(x2nmodp(len2, 3), crc1) ^ crc2; ++ return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); + } + + /* ========================================================================= */ +@@ -1112,5 +1112,5 @@ uLong crc32_combine_op(crc1, crc2, op) + uLong crc2; + uLong op; + { +- return multmodp(op, crc1) ^ crc2; ++ return multmodp(op, crc1) ^ (crc2 & 0xffffffff); + } +-- +2.34.3 + diff --git a/zlib.spec b/zlib.spec index 47934e6..b6b2a7e 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.12 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -30,6 +30,9 @@ Patch22: zlib-1.2.11-covscan-issues.patch # fixed issues found by covscan for rhel-9 # ref: https://github.com/madler/zlib/pull/554 Patch23: zlib-1.2.11-covscan-issues-rhel9.patch +# Correct incorrect inputs provided to the CRC functions. +# ref: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 +Patch24: zlib-1.2.12-correct-inputs-provided-to-crc-func.patch BuildRequires: make @@ -92,6 +95,7 @@ developing applications which use minizip. %patch21 -p1 %patch22 -p1 %patch23 -p1 +%patch24 -p1 # Patch19 conflicts with Patch1, so the Patch1 has to be applied after, # because it is arch specific %ifarch s390 s390x @@ -174,6 +178,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Mon Jul 04 2022 Lukas Javorsky - 1.2.12-3 +- Upstream patch: Correct incorrect inputs provided to the CRC functions + * Tue Jun 28 2022 Lukas Javorsky - 1.2.12-2 - Fix covscan patch that caused compiler warnings From 6e982b7c51e3e6e249d9d6ba16c091880e641709 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 23 Jul 2022 13:57:52 +0000 Subject: [PATCH 12/28] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- zlib.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zlib.spec b/zlib.spec index b6b2a7e..bd72569 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.12 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -178,6 +178,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Sat Jul 23 2022 Fedora Release Engineering - 1.2.12-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Mon Jul 04 2022 Lukas Javorsky - 1.2.12-3 - Upstream patch: Correct incorrect inputs provided to the CRC functions From de5caa002f6c8551c7ad0bea12b064aa0c20f0f7 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 10 Aug 2022 07:58:54 +0000 Subject: [PATCH 13/28] Fix heap-based buffer over-read or buffer overflow in inflate.c Upstream patch: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Resolves: CVE-2022-37434 --- zlib-1.2.12-fix-CVE-2022-37434.patch | 14 ++++++++++++++ zlib.spec | 11 +++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 zlib-1.2.12-fix-CVE-2022-37434.patch diff --git a/zlib-1.2.12-fix-CVE-2022-37434.patch b/zlib-1.2.12-fix-CVE-2022-37434.patch new file mode 100644 index 0000000..4df04f7 --- /dev/null +++ b/zlib-1.2.12-fix-CVE-2022-37434.patch @@ -0,0 +1,14 @@ +--- zlib-1.2.12/inflate.c.old 2022-08-09 10:30:18.831225181 +0000 ++++ zlib-1.2.12/inflate.c 2022-08-09 10:29:33.251225181 +0000 +@@ -792,8 +792,9 @@ int flush; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && +- state->head->extra != Z_NULL) { +- len = state->head->extra_len - state->length; ++ state->head->extra != Z_NULL && ++ (len = state->head->extra_len - state->length) < ++ state->head->extra_max) { + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); diff --git a/zlib.spec b/zlib.spec index bd72569..b348aad 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.12 -Release: 4%{?dist} +Release: 5%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -33,7 +33,9 @@ Patch23: zlib-1.2.11-covscan-issues-rhel9.patch # Correct incorrect inputs provided to the CRC functions. # ref: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Patch24: zlib-1.2.12-correct-inputs-provided-to-crc-func.patch - +# Fix for CVE-2022-37434 +# ref: https://github.com/madler/zlib/commit/1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d +Patch25: zlib-1.2.12-fix-CVE-2022-37434.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -96,6 +98,7 @@ developing applications which use minizip. %patch22 -p1 %patch23 -p1 %patch24 -p1 +%patch25 -p1 # Patch19 conflicts with Patch1, so the Patch1 has to be applied after, # because it is arch specific %ifarch s390 s390x @@ -178,6 +181,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Tue Aug 09 2022 Lukas Javorsky - 1.2.12-5 +- Fix heap-based buffer over-read or buffer overflow in inflate in inflate.c +- Resolves: CVE-2022-37434 + * Sat Jul 23 2022 Fedora Release Engineering - 1.2.12-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild From de2208b18b5fd4478469581f16d574113d929ef2 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 10 Aug 2022 08:18:58 +0000 Subject: [PATCH 14/28] Fix CVE-2018-25032 Upstream patch: https://github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531 Resolves: CVE-2018-25032 --- zlib-1.2.11-CVE-2018-25032.patch | 346 +++++++++++++++++++++++++++++++ zlib.spec | 9 +- 2 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 zlib-1.2.11-CVE-2018-25032.patch diff --git a/zlib-1.2.11-CVE-2018-25032.patch b/zlib-1.2.11-CVE-2018-25032.patch new file mode 100644 index 0000000..800692f --- /dev/null +++ b/zlib-1.2.11-CVE-2018-25032.patch @@ -0,0 +1,346 @@ +From 5c44459c3b28a9bd3283aaceab7c615f8020c531 Mon Sep 17 00:00:00 2001 +From: Mark Adler +Date: Tue, 17 Apr 2018 22:09:22 -0700 +Subject: [PATCH] Fix a bug that can crash deflate on some input when using + Z_FIXED. + +This bug was reported by Danilo Ramos of Eideticom, Inc. It has +lain in wait 13 years before being found! The bug was introduced +in zlib 1.2.2.2, with the addition of the Z_FIXED option. That +option forces the use of fixed Huffman codes. For rare inputs with +a large number of distant matches, the pending buffer into which +the compressed data is written can overwrite the distance symbol +table which it overlays. That results in corrupted output due to +invalid distances, and can result in out-of-bound accesses, +crashing the application. + +The fix here combines the distance buffer and literal/length +buffers into a single symbol buffer. Now three bytes of pending +buffer space are opened up for each literal or length/distance +pair consumed, instead of the previous two bytes. This assures +that the pending buffer cannot overwrite the symbol table, since +the maximum fixed code compressed length/distance is 31 bits, and +since there are four bytes of pending space for every three bytes +of symbol space. +--- + deflate.c | 74 ++++++++++++++++++++++++++++++++++++++++--------------- + deflate.h | 25 +++++++++---------- + trees.c | 50 +++++++++++-------------------------- + 3 files changed, 79 insertions(+), 70 deletions(-) + +diff --git a/deflate.c b/deflate.c +index 425babc..19cba87 100644 +--- a/deflate.c ++++ b/deflate.c +@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + +- ushf *overlay; +- /* We overlay pending_buf and d_buf+l_buf. This works since the average +- * output size for (length,distance) codes is <= 24 bits. +- */ +- + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; +@@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + +- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); +- s->pending_buf = (uchf *) overlay; +- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); ++ /* We overlay pending_buf and sym_buf. This works since the average size ++ * for length/distance pairs over any compressed block is assured to be 31 ++ * bits or less. ++ * ++ * Analysis: The longest fixed codes are a length code of 8 bits plus 5 ++ * extra bits, for lengths 131 to 257. The longest fixed distance codes are ++ * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest ++ * possible fixed-codes length/distance pair is then 31 bits total. ++ * ++ * sym_buf starts one-fourth of the way into pending_buf. So there are ++ * three bytes in sym_buf for every four bytes in pending_buf. Each symbol ++ * in sym_buf is three bytes -- two for the distance and one for the ++ * literal/length. As each symbol is consumed, the pointer to the next ++ * sym_buf value to read moves forward three bytes. From that symbol, up to ++ * 31 bits are written to pending_buf. The closest the written pending_buf ++ * bits gets to the next sym_buf symbol to read is just before the last ++ * code is written. At that time, 31*(n-2) bits have been written, just ++ * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at ++ * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 ++ * symbols are written.) The closest the writing gets to what is unread is ++ * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and ++ * can range from 128 to 32768. ++ * ++ * Therefore, at a minimum, there are 142 bits of space between what is ++ * written and what is read in the overlain buffers, so the symbols cannot ++ * be overwritten by the compressed data. That space is actually 139 bits, ++ * due to the three-bit fixed-code block header. ++ * ++ * That covers the case where either Z_FIXED is specified, forcing fixed ++ * codes, or when the use of fixed codes is chosen, because that choice ++ * results in a smaller compressed block than dynamic codes. That latter ++ * condition then assures that the above analysis also covers all dynamic ++ * blocks. A dynamic-code block will only be chosen to be emitted if it has ++ * fewer bits than a fixed-code block would for the same set of symbols. ++ * Therefore its average symbol length is assured to be less than 31. So ++ * the compressed data for a dynamic block also cannot overwrite the ++ * symbols from which it is being constructed. ++ */ ++ ++ s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); ++ s->pending_buf_size = (ulg)s->lit_bufsize * 4; + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { +@@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + deflateEnd (strm); + return Z_MEM_ERROR; + } +- s->d_buf = overlay + s->lit_bufsize/sizeof(ush); +- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; ++ s->sym_buf = s->pending_buf + s->lit_bufsize; ++ s->sym_end = (s->lit_bufsize - 1) * 3; ++ /* We avoid equality with lit_bufsize*3 because of wraparound at 64K ++ * on 16 bit machines and because stored blocks are restricted to ++ * 64K-1 bytes. ++ */ + + s->level = level; + s->strategy = strategy; +@@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value) + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; +- if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) ++ if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; +@@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source) + #else + deflate_state *ds; + deflate_state *ss; +- ushf *overlay; + + + if (deflateStateCheck(source) || dest == Z_NULL) { +@@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source) + ds->window = (Bytef *) ZALLOC_WINDOW(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); +- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); +- ds->pending_buf = (uchf *) overlay; ++ ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { +@@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source) + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); +- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ++ ds->sym_buf = ds->pending_buf + ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; +@@ -1925,7 +1959,7 @@ local block_state deflate_fast(s, flush) + FLUSH_BLOCK(s, 1); + return finish_done; + } +- if (s->last_lit) ++ if (s->sym_next) + FLUSH_BLOCK(s, 0); + return block_done; + } +@@ -2056,7 +2090,7 @@ local block_state deflate_slow(s, flush) + FLUSH_BLOCK(s, 1); + return finish_done; + } +- if (s->last_lit) ++ if (s->sym_next) + FLUSH_BLOCK(s, 0); + return block_done; + } +@@ -2131,7 +2165,7 @@ local block_state deflate_rle(s, flush) + FLUSH_BLOCK(s, 1); + return finish_done; + } +- if (s->last_lit) ++ if (s->sym_next) + FLUSH_BLOCK(s, 0); + return block_done; + } +@@ -2170,7 +2204,7 @@ local block_state deflate_huff(s, flush) + FLUSH_BLOCK(s, 1); + return finish_done; + } +- if (s->last_lit) ++ if (s->sym_next) + FLUSH_BLOCK(s, 0); + return block_done; + } +diff --git a/deflate.h b/deflate.h +index 23ecdd3..d4cf1a9 100644 +--- a/deflate.h ++++ b/deflate.h +@@ -217,7 +217,7 @@ typedef struct internal_state { + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + +- uchf *l_buf; /* buffer for literals or lengths */ ++ uchf *sym_buf; /* buffer for distances and literals/lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for +@@ -239,13 +239,8 @@ typedef struct internal_state { + * - I can't count above 4 + */ + +- uInt last_lit; /* running index in l_buf */ +- +- ushf *d_buf; +- /* Buffer for distances. To simplify the code, d_buf and l_buf have +- * the same number of elements. To use different lengths, an extra flag +- * array would be necessary. +- */ ++ uInt sym_next; /* running index in sym_buf */ ++ uInt sym_end; /* symbol table full when sym_next reaches this */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ +@@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + + # define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ +- s->d_buf[s->last_lit] = 0; \ +- s->l_buf[s->last_lit++] = cc; \ ++ s->sym_buf[s->sym_next++] = 0; \ ++ s->sym_buf[s->sym_next++] = 0; \ ++ s->sym_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ +- flush = (s->last_lit == s->lit_bufsize-1); \ ++ flush = (s->sym_next == s->sym_end); \ + } + # define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ +- s->d_buf[s->last_lit] = dist; \ +- s->l_buf[s->last_lit++] = len; \ ++ s->sym_buf[s->sym_next++] = dist; \ ++ s->sym_buf[s->sym_next++] = dist >> 8; \ ++ s->sym_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ +- flush = (s->last_lit == s->lit_bufsize-1); \ ++ flush = (s->sym_next == s->sym_end); \ + } + #else + # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +diff --git a/trees.c b/trees.c +index 4f4a650..decaeb7 100644 +--- a/trees.c ++++ b/trees.c +@@ -416,7 +416,7 @@ local void init_block(s) + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; +- s->last_lit = s->matches = 0; ++ s->sym_next = s->matches = 0; + } + + #define SMALLEST 1 +@@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, +- s->last_lit)); ++ s->sym_next / 3)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + +@@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + { +- s->d_buf[s->last_lit] = (ush)dist; +- s->l_buf[s->last_lit++] = (uch)lc; ++ s->sym_buf[s->sym_next++] = dist; ++ s->sym_buf[s->sym_next++] = dist >> 8; ++ s->sym_buf[s->sym_next++] = lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; +@@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } +- +-#ifdef TRUNCATE_BLOCK +- /* Try to guess if it is profitable to stop the current block here */ +- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { +- /* Compute an upper bound for the compressed length */ +- ulg out_length = (ulg)s->last_lit*8L; +- ulg in_length = (ulg)((long)s->strstart - s->block_start); +- int dcode; +- for (dcode = 0; dcode < D_CODES; dcode++) { +- out_length += (ulg)s->dyn_dtree[dcode].Freq * +- (5L+extra_dbits[dcode]); +- } +- out_length >>= 3; +- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +- s->last_lit, in_length, out_length, +- 100L - out_length*100L/in_length)); +- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; +- } +-#endif +- return (s->last_lit == s->lit_bufsize-1); +- /* We avoid equality with lit_bufsize because of wraparound at 64K +- * on 16 bit machines and because stored blocks are restricted to +- * 64K-1 bytes. +- */ ++ return (s->sym_next == s->sym_end); + } + + /* =========================================================================== +@@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree) + { + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ +- unsigned lx = 0; /* running index in l_buf */ ++ unsigned sx = 0; /* running index in sym_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + +- if (s->last_lit != 0) do { +- dist = s->d_buf[lx]; +- lc = s->l_buf[lx++]; ++ if (s->sym_next != 0) do { ++ dist = s->sym_buf[sx++] & 0xff; ++ dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; ++ lc = s->sym_buf[sx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); +@@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree) + } + } /* literal or match pair ? */ + +- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ +- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, +- "pendingBuf overflow"); ++ /* Check that the overlay between pending_buf and sym_buf is ok: */ ++ Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); + +- } while (lx < s->last_lit); ++ } while (sx < s->sym_next); + + send_code(s, END_BLOCK, ltree); + } +-- +2.34.1 + diff --git a/zlib.spec b/zlib.spec index 31619eb..af1c337 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.11 -Release: 30%{?dist} +Release: 31%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -35,6 +35,9 @@ Patch14: zlib-1.2.11-inflateSyncPoint-return-value-fix.patch Patch15: zlib-1.2.11-covscan-issues-rhel9.patch # Fix for s390x vectorize CRC32 Patch16: zlib-1.2.11-s390x-vectorize-crc32.patch +# Fix for CVE-2018-25032 +# ref: https://github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531 +Patch17: zlib-1.2.11-CVE-2018-25032.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -103,6 +106,7 @@ developing applications which use minizip. %patch14 -p1 %patch15 -p1 %patch16 -p1 +%patch17 -p1 iconv -f iso-8859-2 -t utf-8 < ChangeLog > ChangeLog.tmp @@ -180,6 +184,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Wed Aug 10 2022 Lukas Javorsky - 1.2.11-31 +- Resolves: CVE-2018-25032 + * Thu Jul 29 2021 Dan Horák - 1.2.11-30 - Fix for IBM CRC32 optimalization rhbz#1959423 From f1746093bc41b0eba89e11dbd6232c3095b6a5f9 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 10 Aug 2022 14:47:30 +0000 Subject: [PATCH 15/28] Fix heap-based buffer over-read or buffer overflow in inflate.c Upstream patch: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Resolves: CVE-2022-37434 --- zlib-1.2.11-fix-CVE-2022-37434.patch | 14 ++++++++++++++ zlib.spec | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 zlib-1.2.11-fix-CVE-2022-37434.patch diff --git a/zlib-1.2.11-fix-CVE-2022-37434.patch b/zlib-1.2.11-fix-CVE-2022-37434.patch new file mode 100644 index 0000000..4df04f7 --- /dev/null +++ b/zlib-1.2.11-fix-CVE-2022-37434.patch @@ -0,0 +1,14 @@ +--- zlib-1.2.12/inflate.c.old 2022-08-09 10:30:18.831225181 +0000 ++++ zlib-1.2.12/inflate.c 2022-08-09 10:29:33.251225181 +0000 +@@ -792,8 +792,9 @@ int flush; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && +- state->head->extra != Z_NULL) { +- len = state->head->extra_len - state->length; ++ state->head->extra != Z_NULL && ++ (len = state->head->extra_len - state->length) < ++ state->head->extra_max) { + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); diff --git a/zlib.spec b/zlib.spec index af1c337..9676bae 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.11 -Release: 31%{?dist} +Release: 32%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -38,6 +38,9 @@ Patch16: zlib-1.2.11-s390x-vectorize-crc32.patch # Fix for CVE-2018-25032 # ref: https://github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531 Patch17: zlib-1.2.11-CVE-2018-25032.patch +# Fix for CVE-2022-37434 +# ref: https://github.com/madler/zlib/commit/1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d +Patch18: zlib-1.2.11-fix-CVE-2022-37434.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -107,6 +110,7 @@ developing applications which use minizip. %patch15 -p1 %patch16 -p1 %patch17 -p1 +%patch18 -p1 iconv -f iso-8859-2 -t utf-8 < ChangeLog > ChangeLog.tmp @@ -184,6 +188,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Wed Aug 10 2022 Lukas Javorsky - 1.2.11-32 +- Fix heap-based buffer over-read or buffer overflow in inflate in inflate.c +- Resolves: CVE-2022-37434 + * Wed Aug 10 2022 Lukas Javorsky - 1.2.11-31 - Resolves: CVE-2018-25032 From 1fd6f6f23dc07e99cf77050d639644158685105e Mon Sep 17 00:00:00 2001 From: Jakub Heger Date: Tue, 8 Mar 2022 10:08:53 +0000 Subject: [PATCH 16/28] Add CI to the zlib package This should automatically test zlib when a new PR is created --- .fmf/version | 1 + ci.fmf | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 .fmf/version create mode 100644 ci.fmf diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/ci.fmf b/ci.fmf new file mode 100644 index 0000000..1b25926 --- /dev/null +++ b/ci.fmf @@ -0,0 +1,7 @@ +summary: CI plan +discover: + how: fmf + url: https://src.fedoraproject.org/tests/zlib.git + ref: main +execute: + how: tmt From d7912252c7900b1eaf8d697e965d3b4816449409 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Mon, 17 Oct 2022 14:31:23 +0000 Subject: [PATCH 17/28] Rebase to version 1.2.13 Patches 21,24,25 has been upstreamed Resolves: #2134894 --- .gitignore | 1 + sources | 2 +- ...-correct-inputs-provided-to-crc-func.patch | 54 - zlib-1.2.12-fix-CVE-2022-37434.patch | 14 - zlib-1.2.12-fix-configure.patch | 46 - ...-1.2.13-IBM-Z-hw-accelerated-deflate.patch | 164 +- ....patch => zlib-1.2.13-optimized-s390.patch | 20 +- ...h => zlib-1.2.13-power-optimizations.patch | 1664 +---------------- ...=> zlib-1.2.13-s390x-vectorize-crc32.patch | 30 +- zlib.spec | 32 +- 10 files changed, 207 insertions(+), 1820 deletions(-) delete mode 100644 zlib-1.2.12-correct-inputs-provided-to-crc-func.patch delete mode 100644 zlib-1.2.12-fix-CVE-2022-37434.patch delete mode 100644 zlib-1.2.12-fix-configure.patch rename zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch => zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch (94%) rename zlib-1.2.11-optimized-s390.patch => zlib-1.2.13-optimized-s390.patch (75%) rename zlib-1.2.12-power-optimizations.patch => zlib-1.2.13-power-optimizations.patch (63%) rename zlib-1.2.12-s390x-vectorize-crc32.patch => zlib-1.2.13-s390x-vectorize-crc32.patch (95%) diff --git a/.gitignore b/.gitignore index 0c00884..c2ff4e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /zlib-1.2.11.tar.xz /zlib-1.2.12.tar.gz /zlib-1.2.12.tar.xz +/zlib-1.2.13.tar.xz diff --git a/sources b/sources index b24ca65..d5a4893 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (zlib-1.2.12.tar.xz) = 12940e81e988f7661da52fa20bdc333314ae86a621fdb748804a20840b065a1d6d984430f2d41f3a057de0effc6ff9bcf42f9ee9510b88219085f59cbbd082bd +SHA512 (zlib-1.2.13.tar.xz) = 9e7ac71a1824855ae526506883e439456b74ac0b811d54e94f6908249ba8719bec4c8d7672903c5280658b26cb6b5e93ecaaafe5cdc2980c760fa196773f0725 diff --git a/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch b/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch deleted file mode 100644 index 5581949..0000000 --- a/zlib-1.2.12-correct-inputs-provided-to-crc-func.patch +++ /dev/null @@ -1,54 +0,0 @@ -From ec3df00224d4b396e2ac6586ab5d25f673caa4c2 Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Wed, 30 Mar 2022 11:14:53 -0700 -Subject: [PATCH] Correct incorrect inputs provided to the CRC functions. - -The previous releases of zlib were not sensitive to incorrect CRC -inputs with bits set above the low 32. This commit restores that -behavior, so that applications with such bugs will continue to -operate as before. ---- - crc32.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/crc32.c b/crc32.c -index a1bdce5..451887b 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -630,7 +630,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - #endif /* DYNAMIC_CRC_TABLE */ - - /* Pre-condition the CRC */ -- crc ^= 0xffffffff; -+ crc = (~crc) & 0xffffffff; - - /* Compute the CRC up to a word boundary. */ - while (len && ((z_size_t)buf & 7) != 0) { -@@ -749,7 +749,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - #endif /* DYNAMIC_CRC_TABLE */ - - /* Pre-condition the CRC */ -- crc ^= 0xffffffff; -+ crc = (~crc) & 0xffffffff; - - #ifdef W - -@@ -1077,7 +1077,7 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - #ifdef DYNAMIC_CRC_TABLE - once(&made, make_crc_table); - #endif /* DYNAMIC_CRC_TABLE */ -- return multmodp(x2nmodp(len2, 3), crc1) ^ crc2; -+ return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); - } - - /* ========================================================================= */ -@@ -1112,5 +1112,5 @@ uLong crc32_combine_op(crc1, crc2, op) - uLong crc2; - uLong op; - { -- return multmodp(op, crc1) ^ crc2; -+ return multmodp(op, crc1) ^ (crc2 & 0xffffffff); - } --- -2.34.3 - diff --git a/zlib-1.2.12-fix-CVE-2022-37434.patch b/zlib-1.2.12-fix-CVE-2022-37434.patch deleted file mode 100644 index 4df04f7..0000000 --- a/zlib-1.2.12-fix-CVE-2022-37434.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- zlib-1.2.12/inflate.c.old 2022-08-09 10:30:18.831225181 +0000 -+++ zlib-1.2.12/inflate.c 2022-08-09 10:29:33.251225181 +0000 -@@ -792,8 +792,9 @@ int flush; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && -- state->head->extra != Z_NULL) { -- len = state->head->extra_len - state->length; -+ state->head->extra != Z_NULL && -+ (len = state->head->extra_len - state->length) < -+ state->head->extra_max) { - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); diff --git a/zlib-1.2.12-fix-configure.patch b/zlib-1.2.12-fix-configure.patch deleted file mode 100644 index d1b72cf..0000000 --- a/zlib-1.2.12-fix-configure.patch +++ /dev/null @@ -1,46 +0,0 @@ -From a6cd9e1230acdb535bd57bbc350020da3d24eaf3 Mon Sep 17 00:00:00 2001 -From: Sam James -Date: Mon, 28 Mar 2022 08:40:45 +0100 -Subject: [PATCH] Fix CC logic in configure - -In https://github.com/madler/zlib/commit/e9a52aa129efe3834383e415580716a7c4027f8d, -the logic was changed to try check harder for GCC, but it dropped -the default setting of cc=${CC}. It was throwing away any pre-set CC value as -a result. - -The rest of the script then cascades down a bad path because it's convinced -it's not GCC or a GCC-like compiler. - -This led to e.g. misdetection of inability to build shared libs -for say, multilib cases (w/ CC being one thing from the environment being used -for one test (e.g. x86_64-unknown-linux-gnu-gcc -m32 and then 'cc' used for -shared libs (but missing "-m32"!)). Obviously just one example of how -the old logic could break. - -This restores the old default of 'CC' if nothing overrides it later -in configure. - -Bug: https://bugs.gentoo.org/836308 -Signed-off-by: Sam James ---- - configure | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/configure b/configure -index a21be36..cdf0e5b 100755 ---- a/configure -+++ b/configure -@@ -185,7 +185,10 @@ if test -z "$CC"; then - else - cc=${CROSS_PREFIX}cc - fi -+else -+ cc=${CC} - fi -+ - cflags=${CFLAGS-"-O3"} - # to force the asm version use: CFLAGS="-O3 -DASMV" ./configure - case "$cc" in --- -2.34.3 - diff --git a/zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch b/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch similarity index 94% rename from zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch rename to zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch index bf30042..3f6f1dc 100644 --- a/zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch +++ b/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch @@ -1,4 +1,4 @@ -From e6aed68ff815be74855ec6a19d6ae35065a4adb4 Mon Sep 17 00:00:00 2001 +From 48c5416a4e21227b8e1aa24fd819d4619a90e1a9 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Wed, 18 Jul 2018 13:14:07 +0200 Subject: [PATCH] Add support for IBM Z hardware-accelerated deflate @@ -100,10 +100,10 @@ updatewindow and made ZLIB_INTERNAL. configure | 24 + contrib/README.contrib | 4 + contrib/s390/README.txt | 17 + - contrib/s390/dfltcc.c | 996 ++++++++++++++++++++++++++++++++++ + contrib/s390/dfltcc.c | 995 ++++++++++++++++++++++++++++++++++ contrib/s390/dfltcc.h | 81 +++ contrib/s390/dfltcc_deflate.h | 55 ++ - deflate.c | 81 ++- + deflate.c | 82 ++- deflate.h | 12 + gzguts.h | 4 + inflate.c | 87 ++- @@ -119,10 +119,10 @@ updatewindow and made ZLIB_INTERNAL. create mode 100644 contrib/s390/dfltcc_deflate.h diff --git a/Makefile.in b/Makefile.in -index fd28bbfbf..66e3a8057 100644 +index 408954d..a811c10 100644 --- a/Makefile.in +++ b/Makefile.in -@@ -143,6 +143,14 @@ match.lo: match.S +@@ -139,6 +139,14 @@ match.lo: match.S mv _match.o match.lo rm -f _match.s @@ -134,11 +134,11 @@ index fd28bbfbf..66e3a8057 100644 + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/dfltcc.o $(SRCDIR)contrib/s390/dfltcc.c + -@mv objs/dfltcc.o $@ + - example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c + crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c diff --git a/compress.c b/compress.c -index e2db404ab..78fc6568f 100644 +index 2ad5326..179ee27 100644 --- a/compress.c +++ b/compress.c @@ -5,9 +5,15 @@ @@ -158,8 +158,8 @@ index e2db404ab..78fc6568f 100644 /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte -@@ -81,6 +87,12 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) - uLong ZEXPORT compressBound (sourceLen) +@@ -81,6 +87,12 @@ int ZEXPORT compress(dest, destLen, source, sourceLen) + uLong ZEXPORT compressBound(sourceLen) uLong sourceLen; { + uLong complen = DEFLATE_BOUND_COMPLEN(sourceLen); @@ -172,10 +172,10 @@ index e2db404ab..78fc6568f 100644 (sourceLen >> 25) + 13; } diff --git a/configure b/configure -index 3fa3e8618..cdf0e5b6b 100755 +index 45d51e5..ab3204a 100755 --- a/configure +++ b/configure -@@ -115,6 +115,7 @@ case "$1" in +@@ -118,6 +118,7 @@ case "$1" in echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log @@ -183,7 +183,7 @@ index 3fa3e8618..cdf0e5b6b 100755 exit 0 ;; -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; -@@ -139,6 +140,16 @@ case "$1" in +@@ -142,6 +143,16 @@ case "$1" in -w* | --warn) warn=1; shift ;; -d* | --debug) debug=1; shift ;; --sanitize) sanitize=1; shift ;; @@ -200,7 +200,7 @@ index 3fa3e8618..cdf0e5b6b 100755 *) echo "unknown option: $1" | tee -a configure.log echo "$0 --help for help" | tee -a configure.log -@@ -836,6 +847,19 @@ EOF +@@ -828,6 +839,19 @@ EOF fi fi @@ -217,14 +217,14 @@ index 3fa3e8618..cdf0e5b6b 100755 + echo "Checking for sys/sdt.h ... No." | tee -a configure.log +fi + - # show the results in the log + # test to see if we can use a gnu indirection function to detect and load optimized code at runtime echo >> configure.log - echo ALL = $ALL >> configure.log + cat > $test.c < +@@ -55,6 +55,10 @@ puff/ by Mark Adler Small, low memory usage inflate. Also serves to provide an unambiguous description of the deflate format. @@ -237,7 +237,7 @@ index 335e43508..130a28bdb 100644 diff --git a/contrib/s390/README.txt b/contrib/s390/README.txt new file mode 100644 -index 000000000..48be008bd +index 0000000..48be008 --- /dev/null +++ b/contrib/s390/README.txt @@ -0,0 +1,17 @@ @@ -260,10 +260,10 @@ index 000000000..48be008bd +DFLTCC_LEVEL_MASK to 0x7e at run time. diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c new file mode 100644 -index 000000000..fe81bebfe +index 0000000..aa0b7a3 --- /dev/null +++ b/contrib/s390/dfltcc.c -@@ -0,0 +1,996 @@ +@@ -0,0 +1,995 @@ +/* dfltcc.c - SystemZ DEFLATE CONVERSION CALL support. */ + +/* @@ -890,7 +890,7 @@ index 000000000..fe81bebfe + state->bits = param->sbb; + state->whave = param->hl; + state->wnext = (param->ho + param->hl) & ((1 << HB_BITS) - 1); -+ state->check = state->flags ? ZSWAP32(param->cv) : param->cv; ++ strm->adler = state->check = state->flags ? ZSWAP32(param->cv) : param->cv; + if (cc == DFLTCC_CC_OP2_CORRUPT && param->oesc != 0) { + /* Report an error if stream is corrupted */ + state->mode = BAD; @@ -968,7 +968,6 @@ index 000000000..fe81bebfe +__attribute__((constructor)) local void init_globals OF((void)); +__attribute__((constructor)) local void init_globals(void) +{ -+ const char *endptr; + const char *env; + register char r0 __asm__("r0"); + @@ -1262,7 +1261,7 @@ index 000000000..fe81bebfe +} diff --git a/contrib/s390/dfltcc.h b/contrib/s390/dfltcc.h new file mode 100644 -index 000000000..da26612ca +index 0000000..da26612 --- /dev/null +++ b/contrib/s390/dfltcc.h @@ -0,0 +1,81 @@ @@ -1349,7 +1348,7 @@ index 000000000..da26612ca +#endif diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h new file mode 100644 -index 000000000..46acfc550 +index 0000000..46acfc5 --- /dev/null +++ b/contrib/s390/dfltcc_deflate.h @@ -0,0 +1,55 @@ @@ -1409,7 +1408,7 @@ index 000000000..46acfc550 + +#endif diff --git a/deflate.c b/deflate.c -index 6ac891d7d..afca18ce2 100644 +index 4a689db..9fd3bdb 100644 --- a/deflate.c +++ b/deflate.c @@ -61,15 +61,30 @@ const char deflate_copyright[] = @@ -1456,9 +1455,9 @@ index 6ac891d7d..afca18ce2 100644 local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); - #ifdef ASMV - # pragma message("Assembler code may have bugs -- use at your own risk") -@@ -299,7 +313,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + local uInt longest_match OF((deflate_state *s, IPos cur_match)); + +@@ -295,7 +309,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ @@ -1467,16 +1466,16 @@ index 6ac891d7d..afca18ce2 100644 if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; -@@ -316,7 +330,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, +@@ -312,7 +326,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->window = (Bytef *) ZALLOC_WINDOW(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); -@@ -434,6 +448,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) +@@ -430,6 +444,7 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) /* when using zlib wrappers, compute Adler-32 for provided dictionary */ if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); @@ -1484,7 +1483,7 @@ index 6ac891d7d..afca18ce2 100644 s->wrap = 0; /* avoid computing Adler-32 in read_buf */ /* if dictionary would fill window, just replace the history */ -@@ -492,6 +507,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) +@@ -488,6 +503,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1492,7 +1491,7 @@ index 6ac891d7d..afca18ce2 100644 s = strm->state; len = s->strstart + s->lookahead; if (len > s->w_size) -@@ -538,6 +554,8 @@ int ZEXPORT deflateResetKeep (strm) +@@ -534,6 +550,8 @@ int ZEXPORT deflateResetKeep(strm) _tr_init(s); @@ -1501,7 +1500,7 @@ index 6ac891d7d..afca18ce2 100644 return Z_OK; } -@@ -613,6 +631,7 @@ int ZEXPORT deflateParams(strm, level, strategy) +@@ -609,6 +627,7 @@ int ZEXPORT deflateParams(strm, level, strategy) { deflate_state *s; compress_func func; @@ -1509,7 +1508,7 @@ index 6ac891d7d..afca18ce2 100644 if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; -@@ -625,15 +644,18 @@ int ZEXPORT deflateParams(strm, level, strategy) +@@ -621,15 +640,18 @@ int ZEXPORT deflateParams(strm, level, strategy) if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } @@ -1532,25 +1531,31 @@ index 6ac891d7d..afca18ce2 100644 return Z_BUF_ERROR; } if (s->level != level) { -@@ -700,6 +722,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; -+ DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen); +@@ -705,11 +727,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) + ~13% overhead plus a small constant */ + fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + + (sourceLen >> 9) + 4; ++ DEFLATE_BOUND_ADJUST_COMPLEN(strm, fixedlen, sourceLen); - /* if can't get parameters, return conservative bound plus zlib wrapper */ + /* upper bound for stored blocks with length 127 (memLevel == 1) -- + ~4% overhead plus a small constant */ + storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + + (sourceLen >> 11) + 7; ++ DEFLATE_BOUND_ADJUST_COMPLEN(strm, storelen, sourceLen); + + /* if can't get parameters, return larger bound plus a zlib wrapper */ if (deflateStateCheck(strm)) -@@ -741,7 +764,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) +@@ -751,7 +775,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) } - /* if not default parameters, return conservative bound */ + /* if not default parameters, return one of the conservative bounds */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) + if (DEFLATE_NEED_CONSERVATIVE_BOUND(strm) || + s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; + return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; - /* default settings: return tight bound for that case */ -@@ -768,7 +792,7 @@ local void putShortMSB (s, b) + /* default settings: return tight bound for that case -- ~0.03% overhead +@@ -779,7 +804,7 @@ local void putShortMSB(s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ @@ -1559,7 +1564,7 @@ index 6ac891d7d..afca18ce2 100644 z_streamp strm; { unsigned len; -@@ -1040,7 +1064,8 @@ int ZEXPORT deflate (strm, flush) +@@ -1051,7 +1076,8 @@ int ZEXPORT deflate(strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; @@ -1569,7 +1574,7 @@ index 6ac891d7d..afca18ce2 100644 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush); -@@ -1087,7 +1112,6 @@ int ZEXPORT deflate (strm, flush) +@@ -1098,7 +1124,6 @@ int ZEXPORT deflate(strm, flush) } if (flush != Z_FINISH) return Z_OK; @@ -1577,7 +1582,7 @@ index 6ac891d7d..afca18ce2 100644 /* Write the trailer */ #ifdef GZIP -@@ -1103,7 +1127,7 @@ int ZEXPORT deflate (strm, flush) +@@ -1114,7 +1139,7 @@ int ZEXPORT deflate(strm, flush) } else #endif @@ -1586,7 +1591,7 @@ index 6ac891d7d..afca18ce2 100644 putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } -@@ -1112,7 +1136,11 @@ int ZEXPORT deflate (strm, flush) +@@ -1123,7 +1148,11 @@ int ZEXPORT deflate(strm, flush) * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ @@ -1599,7 +1604,7 @@ index 6ac891d7d..afca18ce2 100644 } /* ========================================================================= */ -@@ -1129,9 +1157,9 @@ int ZEXPORT deflateEnd (strm) +@@ -1140,9 +1169,9 @@ int ZEXPORT deflateEnd(strm) TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); @@ -1611,7 +1616,7 @@ index 6ac891d7d..afca18ce2 100644 strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -@@ -1161,13 +1189,13 @@ int ZEXPORT deflateCopy (dest, source) +@@ -1172,13 +1201,13 @@ int ZEXPORT deflateCopy(dest, source) zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); @@ -1628,7 +1633,7 @@ index 6ac891d7d..afca18ce2 100644 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); -@@ -1214,7 +1242,8 @@ local unsigned read_buf(strm, buf, size) +@@ -1225,7 +1254,8 @@ local unsigned read_buf(strm, buf, size) strm->avail_in -= len; zmemcpy(buf, strm->next_in, len); @@ -1639,7 +1644,7 @@ index 6ac891d7d..afca18ce2 100644 } #ifdef GZIP diff --git a/deflate.h b/deflate.h -index 1a06cd5f2..f92750ca6 100644 +index 1a06cd5..f92750c 100644 --- a/deflate.h +++ b/deflate.h @@ -299,6 +299,7 @@ void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); @@ -1667,7 +1672,7 @@ index 1a06cd5f2..f92750ca6 100644 + #endif /* DEFLATE_H */ diff --git a/gzguts.h b/gzguts.h -index 57faf3716..581f2b631 100644 +index 57faf37..581f2b6 100644 --- a/gzguts.h +++ b/gzguts.h @@ -153,7 +153,11 @@ @@ -1683,7 +1688,7 @@ index 57faf3716..581f2b631 100644 /* gzip modes, also provide a little integrity check on the passed structure */ #define GZ_NONE 0 diff --git a/inflate.c b/inflate.c -index 7be8c6366..a0e14e292 100644 +index 8acbef4..918dfa7 100644 --- a/inflate.c +++ b/inflate.c @@ -85,6 +85,24 @@ @@ -1719,7 +1724,7 @@ index 7be8c6366..a0e14e292 100644 Tracev((stderr, "inflate: reset\n")); return Z_OK; } -@@ -183,7 +202,7 @@ int windowBits; +@@ -185,7 +204,7 @@ int windowBits; if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { @@ -1728,7 +1733,7 @@ index 7be8c6366..a0e14e292 100644 state->window = Z_NULL; } -@@ -222,7 +241,7 @@ int stream_size; +@@ -224,7 +243,7 @@ int stream_size; strm->zfree = zcfree; #endif state = (struct inflate_state FAR *) @@ -1737,7 +1742,7 @@ index 7be8c6366..a0e14e292 100644 if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; -@@ -231,7 +250,7 @@ int stream_size; +@@ -233,7 +252,7 @@ int stream_size; state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { @@ -1746,7 +1751,7 @@ index 7be8c6366..a0e14e292 100644 strm->state = Z_NULL; } return ret; -@@ -253,6 +272,7 @@ int value; +@@ -255,6 +274,7 @@ int value; struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1754,7 +1759,7 @@ index 7be8c6366..a0e14e292 100644 state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; -@@ -380,6 +400,27 @@ void makefixed() +@@ -382,6 +402,27 @@ void makefixed() } #endif /* MAKEFIXED */ @@ -1782,7 +1787,7 @@ index 7be8c6366..a0e14e292 100644 /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called -@@ -404,20 +445,7 @@ unsigned copy; +@@ -406,20 +447,7 @@ unsigned copy; state = (struct inflate_state FAR *)strm->state; @@ -1804,7 +1809,7 @@ index 7be8c6366..a0e14e292 100644 /* copy state->wsize or less output bytes into the circular window */ if (copy >= state->wsize) { -@@ -860,6 +888,7 @@ int flush; +@@ -863,6 +891,7 @@ int flush; if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; /* fallthrough */ case TYPEDO: @@ -1812,7 +1817,7 @@ index 7be8c6366..a0e14e292 100644 if (state->last) { BYTEBITS(); state->mode = CHECK; -@@ -1221,7 +1250,7 @@ int flush; +@@ -1224,7 +1253,7 @@ int flush; out -= left; strm->total_out += out; state->total += out; @@ -1821,7 +1826,7 @@ index 7be8c6366..a0e14e292 100644 strm->adler = state->check = UPDATE_CHECK(state->check, put - out, out); out = left; -@@ -1276,8 +1305,9 @@ int flush; +@@ -1279,8 +1308,9 @@ int flush; */ inf_leave: RESTORE(); @@ -1833,7 +1838,7 @@ index 7be8c6366..a0e14e292 100644 if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; -@@ -1287,7 +1317,7 @@ int flush; +@@ -1290,7 +1320,7 @@ int flush; strm->total_in += in; strm->total_out += out; state->total += out; @@ -1842,7 +1847,7 @@ index 7be8c6366..a0e14e292 100644 strm->adler = state->check = UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + -@@ -1305,8 +1335,8 @@ z_streamp strm; +@@ -1308,8 +1338,8 @@ z_streamp strm; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; @@ -1853,7 +1858,7 @@ index 7be8c6366..a0e14e292 100644 strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; -@@ -1485,6 +1515,7 @@ z_streamp strm; +@@ -1488,6 +1518,7 @@ z_streamp strm; struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1861,7 +1866,7 @@ index 7be8c6366..a0e14e292 100644 state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } -@@ -1505,21 +1536,22 @@ z_streamp source; +@@ -1508,21 +1539,22 @@ z_streamp source; /* allocate space */ copy = (struct inflate_state FAR *) @@ -1888,7 +1893,7 @@ index 7be8c6366..a0e14e292 100644 copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { -@@ -1576,6 +1608,7 @@ z_streamp strm; +@@ -1579,6 +1611,7 @@ z_streamp strm; if (inflateStateCheck(strm)) return -(1L << 16); @@ -1897,7 +1902,7 @@ index 7be8c6366..a0e14e292 100644 return (long)(((unsigned long)((long)state->back)) << 16) + (state->mode == COPY ? state->length : diff --git a/inflate.h b/inflate.h -index f127b6b1f..519ed3535 100644 +index f127b6b..519ed35 100644 --- a/inflate.h +++ b/inflate.h @@ -124,3 +124,5 @@ struct inflate_state { @@ -1907,7 +1912,7 @@ index f127b6b1f..519ed3535 100644 + +int ZLIB_INTERNAL inflate_ensure_window OF((struct inflate_state *state)); diff --git a/test/infcover.c b/test/infcover.c -index 2be01646c..a208219dc 100644 +index 2be0164..a208219 100644 --- a/test/infcover.c +++ b/test/infcover.c @@ -373,7 +373,7 @@ local void cover_support(void) @@ -1929,7 +1934,7 @@ index 2be01646c..a208219dc 100644 static unsigned int next = 0; static unsigned char dat[] = {0x63, 0, 2, 0}; diff --git a/test/minigzip.c b/test/minigzip.c -index e22fb08c0..4b5f4efed 100644 +index a649d2b..964408a 100644 --- a/test/minigzip.c +++ b/test/minigzip.c @@ -132,7 +132,11 @@ static void pwinerror (s) @@ -1945,7 +1950,7 @@ index e22fb08c0..4b5f4efed 100644 #ifdef MAXSEG_64K diff --git a/trees.c b/trees.c -index 8b438cce4..84c1b4732 100644 +index 5f305c4..4924bdf 100644 --- a/trees.c +++ b/trees.c @@ -149,8 +149,6 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, @@ -1971,7 +1976,7 @@ index 8b438cce4..84c1b4732 100644 /* the arguments must not have side effects */ -@@ -1134,7 +1139,7 @@ local int detect_data_type(s) +@@ -1133,7 +1138,7 @@ local int detect_data_type(s) * method would use a table) * IN assertion: 1 <= len <= 15 */ @@ -1980,7 +1985,7 @@ index 8b438cce4..84c1b4732 100644 unsigned code; /* the value to invert */ int len; /* its bit length */ { -@@ -1166,7 +1171,7 @@ local void bi_flush(s) +@@ -1165,7 +1170,7 @@ local void bi_flush(s) /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ @@ -1990,7 +1995,7 @@ index 8b438cce4..84c1b4732 100644 { if (s->bi_valid > 8) { diff --git a/zutil.h b/zutil.h -index d9a20ae1b..bc83f59d0 100644 +index 0bc7f4e..75eb4df 100644 --- a/zutil.h +++ b/zutil.h @@ -87,6 +87,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ @@ -2002,3 +2007,6 @@ index d9a20ae1b..bc83f59d0 100644 /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +-- +2.37.3 + diff --git a/zlib-1.2.11-optimized-s390.patch b/zlib-1.2.13-optimized-s390.patch similarity index 75% rename from zlib-1.2.11-optimized-s390.patch rename to zlib-1.2.13-optimized-s390.patch index 3999592..6e8fd46 100644 --- a/zlib-1.2.11-optimized-s390.patch +++ b/zlib-1.2.13-optimized-s390.patch @@ -1,11 +1,9 @@ -diff --git a/deflate.c b/deflate.c -index 1ec7614..b724c8d 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -1322,15 +1322,16 @@ local void lm_init (s) - #define longest_match longest_match_default - #endif /* Z_POWER_OPT */ - +--- zlib-1.2.13/deflate.c.old 2022-11-24 16:41:34.527200490 +0000 ++++ zlib-1.2.13/deflate.c 2022-11-24 16:43:28.064200490 +0000 +@@ -1305,15 +1305,16 @@ local void lm_init(s) + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ -local uInt longest_match(s, cur_match) +local uInt longest_match(s, pcur_match) deflate_state *s; @@ -22,17 +20,17 @@ index 1ec7614..b724c8d 100644 int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; -@@ -1256,12 +1257,12 @@ local uInt longest_match(s, cur_match) +@@ -1328,12 +1329,12 @@ local uInt longest_match(s, cur_match) * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; -- register ush scan_end = *(ushf*)(scan+best_len-1); +- register ush scan_end = *(ushf*)(scan + best_len - 1); + register uInt scan_start = *(ushf*)scan; + register uInt scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; -- register Byte scan_end1 = scan[best_len-1]; +- register Byte scan_end1 = scan[best_len - 1]; - register Byte scan_end = scan[best_len]; + register uInt scan_end1 = scan[best_len-1]; + register uInt scan_end = scan[best_len]; diff --git a/zlib-1.2.12-power-optimizations.patch b/zlib-1.2.13-power-optimizations.patch similarity index 63% rename from zlib-1.2.12-power-optimizations.patch rename to zlib-1.2.13-power-optimizations.patch index d69117f..09f7c4d 100644 --- a/zlib-1.2.12-power-optimizations.patch +++ b/zlib-1.2.13-power-optimizations.patch @@ -1,7 +1,7 @@ -From a4d799105cf4fcc16affea4321d1690d9791e3a4 Mon Sep 17 00:00:00 2001 -From: Rogerio Alves -Date: Wed, 20 Nov 2019 10:35:40 -0300 -Subject: [PATCH 1/9] Preparation for Power optimizations +From 7edf70d6b010dd803d324bf90f5241a44bec3df7 Mon Sep 17 00:00:00 2001 +From: Manjunath S Matti +Date: Tue, 15 Nov 2022 02:45:53 -0600 +Subject: [PATCH 1/3] Preparation for Power optimizations Optimized functions for Power will make use of GNU indirect functions, an extension to support different implementations of the same function, @@ -13,32 +13,35 @@ macro under `contrib/gcc`. This can be reused by other archs as well. Author: Matheus Castanho Author: Rogerio Alves +Signed-off-by: Manjunath Matti --- - CMakeLists.txt | 67 ++++++++++++++++++++++++++++++++++++++++++ - configure | 66 +++++++++++++++++++++++++++++++++++++++++ + CMakeLists.txt | 71 ++++++++++++++++++++++++++++++++++++++++++ + configure | 66 +++++++++++++++++++++++++++++++++++++++ contrib/README.contrib | 8 +++++ - contrib/gcc/zifunc.h | 60 +++++++++++++++++++++++++++++++++++++ + contrib/gcc/zifunc.h | 60 +++++++++++++++++++++++++++++++++++ contrib/power/power.h | 4 +++ - 5 files changed, 205 insertions(+) + 5 files changed, 209 insertions(+) create mode 100644 contrib/gcc/zifunc.h create mode 100644 contrib/power/power.h diff --git a/CMakeLists.txt b/CMakeLists.txt -index e6fbb37..f15782e 100644 +index b412dc7..e313f95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -7,6 +7,7 @@ set(VERSION "1.2.12") +@@ -5,6 +5,8 @@ project(zlib C) + + set(VERSION "1.2.13") - option(ASM686 "Enable building i686 assembly implementation") - option(AMD64 "Enable building amd64 assembly implementation") +option(POWER "Enable building power implementation") - ++ set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") -@@ -140,6 +141,72 @@ if(CMAKE_COMPILER_IS_GNUCC) - add_definitions(-DASMV) - set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) - endif() + set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +@@ -126,6 +128,75 @@ if(NOT MINGW) + ) + endif() + ++if(CMAKE_COMPILER_IS_GNUCC) + + # test to see if we can use a GNU indirect function to detect and load optimized code at runtime + CHECK_C_SOURCE_COMPILES(" @@ -105,17 +108,19 @@ index e6fbb37..f15782e 100644 + set(ZLIB_SRCS ${ZLIB_SRCS} ${ZLIB_POWER8} ${ZLIB_POWER9}) + endif() + endif() - endif() - - if(MSVC) ++endif() ++ + # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) + string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" diff --git a/configure b/configure -index 52ff4a0..01ffdf6 100755 +index fa4d5da..9ee7008 100755 --- a/configure +++ b/configure -@@ -844,6 +844,73 @@ EOF +@@ -828,6 +828,72 @@ EOF fi fi - + +# test to see if we can use a gnu indirection function to detect and load optimized code at runtime +echo >> configure.log +cat > $test.c < $test.c << EOF - #include + # show the results in the log + echo >> configure.log + echo ALL = $ALL >> configure.log diff --git a/contrib/README.contrib b/contrib/README.contrib -index 335e435..12d2f83 100644 +index 5e5f950..c57b520 100644 --- a/contrib/README.contrib +++ b/contrib/README.contrib @@ -11,6 +11,10 @@ ada/ by Dmitriy Anisimkov @@ -289,21 +293,25 @@ index 0000000..b42c7d6 + * For conditions of distribution and use, see copyright notice in zlib.h + */ -- -2.34.3 +2.37.3 - -From 7429e4962c1948527a21ce77624a2ec2a85d5940 Mon Sep 17 00:00:00 2001 -From: Daniel Black -Date: Wed, 10 Jan 2018 10:50:39 +1100 -Subject: [PATCH 2/9] Add Power8+ optimized crc32 +From 2b843de4ffa241edc20877f3ec47e75c9ed13ec8 Mon Sep 17 00:00:00 2001 +From: Manjunath S Matti +Date: Wed, 16 Nov 2022 03:53:53 -0600 +Subject: [PATCH 2/3] Add Power8+ optimized crc32 This commit adds an optimized version for the crc32 function based on crc32-vpmsum from https://github.com/antonblanchard/crc32-vpmsum/ -This is the C implementation created by Rogerio Alves +This is the C implementation created by Rogerio Alves + It makes use of vector instructions to speed up CRC32 algorithm. + +Author: Rogerio Alves +Signed-off-by: Manjunath Matti --- + .gitignore | 3 + CMakeLists.txt | 7 +- Makefile.in | 43 +- configure | 7 +- @@ -323,10 +331,10 @@ It makes use of vector instructions to speed up CRC32 algorithm. create mode 100644 test/crc32_test.c diff --git a/CMakeLists.txt b/CMakeLists.txt -index f15782e..581e1fa 100644 +index e313f95..4ba992b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -184,7 +184,8 @@ if(CMAKE_COMPILER_IS_GNUCC) +@@ -172,7 +172,8 @@ if(CMAKE_COMPILER_IS_GNUCC) if(POWER8) add_definitions(-DZ_POWER8) @@ -336,7 +344,7 @@ index f15782e..581e1fa 100644 set_source_files_properties( ${ZLIB_POWER8} -@@ -301,6 +302,10 @@ add_executable(example test/example.c) +@@ -269,6 +270,10 @@ add_executable(example test/example.c) target_link_libraries(example zlib) add_test(example example) @@ -348,10 +356,10 @@ index f15782e..581e1fa 100644 target_link_libraries(minigzip zlib) diff --git a/Makefile.in b/Makefile.in -index 3d858aa..1694304 100644 +index 7d2713f..408954d 100644 --- a/Makefile.in +++ b/Makefile.in -@@ -75,11 +75,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) +@@ -71,11 +71,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) all: static shared @@ -366,54 +374,53 @@ index 3d858aa..1694304 100644 check: test -@@ -87,7 +87,7 @@ test: all teststatic testshared +@@ -83,7 +83,7 @@ test: all teststatic testshared teststatic: static @TMPST=tmpst_$$; \ -- if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ -+ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./crc32_test; then \ +- if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \ ++ if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST && ${QEMU_RUN} ./crc32_test; then \ echo ' *** zlib test OK ***'; \ else \ echo ' *** zlib test FAILED ***'; false; \ -@@ -100,7 +100,7 @@ testshared: shared +@@ -96,7 +96,7 @@ testshared: shared DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ TMPSH=tmpsh_$$; \ -- if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ -+ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./crc32_testsh; then \ +- if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH; then \ ++ if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH && ${QEMU_RUN} ./crc32_testsh; then \ echo ' *** zlib shared test OK ***'; \ else \ echo ' *** zlib shared test FAILED ***'; false; \ -@@ -109,7 +109,7 @@ testshared: shared +@@ -105,7 +105,7 @@ testshared: shared test64: all64 @TMP64=tmp64_$$; \ -- if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ -+ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./crc32_test64; then \ +- if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \ ++ if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64 && ${QEMU_RUN} ./crc32_test64; then \ echo ' *** zlib 64-bit test OK ***'; \ else \ echo ' *** zlib 64-bit test FAILED ***'; false; \ -@@ -143,6 +143,9 @@ match.lo: match.S +@@ -139,12 +139,18 @@ match.lo: match.S mv _match.o match.lo rm -f _match.s - + +crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c + - dfltcc.o: $(SRCDIR)contrib/s390/dfltcc.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/dfltcc.c - -@@ -157,6 +160,9 @@ example.o: $(SRCDIR)test/example.c $(SRC + example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c + minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c - + +crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c + example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c - -@@ -162,6 +168,9 @@ adler32.o: $(SRCDIR)adler32.c + +@@ -158,6 +164,9 @@ adler32.o: $(SRCDIR)adler32.c crc32.o: $(SRCDIR)crc32.c $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c @@ -423,7 +430,7 @@ index 3d858aa..1694304 100644 deflate.o: $(SRCDIR)deflate.c $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c -@@ -212,6 +221,11 @@ crc32.lo: $(SRCDIR)crc32.c +@@ -208,6 +217,11 @@ crc32.lo: $(SRCDIR)crc32.c $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -@mv objs/crc32.o $@ @@ -435,7 +442,7 @@ index 3d858aa..1694304 100644 deflate.lo: $(SRCDIR)deflate.c -@mkdir objs 2>/dev/null || test -d objs $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c -@@ -285,18 +299,27 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a +@@ -281,18 +295,27 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a ln -s $@ $(SHAREDLIBM) -@rmdir objs @@ -452,10 +459,10 @@ index 3d858aa..1694304 100644 + $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) + examplesh$(EXE): example.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV) minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV) +crc32_test64$(EXE): crc32_test64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) @@ -463,7 +470,7 @@ index 3d858aa..1694304 100644 example64$(EXE): example64.o $(STATICLIB) $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) -@@ -366,8 +389,8 @@ zconf: $(SRCDIR)zconf.h.in +@@ -362,8 +385,8 @@ zconf: $(SRCDIR)zconf.h.in mostlyclean: clean clean: rm -f *.o *.lo *~ \ @@ -474,7 +481,7 @@ index 3d858aa..1694304 100644 infcover \ libz.* foo.gz so_locations \ _match.s maketree contrib/infback9/*.o -@@ -389,7 +412,7 @@ tags: +@@ -385,7 +408,7 @@ tags: adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h @@ -483,7 +490,7 @@ index 3d858aa..1694304 100644 crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -@@ -399,7 +422,7 @@ trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)tr +@@ -395,7 +418,7 @@ trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)tr adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h @@ -493,10 +500,10 @@ index 3d858aa..1694304 100644 deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h diff --git a/configure b/configure -index 01ffdf6..914d9f4 100755 +index 9ee7008..45d51e5 100755 --- a/configure +++ b/configure -@@ -863,6 +863,9 @@ cat > $test.c < $test.c < @@ -2550,10 +2557,10 @@ index b42c7d6..79123aa 100644 + +unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); diff --git a/crc32.c b/crc32.c -index a1bdce5..ae7b7e7 100644 +index f8357b0..4e5830b 100644 --- a/crc32.c +++ b/crc32.c -@@ -736,6 +736,13 @@ local z_word_t crc_word_big(data) +@@ -745,6 +745,13 @@ local z_word_t crc_word_big(data) #endif /* ========================================================================= */ @@ -2567,7 +2574,7 @@ index a1bdce5..ae7b7e7 100644 unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; -@@ -1057,6 +1064,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) +@@ -1066,6 +1073,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) return crc ^ 0xffffffff; } @@ -2791,13 +2798,12 @@ index 0000000..3155553 + return 0; +} -- -2.34.3 +2.37.3 - -From aae9203a38e8ba5933cde40918f6157cf90e78fb Mon Sep 17 00:00:00 2001 +From e8c61767464de8d063366117f508359e5ca40a50 Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Wed, 25 Mar 2020 12:16:41 -0300 -Subject: [PATCH 3/9] Fix clang's behavior on versions >= 7 +Subject: [PATCH 3/3] Fix clang's behavior on versions >= 7 Clang 7 changed the behavior of vec_xxpermdi in order to match GCC's behavior. After this change, code that used to work on Clang 6 stopped @@ -2855,1509 +2861,5 @@ index b5e7dae..915f7e5 100644 } #endif /* vec_xxpermdi */ -- -2.34.3 - - -From 772f4bd0f880c4c193ab7da78728f38821572a02 Mon Sep 17 00:00:00 2001 -From: Rogerio Alves -Date: Mon, 9 Dec 2019 14:40:53 -0300 -Subject: [PATCH 4/9] Adler32 vector optimization for Power. - -This commit implements a Power (POWER8+) vector optimization for Adler32 -checksum using VSX (vector) instructions. The VSX adler32 checksum is up -to 10x fast than the adler32 baseline code. - -Author: Rogerio Alves ---- - CMakeLists.txt | 1 + - Makefile.in | 8 ++ - adler32.c | 11 ++ - configure | 4 +- - contrib/power/adler32_power8.c | 196 +++++++++++++++++++++++++++++++ - contrib/power/adler32_resolver.c | 15 +++ - contrib/power/power.h | 4 +- - 7 files changed, 236 insertions(+), 3 deletions(-) - create mode 100644 contrib/power/adler32_power8.c - create mode 100644 contrib/power/adler32_resolver.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 581e1fa..c6296ee 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -185,6 +185,7 @@ if(CMAKE_COMPILER_IS_GNUCC) - if(POWER8) - add_definitions(-DZ_POWER8) - set(ZLIB_POWER8 -+ contrib/power/adler32_power8.c - contrib/power/crc32_z_power8.c) - - set_source_files_properties( -diff --git a/Makefile.in b/Makefile.in -index 1694304..a0ffac8 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -165,6 +165,9 @@ minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - adler32.o: $(SRCDIR)adler32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c - -+adler32_power8.o: $(SRCDIR)contrib/power/adler32_power8.c -+ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/adler32_power8.c -+ - crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c - -@@ -216,6 +219,11 @@ adler32.lo: $(SRCDIR)adler32.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c - -@mv objs/adler32.o $@ - -+adler32_power8.lo: $(SRCDIR)contrib/power/adler32_power8.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/adler32_power8.o $(SRCDIR)contrib/power/adler32_power8.c -+ -@mv objs/adler32_power8.o $@ -+ - crc32.lo: $(SRCDIR)crc32.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -diff --git a/adler32.c b/adler32.c -index d0be438..4bde0fa 100644 ---- a/adler32.c -+++ b/adler32.c -@@ -131,6 +131,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) - } - - /* ========================================================================= */ -+ -+#ifdef Z_POWER_OPT -+/* Rename the default function to avoid naming conflicts */ -+#define adler32 adler32_default -+#endif /* Z_POWER_OPT */ -+ - uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; -@@ -139,6 +145,11 @@ uLong ZEXPORT adler32(adler, buf, len) - return adler32_z(adler, buf, len); - } - -+#ifdef Z_POWER_OPT -+#undef adler32 -+#include "contrib/power/adler32_resolver.c" -+#endif /* Z_POWER_OPT */ -+ - /* ========================================================================= */ - local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; -diff --git a/configure b/configure -index 914d9f4..810a740 100755 ---- a/configure -+++ b/configure -@@ -879,8 +879,8 @@ if tryboth $CC -c $CFLAGS $test.c; then - - if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then - POWER8="-DZ_POWER8" -- PIC_OBJC="${PIC_OBJC} crc32_z_power8.lo" -- OBJC="${OBJC} crc32_z_power8.o" -+ PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo" -+ OBJC="${OBJC} adler32_power8.o crc32_z_power8.o" - echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log - else - echo "Checking for -mcpu=power8 support... No." | tee -a configure.log -diff --git a/contrib/power/adler32_power8.c b/contrib/power/adler32_power8.c -new file mode 100644 -index 0000000..473c394 ---- /dev/null -+++ b/contrib/power/adler32_power8.c -@@ -0,0 +1,196 @@ -+/* -+ * Adler32 for POWER 8+ using VSX instructions. -+ * -+ * Calculate adler32 checksum for 16 bytes at once using POWER8+ VSX (vector) -+ * instructions. -+ * -+ * If adler32 do 1 byte at time on the first iteration s1 is s1_0 (_n means -+ * iteration n) is the initial value of adler - at start _0 is 1 unless -+ * adler initial value is different than 1. So s1_1 = s1_0 + c[0] after -+ * the first calculation. For the iteration s1_2 = s1_1 + c[1] and so on. -+ * Hence, for iteration N, s1_N = s1_(N-1) + c[N] is the value of s1 on -+ * after iteration N. -+ * -+ * Therefore, for s2 and iteration N, s2_N = s2_0 + N*s1_N + N*c[0] + -+ * N-1*c[1] + ... + c[N] -+ * -+ * In a more general way: -+ * -+ * s1_N = s1_0 + sum(i=1 to N)c[i] -+ * s2_N = s2_0 + N*s1 + sum (i=1 to N)(N-i+1)*c[i] -+ * -+ * Where s1_N, s2_N are the values for s1, s2 after N iterations. So if we -+ * can process N-bit at time we can do this at once. -+ * -+ * Since VSX can support 16-bit vector instructions, we can process -+ * 16-bit at time using N = 16 we have: -+ * -+ * s1 = s1_16 = s1_(16-1) + c[16] = s1_0 + sum(i=1 to 16)c[i] -+ * s2 = s2_16 = s2_0 + 16*s1 + sum(i=1 to 16)(16-i+1)*c[i] -+ * -+ * After the first iteration we calculate the adler32 checksum for 16 bytes. -+ * -+ * For more background about adler32 please check the RFC: -+ * https://www.ietf.org/rfc/rfc1950.txt -+ * -+ * Copyright (C) 2019 Rogerio Alves , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ * -+ */ -+ -+#include "../../zutil.h" -+#include -+ -+/* Largest prime smaller than 65536. */ -+#define BASE 65521U -+#define NMAX 5552 -+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1. */ -+ -+#define DO1(s1,s2,buf,i) {(s1) += buf[(i)]; (s2) += (s1);} -+#define DO2(s1,s2,buf,i) {DO1(s1,s2,buf,i); DO1(s1,s2,buf,i+1);} -+#define DO4(s1,s2,buf,i) {DO2(s1,s2,buf,i); DO2(s1,s2,buf,i+2);} -+#define DO8(s1,s2,buf,i) {DO4(s1,s2,buf,i); DO4(s1,s2,buf,i+4);} -+#define DO16(s1,s2,buf) {DO8(s1,s2,buf,0); DO8(s1,s2,buf,8);} -+ -+/* Vector across sum unsigned int (saturate). */ -+inline vector unsigned int vec_sumsu (vector unsigned int __a, -+ vector unsigned int __b) -+{ -+ __b = vec_sld(__a, __a, 8); -+ __b = vec_add(__b, __a); -+ __a = vec_sld(__b, __b, 4); -+ __a = vec_add(__a, __b); -+ -+ return __a; -+} -+ -+uLong ZLIB_INTERNAL _adler32_power8 (uLong adler, const Bytef* buf, uInt len) -+{ -+ /* If buffer is empty or len=0 we need to return adler initial value. */ -+ if (buf == NULL) -+ return 1; -+ -+ unsigned int s1 = adler & 0xffff; -+ unsigned int s2 = (adler >> 16) & 0xffff; -+ -+ /* in case user likes doing a byte at a time, keep it fast */ -+ if (len == 1) { -+ s1 += buf[0]; -+ if (s1 >= BASE) -+ s1 -= BASE; -+ s2 += s1; -+ if (s2 >= BASE) -+ s2 -= BASE; -+ return (s2 << 16) | s1; -+ } -+ -+ /* Keep it fast for short length buffers. */ -+ if (len < 16) { -+ while (len--) { -+ s1 += *buf++; -+ s2 += s1; -+ } -+ if (s1 >= BASE) -+ s1 -= BASE; -+ s2 %= BASE; -+ return (s2 << 16) | s1; -+ } -+ -+ /* This is faster than VSX code for len < 64. */ -+ if (len < 64) { -+ while (len >= 16) { -+ len -= 16; -+ DO16(s1,s2,buf); -+ buf += 16; -+ } -+ } else { -+ /* Use POWER VSX instructions for len >= 64. */ -+ const vector unsigned int v_zeros = { 0 }; -+ const vector unsigned char v_mul = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, -+ 6, 5, 4, 3, 2, 1}; -+ const vector unsigned char vsh = vec_splat_u8(4); -+ const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0}; -+ vector unsigned int vs1 = vec_xl(0, &s1); -+ vector unsigned int vs2 = vec_xl(0, &s2); -+ vector unsigned int vs1_save = { 0 }; -+ vector unsigned int vsum1, vsum2; -+ vector unsigned char vbuf; -+ int n; -+ -+ /* Zeros the undefined values of vectors vs1, vs2. */ -+ vs1 = vec_and(vs1, vmask); -+ vs2 = vec_and(vs2, vmask); -+ -+ /* Do length bigger than NMAX in blocks of NMAX size. */ -+ while (len >= NMAX) { -+ len -= NMAX; -+ n = NMAX / 16; -+ do { -+ vbuf = vec_xl(0, (unsigned char *) buf); -+ vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ -+ /* sum(i=1 to 16) buf[i]*(16-i+1). */ -+ vsum2 = vec_msum(vbuf, v_mul, v_zeros); -+ /* Save vs1. */ -+ vs1_save = vec_add(vs1_save, vs1); -+ /* Accumulate the sums. */ -+ vs1 = vec_add(vsum1, vs1); -+ vs2 = vec_add(vsum2, vs2); -+ -+ buf += 16; -+ } while (--n); -+ /* Once each block of NMAX size. */ -+ vs1 = vec_sumsu(vs1, vsum1); -+ vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ -+ vs2 = vec_add(vs1_save, vs2); -+ vs2 = vec_sumsu(vs2, vsum2); -+ -+ /* vs1[0] = (s1_i + sum(i=1 to 16)buf[i]) mod 65521. */ -+ vs1[0] = vs1[0] % BASE; -+ /* vs2[0] = s2_i + 16*s1_save + -+ sum(i=1 to 16)(16-i+1)*buf[i] mod 65521. */ -+ vs2[0] = vs2[0] % BASE; -+ -+ vs1 = vec_and(vs1, vmask); -+ vs2 = vec_and(vs2, vmask); -+ vs1_save = v_zeros; -+ } -+ -+ /* len is less than NMAX one modulo is needed. */ -+ if (len >= 16) { -+ while (len >= 16) { -+ len -= 16; -+ -+ vbuf = vec_xl(0, (unsigned char *) buf); -+ -+ vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ -+ /* sum(i=1 to 16) buf[i]*(16-i+1). */ -+ vsum2 = vec_msum(vbuf, v_mul, v_zeros); -+ /* Save vs1. */ -+ vs1_save = vec_add(vs1_save, vs1); -+ /* Accumulate the sums. */ -+ vs1 = vec_add(vsum1, vs1); -+ vs2 = vec_add(vsum2, vs2); -+ -+ buf += 16; -+ } -+ /* Since the size will be always less than NMAX we do this once. */ -+ vs1 = vec_sumsu(vs1, vsum1); -+ vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ -+ vs2 = vec_add(vs1_save, vs2); -+ vs2 = vec_sumsu(vs2, vsum2); -+ } -+ /* Copy result back to s1, s2 (mod 65521). */ -+ s1 = vs1[0] % BASE; -+ s2 = vs2[0] % BASE; -+ } -+ -+ /* Process tail (len < 16). */ -+ while (len--) { -+ s1 += *buf++; -+ s2 += s1; -+ } -+ s1 %= BASE; -+ s2 %= BASE; -+ -+ return (s2 << 16) | s1; -+} -diff --git a/contrib/power/adler32_resolver.c b/contrib/power/adler32_resolver.c -new file mode 100644 -index 0000000..07a1a2c ---- /dev/null -+++ b/contrib/power/adler32_resolver.c -@@ -0,0 +1,15 @@ -+/* Copyright (C) 2019 Rogerio Alves , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "../gcc/zifunc.h" -+#include "power.h" -+ -+Z_IFUNC(adler32) { -+#ifdef Z_POWER8 -+ if (__builtin_cpu_supports("arch_2_07")) -+ return _adler32_power8; -+#endif -+ -+ return adler32_default; -+} -diff --git a/contrib/power/power.h b/contrib/power/power.h -index 79123aa..f57c761 100644 ---- a/contrib/power/power.h -+++ b/contrib/power/power.h -@@ -2,7 +2,9 @@ - * 2019 Rogerio Alves , IBM - * For conditions of distribution and use, see copyright notice in zlib.h - */ -- - #include "../../zconf.h" -+#include "../../zutil.h" -+ -+uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); - - unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); --- -2.34.3 - - -From f5de1ed4288561443323ba41de68d65b31bc3a19 Mon Sep 17 00:00:00 2001 -From: Rogerio Alves -Date: Tue, 10 Dec 2019 15:04:28 -0300 -Subject: [PATCH 5/9] Tests for Adler32 vector optimization for Power. - -This commit add tests for adler32 vector optimization for Power (POWER8+). - -Author: Rogerio Alves ---- - CMakeLists.txt | 10 ++ - Makefile.in | 36 +++-- - test/adler32_test.c | 339 ++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 378 insertions(+), 10 deletions(-) - create mode 100644 test/adler32_test.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index c6296ee..44de486 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -299,6 +299,10 @@ endif() - # Example binaries - #============================================================================ - -+add_executable(adler32_test test/adler32_test.c) -+target_link_libraries(adler32_test zlib) -+add_test(adler32_test adler32_test) -+ - add_executable(example test/example.c) - target_link_libraries(example zlib) - add_test(example example) -@@ -311,6 +315,12 @@ add_executable(minigzip test/minigzip.c) - target_link_libraries(minigzip zlib) - - if(HAVE_OFF64_T) -+ -+ add_executable(adler32_test64 test/adler32_test.c) -+ target_link_libraries(adler32_test64 zlib) -+ set_target_properties(adler32_test64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") -+ add_test(adler32_test64 adler32_test64) -+ - add_executable(example64 test/example.c) - target_link_libraries(example64 zlib) - set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") -diff --git a/Makefile.in b/Makefile.in -index a0ffac8..9ef9fa9 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -75,11 +75,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) - - all: static shared - --static: crc32_test$(EXE) example$(EXE) minigzip$(EXE) -+static: adler32_test$(EXE) crc32_test$(EXE) example$(EXE) minigzip$(EXE) - --shared: crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) -+shared: adler32_testsh$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) - --all64: crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) -+all64: adler32_test64$(EXE) crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) - - check: test - -@@ -87,7 +87,7 @@ test: all teststatic testshared - - teststatic: static - @TMPST=tmpst_$$; \ -- if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./crc32_test; then \ -+ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST && ./adler32_test && ./crc32_test; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; false; \ -@@ -100,7 +100,7 @@ testshared: shared - DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ - SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - TMPSH=tmpsh_$$; \ -- if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./crc32_testsh; then \ -+ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH && ./adler32_testsh && ./crc32_testsh; then \ - echo ' *** zlib shared test OK ***'; \ - else \ - echo ' *** zlib shared test FAILED ***'; false; \ -@@ -109,7 +109,7 @@ testshared: shared - - test64: all64 - @TMP64=tmp64_$$; \ -- if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./crc32_test64; then \ -+ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64 && ./adler32_test64 && ./crc32_test64; then \ - echo ' *** zlib 64-bit test OK ***'; \ - else \ - echo ' *** zlib 64-bit test FAILED ***'; false; \ -@@ -143,6 +143,9 @@ match.lo: match.S - mv _match.o match.lo - rm -f _match.s - -+adler32_test.o: $(SRCDIR)test/adler32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/adler32_test.c -+ - crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c - -@@ -152,6 +155,9 @@ example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c - -+adler32_test64.o: $(SRCDIR)test/adler32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/adler32_test.c -+ - crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c - -@@ -307,6 +313,9 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a - ln -s $@ $(SHAREDLIBM) - -@rmdir objs - -+adler32_test$(EXE): adler32_test.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ adler32_test.o $(TEST_LDFLAGS) -+ - crc32_test$(EXE): crc32_test.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ crc32_test.o $(TEST_LDFLAGS) - -@@ -316,6 +325,9 @@ example$(EXE): example.o $(STATICLIB) - minigzip$(EXE): minigzip.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) - -+adler32_testsh$(EXE): adler32_test.o $(SHAREDLIBV) -+ $(CC) $(CFLAGS) -o $@ adler32_test.o -L. $(SHAREDLIBV) -+ - crc32_testsh$(EXE): crc32_test.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) - -@@ -325,6 +337,9 @@ examplesh$(EXE): example.o $(SHAREDLIBV) - minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) - -+adler32_test64$(EXE): adler32_test64.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ adler32_test64.o $(TEST_LDFLAGS) -+ - crc32_test64$(EXE): crc32_test64.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) - -@@ -397,8 +412,9 @@ zconf: $(SRCDIR)zconf.h.in - mostlyclean: clean - clean: - rm -f *.o *.lo *~ \ -- crc32_test$(EXE) example$(EXE) minigzip$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -- crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ -+ adler32_test$(EXE) crc32_test$(EXE) example$(EXE) minigzip$(EXE) \ -+ adler32_testsh$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -+ adler32_test64$(EXE) crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ - infcover \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o -@@ -418,7 +434,7 @@ distclean: clean zconf zconf.h.cmakein - tags: - etags $(SRCDIR)*.[ch] - --adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -+adler32.o adler32_test.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h - compress.o crc32_test.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h - crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h -@@ -428,7 +444,7 @@ inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR - inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h - trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h - --adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h -+adler32.lo adler32_test.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h - compress.lo crc32_test.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h - crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h -diff --git a/test/adler32_test.c b/test/adler32_test.c -new file mode 100644 -index 0000000..6cf3e2b ---- /dev/null -+++ b/test/adler32_test.c -@@ -0,0 +1,339 @@ -+/* adler32_test.c -- unit test for adler32 in the zlib compression library -+ * Copyright (C) 2019 Rogerio Alves , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "zlib.h" -+#include -+ -+#ifdef STDC -+# include -+# include -+#endif -+ -+void test_adler32 OF((uLong adler, Byte* buf, z_size_t len, uLong chk, int line)); -+int main OF((void)); -+ -+typedef struct { -+ int line; -+ uLong adler; -+ Byte* buf; -+ int len; -+ uLong expect; -+} adler32_test; -+ -+void test_adler32(adler, buf, len, chk, line) -+ uLong adler; -+ Byte *buf; -+ z_size_t len; -+ uLong chk; -+ int line; -+{ -+ uLong res = adler32(adler, buf, len); -+ if (res != chk) { -+ fprintf(stderr, "FAIL [%d]: adler32 returned 0x%08X expected 0x%08X\n", -+ line, (unsigned int)res, (unsigned int)chk); -+ exit(1); -+ } -+} -+ -+static const adler32_test tests[] = { -+ {__LINE__,0x1, 0x0, 0, 0x1}, -+ {__LINE__,0x1, "", 1, 0x10001}, -+ {__LINE__,0x1, "a", 1, 0x620062}, -+ {__LINE__,0x1, "abacus", 6, 0x8400270}, -+ {__LINE__,0x1, "backlog", 7, 0xb1f02d4}, -+ {__LINE__,0x1, "campfire", 8, 0xea10348}, -+ {__LINE__,0x1, "delta", 5, 0x61a020b}, -+ {__LINE__,0x1, "executable", 10, 0x16fa0423}, -+ {__LINE__,0x1, "file", 4, 0x41401a1}, -+ {__LINE__,0x1, "greatest", 8, 0xefa0360}, -+ {__LINE__,0x1, "inverter", 8, 0xf6f0370}, -+ {__LINE__,0x1, "jigsaw", 6, 0x8bd0286}, -+ {__LINE__,0x1, "karate", 6, 0x8a50279}, -+ {__LINE__,0x1, "landscape", 9, 0x126a03ac}, -+ {__LINE__,0x1, "machine", 7, 0xb5302d6}, -+ {__LINE__,0x1, "nanometer", 9, 0x12d803ca}, -+ {__LINE__,0x1, "oblivion", 8, 0xf220363}, -+ {__LINE__,0x1, "panama", 6, 0x8a1026f}, -+ {__LINE__,0x1, "quest", 5, 0x6970233}, -+ {__LINE__,0x1, "resource", 8, 0xf8d0369}, -+ {__LINE__,0x1, "secret", 6, 0x8d10287}, -+ {__LINE__,0x1, "ultimate", 8, 0xf8d0366}, -+ {__LINE__,0x1, "vector", 6, 0x8fb0294}, -+ {__LINE__,0x1, "walrus", 6, 0x918029f}, -+ {__LINE__,0x1, "xeno", 4, 0x45e01bb}, -+ {__LINE__,0x1, "yelling", 7, 0xbfe02f5}, -+ {__LINE__,0x1, "zero", 4, 0x46e01c1}, -+ {__LINE__,0x1, "4BJD7PocN1VqX0jXVpWB", 20, 0x3eef064d}, -+ {__LINE__,0x1, "F1rPWI7XvDs6nAIRx41l", 20, 0x425d065f}, -+ {__LINE__,0x1, "ldhKlsVkPFOveXgkGtC2", 20, 0x4f1a073e}, -+ {__LINE__,0x1, "5KKnGOOrs8BvJ35iKTOS", 20, 0x42290650}, -+ {__LINE__,0x1, "0l1tw7GOcem06Ddu7yn4", 20, 0x43fd0690}, -+ {__LINE__,0x1, "MCr47CjPIn9R1IvE1Tm5", 20, 0x3f770609}, -+ {__LINE__,0x1, "UcixbzPKTIv0SvILHVdO", 20, 0x4c7c0703}, -+ {__LINE__,0x1, "dGnAyAhRQDsWw0ESou24", 20, 0x48ac06b7}, -+ {__LINE__,0x1, "di0nvmY9UYMYDh0r45XT", 20, 0x489a0698}, -+ {__LINE__,0x1, "2XKDwHfAhFsV0RhbqtvH", 20, 0x44a906e6}, -+ {__LINE__,0x1, "ZhrANFIiIvRnqClIVyeD", 20, 0x4a29071c}, -+ {__LINE__,0x1, "v7Q9ehzioTOVeDIZioT1", 20, 0x4a7706f9}, -+ {__LINE__,0x1, "Yod5hEeKcYqyhfXbhxj2", 20, 0x4ce60769}, -+ {__LINE__,0x1, "GehSWY2ay4uUKhehXYb0", 20, 0x48ae06e5}, -+ {__LINE__,0x1, "kwytJmq6UqpflV8Y8GoE", 20, 0x51d60750}, -+ {__LINE__,0x1, "70684206568419061514", 20, 0x2b100414}, -+ {__LINE__,0x1, "42015093765128581010", 20, 0x2a550405}, -+ {__LINE__,0x1, "88214814356148806939", 20, 0x2b450423}, -+ {__LINE__,0x1, "43472694284527343838", 20, 0x2b460421}, -+ {__LINE__,0x1, "49769333513942933689", 20, 0x2bc1042b}, -+ {__LINE__,0x1, "54979784887993251199", 20, 0x2ccd043d}, -+ {__LINE__,0x1, "58360544869206793220", 20, 0x2b68041a}, -+ {__LINE__,0x1, "27347953487840714234", 20, 0x2b84041d}, -+ {__LINE__,0x1, "07650690295365319082", 20, 0x2afa0417}, -+ {__LINE__,0x1, "42655507906821911703", 20, 0x2aff0412}, -+ {__LINE__,0x1, "29977409200786225655", 20, 0x2b8d0420}, -+ {__LINE__,0x1, "85181542907229116674", 20, 0x2b140419}, -+ {__LINE__,0x1, "87963594337989416799", 20, 0x2c8e043f}, -+ {__LINE__,0x1, "21395988329504168551", 20, 0x2b68041f}, -+ {__LINE__,0x1, "51991013580943379423", 20, 0x2af10417}, -+ {__LINE__,0x1, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x7c9d0841}, -+ {__LINE__,0x1, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x71060751}, -+ {__LINE__,0x1, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x7095070a}, -+ {__LINE__,0x1, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x82530815}, -+ {__LINE__,0x1, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x61250661}, -+ {__LINE__,0x1, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x642006a3}, -+ {__LINE__,0x1, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x674206cb}, -+ {__LINE__,0x1, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x67670680}, -+ {__LINE__,0x1, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0x7547070f}, -+ {__LINE__,0x1, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x69ea06ee}, -+ {__LINE__,0x1, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x1b01e92}, -+ {__LINE__,0x1, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xfbdb1e96}, -+ {__LINE__,0x1, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0x47a61ec8}, -+ {__LINE__,0x1, "qjdwq48mBukJVUzVVfMjiqSWL5GnFSPQQDi6mE9ZaAPh9drb5tXUULwqekEH6W7kAxNQRkdV5ynU" -+ "NWQYiW59RpDCxpuhCamrznzAdJ6uNerx7Q3vVhHSHSfKfeET9JfKwtxJ2y7BxXXpGbTg3kU6EZMtJ" -+ "qvnST6x5x4PzpMFVbdmfGnJmwzK8aqEDeb3hBVgy3PL58rzXbQgH7LcZB3C4ytukzhvCYpp8Hv5Xw" -+ "4LRVV4UC84TEaNZS7UuzfHpPJuYZhT6evzVFhuyHbkJMf36gyLEWtBBdd9uMZkFGfhqk5kfrM7cM7" -+ "ynu8bd7QfEmFKxWfB2F85qzy3RiUmXkhNJyBChux4fkJ56XTWh8J4mKpN3gCgAEeZxAP2E4tQ5XYj" -+ "6mbhGav6tv6CMGPuBCAVb29d2c5abXwVG6a7c8G6KUQmwPV5NxbvxENCANtvNBzXBRqUniAQdmaD7" -+ "Yf3J8YmwZbwrHqEjcuEiiSbnGPaFjcRDDGFviaiM7BewmLEF2Y447YCtyq72VGmmEeVumLpRXWzVK" -+ "EkpVrJdN3tiuSVw2wUQ3Fq4hqkB7RXBFQZbb4EKvTBwkVCxdKgNSukp9zwcyUMVE2YPFh9Tyhwb9P" -+ "wGcWWkjJQNBUG69UbvaN9NCGnxR69QChejPUhURi4TBW5wmJpe7r9tc9ZjprFCeUPxTAN76aiyewF" -+ "CXHYGCqqmAt7zuDSLUCf7etGVFucx5M7NiM6h2nHShKMdTzXdxx4qzdDa2XrprRmUUySHcaFeZaUP" -+ "9VJeqjYMxevK7MPN2b6fPhH4UXknfQM99aJNewyfFPpaFYaMLWiTMB3UvXvGp7afu4SyX9ggbBGci" -+ "MUnma7qf9nQ2VL6eTR249d6QBYq249GQEbY5u2TQGL5n4Y2yGFjc8MGLe3aNvAAWtRS2iDR8jdQ36" -+ "CVMewjUZwM4bm8JPQLPRcrbVC3N8K4dWDNUAA2JpbDdpjNCkAjBacuvLXUB4UXWeCbCudAvUzPtDe" -+ "5yYcxK47jeeDM5KBQ6dpTTRjMEEMrN687qxFSxEU4dB65WCemJe5jwVJwvd7vfKum8hWTeQjM8RYd" -+ "BR2rFj7dEqVkejP93XRpRbAv74AM2krE7X37k5cB7W5uJBQR2V7hQh9gGyccxMz7G2Jwvj59EbkzW" -+ "TCb4KRXTkVSG2jd6yE4PHKwamFZx9ji2dXua4aMz8ppzgtH5YLQcRFmEnGXdf7x8jgJzDSaShy5hY" -+ "NpwYWhENv8QDWZkferZD7RDT2HXzGXfvEzPvUHe4RWUxtt4wprzK9fghPrfvkhce58aLFJMGRaNqS" -+ "gWe7RKRABz6vSpwnexkErjfYx89zeT6EGv9fDANvyU7DM2E5WG6b9qgYFfkqQExYCRG6Rh4JdUDb9" -+ "b8rfVdgb2zZdmXvjYdwK8GrvjNychu5zgJHaZbzGCrPfyP6FPh79w7yR3nEhGD4mYEqkafaRBqtWE" -+ "TpH7kX2dX6WnHmwMiYMEF5RppycbqR9YtT7wuKMQznP7gx6R4xNvwM6jKv7aY4aM6nz3E2VN4iEfu" -+ "WJWe83QeaFPc3PkizdqmqMad8D3FMedEjzVedzHDJ8XgEiuc7AwSJ2Ae8rqCm99ag2yyPMe83Trm8" -+ "jvrpMZYga92dHBm946aZVuSHg3XhiN3BSEk9k29RAi3LXMBS4SFFFwudMT9KB7RUR8D8T5UtERxnx" -+ "hvkBNkEUTtpruZhtE4iPzfzqMpfAK2DtjfcYENMxkg7TU2cdVg2zLijYqbTAyvatN5tZ5nDayGnPx" -+ "VkM8tJZGg59RhPPJNXpGJp2yAvdGUz3VMyqUNMYpBZUhjqzqxw7dJQuFq3m9cQWd67bVM7Pjrk9hR" -+ "zmbiBuEL9kvhhW2KeMUQpAQYJGETULfqG4zKKyaUWKDPcNDVSY6TpRyyJaTJWQ9pFPXyk9zz4Gdaz" -+ "Xnh4JPWVDrUma8abXFJXL4SX5WpWhyxBfdCXw7rgVTHai4Nvcwn23AiAJ9Ncz7nn3nhniRibEhkUc" -+ "cU6fxqNyHMeJBUBrga8VaGVyuccvCHWygzQ24kSmfeGHvQ3PefSVPcUe3Pxdc7cfgDw2tqyg2QV4K" -+ "aQgBbLx9maK4ixgQM9WN2wpv2kBy9kAcfZDRASdvwffqtK3jxDGPnurvUkA2dRNTG4Bgkth7JkFAC" -+ "gWgJFzSQcvMbDeHQSjvGERkfiPEFN6ypbtMcQB7gwJ73dVEmz66PPdirJHDHJrbnvzWeugBuZ2mD5" -+ "hFXB2r6wuY4NXKavV3jBrrCcwRgS8VbF2NMcK8YEENKXKVBxnQpaqfktzYEPZynacBVaxbdXrd8PH" -+ "FvrV5gJw6ihddpJccYSqWmU5GbHNzEZKEyMcGidwZDNNwStgyaYbHeMNfYY7a9bMUkaVkCnakUHAM" -+ "ivktadi3Fd52ApUcJURhGdAYvqXcwrx4j34bFdaLNJ3Zg6WQRuPtMA3F6yKYG2tvupwbGSK5p4dEw" -+ "6gtV4b2nbZ33fmd2camjXUED66FwH97ZYdXCKigpFYn2bF4RuVkfdJiabXH7vKaQiWMjMiainFhrq" -+ "4wxm4qyF8wi4DBALBUuKvKnaQiekvQU5wQcrA6MwygnevK7Wu2yfQueryawVpfQzCuii9SPqLrCHS" -+ "3Ep8SmQSKrVbJRmwcnQNQ4MufXSfUZxU4jK4GzX7QjRhiGmqcVTxUaEbQqEiFK7KiRJ5YFVB7R8Mi" -+ "fjZwjbBupNYrSrfhEJTBPRDVKAZARjzfBiYLFGVYwRCPGm97C5eywNKNaQjaW32fGwnM6FuK8g8MG" -+ "re9Zzy2GUkG6mAD4nb8aqSmS65R5D5SBgXT8QVdAngy8ah7K9HDJFwG4wTJFfi8XeBJKH7VyX7E8S" -+ "AdbwS8YaJdjEVJTEUR57VMEvD3z5rkzvemA7P8jXEfQq8Dgy8jAeBccMzk2cqvvyQyhgpvMmmCGDk" -+ "8uTnQHGHfbJj5Xci77qbR8bbzffhYQ7uBXeijMqCTMvtJJwbFvJme2ue8LVGqAjm7mgm5irppUyF6" -+ "fbu6qLMEtVWCtepwanwyXh8eGCHqrXG9ch7k8MGbamYQw8JzaFr4WMjPqazUyu3bZfY57gNMhMa3C" -+ "K66fapifqkTizwfZcHLXg6mgrwYuK8Lp8PRARAbZVaxVcGAHtY6PTLWNzgzkdEvCtZMZK4w95DWfU" -+ "85u6b5B8gyCEQze9pNSPDDfxkZ4RvXVkpbntcFRex9CDJ26fZDwJRjj9bwNNpRfZzjFrQeFxftVVA" -+ "yJGWZHrD5MuHVLNUVXzj9rvedRcuVxrc6kLhqwUWQgGFCtEaDhx95PRZEM5f42tA6frXGXYB8GEnB" -+ "vxfMRfBzY32qzGtPC66rzJrcnd6hewDDhVLuib5KdSy9NpErDkBzuvdQpK5mJrbYZ7pMJFEqxfEKU" -+ "U4fa6g5aqDU8FyRaP55xz6VTPDmy7U5CA7Qhwr6xgQibKFpBXQhiErCzvxWQ6p6bMKVxukdRSkQpn" -+ "hdQYxnx5Kt5wA5pkFzWpjUyVxGmyLAXHGAaJ5EPqEU7p6A9ndGDgihtWbcE2PdyJMu4gPSXJvw3vD" -+ "qUiUTqEY52tbjP2jD9yiB5Y3XLwmVXzXrZdHLAHkRX5iLmq3paGPjghRPYUzM5RMAEQVcwr4MSkND" -+ "iRRxtqTiuNKRxZKagGy9cjJS93HTfFq6DWFKheppbqNkACmyuBJvqDejeb2wRtJNjFTA8LmXiTgjc" -+ "V4Vh2hRp29kccGDhztihtWRnYi8u6G9TP99JPYRhXKzhLWrCU2LTk2m6WLPTZztiH5GwtEvzkbHbb" -+ "WWubihCQnHNu5uKXrMWU3YkP2kxfxCwzzbG8yWejv2vrtqzpYdw6ZDJL9FzGU4a8H6Uaq7yQJvmDP" -+ "Sjqvtntgj3t8fKK7bWdFiNKaRVVVvmAQ2yjctfkj7XyjbUFwW396ASJpq2Z7Lpb7b5iprrhPMhjcy" -+ "euhBd99ufdgupwu9ScLUgAyVFV6DDXiVmuYPJvLTAFMQHZ6v8pALPzCVaChXjW8GzjdM4uxwHgVqK" -+ "zbg23DNyGXFTvTLyvL9gcCR8LA7YNtnR6bnm9ihtTFaVNJJ3JqpW7bTGrMka7DHvyTACUPuqLRY4q" -+ "hyfFJxK7NBv3aZMtUx89VEtjKruYYAuwY2yQzSnJB2tXxKzg6dni7ZNFQ6wNrbkdWXStcUm642ew6" -+ "xZaQA74hHzreJqjw4qciR4xnrjrPgE7tkbZrAbdgiGVDEULbJUq2SKmAULkQ4NpkGC6RZByBBjyxL" -+ "dhLG6xHzT5dY42mqQyH6cNumUviYZ74LKFbv2Yhx8aRwqxEaTymC2QUTDQvuM9D8r8bmpE7CT9BAG" -+ "kbGzZGLNkh3kJefdxF8WK7T6hHVChPuHevwzPKrDGXZBXfHQ4eDyWZ64KAeaFSNhxSWJcEPgjawTm" -+ "ZXEPYRM2R2XNFXYWxzpJgnD4ip6Nr9GkEhThUhxBQ9H7wUPQdG6qpjjvCaXJNGYwfHCxFkz39rh87" -+ "5ViVCRqxN22iWFU7THfzEanuQtUYGt3Amr6dfenezFuUN8mhpRNSH66VMStqPEiuyg8LQYYGeWWCG" -+ "ybytuPRP5mNKBZwftkx3LbqdwSGEhRF4qe56F2nqTRyfnYh2FuxMiihwGCZviCaXUCY8dhRxVnvGi" -+ "DaUpUaebFwPdXnKh9Hrbg2fmXkmq6n5bGHdR9DUcrZYWSZxptxy4kjFUtCieibpe4Czh335QPnGiA" -+ "8cQzBaV42B2zuu3iLwygKHky2Bbe5e4eU4znPzacEfuMGCgzj4E7RtDKctpgWHCHJQJcF54WK7jhA" -+ "TKztSffjCc8n7cTURQE7AWZzK5j2HkajggWw4TA9JUeSNPKdkLQGZeWiHujCz4E2v5Lu9Za9AbCMG" -+ "XBC2YZeUnE5YnyFhHp9jYFVwYr8QfCJ4TtzQNMe743yEMmbSchwaXEdEzth9kpAkKHxqKZBua93UU" -+ "u8EDvykWYXkrRDXnQVdeDgxEVYwkmKrHDt26NUg3tB9tuMDzYKzKrV5iepMdtw6affWkLigMVMYbx" -+ "e4hhYgwZmee6RWMxGyVn6egAgKaN7pauE46MtXhgbjp5xxBP3JM7jZPyeQZetj3tFVxmbbByJLL93" -+ "Ra5jSVte26mHwrwr6Q3xzmAdxtEHcZxcPjruUWk6gXgnfn7HMBtv6vxgMfe2wmydHSqcKUH2XhdpQ" -+ "7JXiXfazVAF28zvhChe4gzwzhqp6Bnm8hWU7zhT6Jf4ZnQWz2N4tg7u4X2CFLnJnmj3P3YeJRAHeR" -+ "Dz7uXYyDwJmGUPH5SdaFFYcMf33LvVBUCAdNHQh784rpGvMDH7eEriKQiBDMZpcRGucHaNkEf9R7x" -+ "635ux3hvp6qrjufWTqPnYLB6UwP2TWRg233eNVajbe4TuJuuFBDGHxxk5Ge34BmLSbitTpMDZAAir" -+ "Jp4HUAGydQ5URF8qaSHn5z9g3uRHmGmbpcLZYumiKAQRTXGtb8776wMNfRGrLmqn75kX8guK7YwKq" -+ "UeWAriZapqL5PuntyGxCNXqPrUvArrqefczM7N6azZatfp4vJYjhMDtkABpQAyxX7pS8mMyKBA527" -+ "byRKqAu3J", 5552, 0x8b81718f}, -+ {__LINE__,0x7a30360d, 0x0, 0, 0x1}, -+ {__LINE__,0x6fd767ee, "", 1, 0xd7c567ee}, -+ {__LINE__,0xefeb7589, "a", 1, 0x65e475ea}, -+ {__LINE__,0x61cf7e6b, "abacus", 6, 0x60b880da}, -+ {__LINE__,0xdc712e2, "backlog", 7, 0x9d0d15b5}, -+ {__LINE__,0xad23c7fd, "campfire", 8, 0xfbfecb44}, -+ {__LINE__,0x85cb2317, "delta", 5, 0x3b622521}, -+ {__LINE__,0x9eed31b0, "executable", 10, 0xa6db35d2}, -+ {__LINE__,0xb94f34ca, "file", 4, 0x9096366a}, -+ {__LINE__,0xab058a2, "greatest", 8, 0xded05c01}, -+ {__LINE__,0x5bff2b7a, "inverter", 8, 0xc7452ee9}, -+ {__LINE__,0x605c9a5f, "jigsaw", 6, 0x7899ce4}, -+ {__LINE__,0x51bdeea5, "karate", 6, 0xf285f11d}, -+ {__LINE__,0x85c21c79, "landscape", 9, 0x98732024}, -+ {__LINE__,0x97216f56, "machine", 7, 0xadf4722b}, -+ {__LINE__,0x18444af2, "nanometer", 9, 0xcdb34ebb}, -+ {__LINE__,0xbe6ce359, "oblivion", 8, 0xe8b7e6bb}, -+ {__LINE__,0x843071f1, "panama", 6, 0x389e745f}, -+ {__LINE__,0xf2480c60, "quest", 5, 0x36c90e92}, -+ {__LINE__,0x2d2feb3d, "resource", 8, 0x9705eea5}, -+ {__LINE__,0x7490310a, "secret", 6, 0xa3a63390}, -+ {__LINE__,0x97d247d4, "ultimate", 8, 0xe6154b39}, -+ {__LINE__,0x93cf7599, "vector", 6, 0x5e87782c}, -+ {__LINE__,0x73c84278, "walrus", 6, 0xbc84516}, -+ {__LINE__,0x228a87d1, "xeno", 4, 0x4646898b}, -+ {__LINE__,0xa7a048d0, "yelling", 7, 0xb1654bc4}, -+ {__LINE__,0x1f0ded40, "zero", 4, 0xd8a4ef00}, -+ {__LINE__,0xa804a62f, "4BJD7PocN1VqX0jXVpWB", 20, 0xe34eac7b}, -+ {__LINE__,0x508fae6a, "F1rPWI7XvDs6nAIRx41l", 20, 0x33f2b4c8}, -+ {__LINE__,0xe5adaf4f, "ldhKlsVkPFOveXgkGtC2", 20, 0xe7b1b68c}, -+ {__LINE__,0x67136a40, "5KKnGOOrs8BvJ35iKTOS", 20, 0xf6a0708f}, -+ {__LINE__,0xb00c4a10, "0l1tw7GOcem06Ddu7yn4", 20, 0xbd8f509f}, -+ {__LINE__,0x2e0c84b5, "MCr47CjPIn9R1IvE1Tm5", 20, 0xcc298abd}, -+ {__LINE__,0x81238d44, "UcixbzPKTIv0SvILHVdO", 20, 0xd7809446}, -+ {__LINE__,0xf853aa92, "dGnAyAhRQDsWw0ESou24", 20, 0x9525b148}, -+ {__LINE__,0x5a692325, "di0nvmY9UYMYDh0r45XT", 20, 0x620029bc}, -+ {__LINE__,0x3275b9f, "2XKDwHfAhFsV0RhbqtvH", 20, 0x70916284}, -+ {__LINE__,0x38371feb, "ZhrANFIiIvRnqClIVyeD", 20, 0xd52706}, -+ {__LINE__,0xafc8bf62, "v7Q9ehzioTOVeDIZioT1", 20, 0xeeb4c65a}, -+ {__LINE__,0x9b07db73, "Yod5hEeKcYqyhfXbhxj2", 20, 0xde3e2db}, -+ {__LINE__,0xe75b214, "GehSWY2ay4uUKhehXYb0", 20, 0x4171b8f8}, -+ {__LINE__,0x72d0fe6f, "kwytJmq6UqpflV8Y8GoE", 20, 0xa66a05cd}, -+ {__LINE__,0xf857a4b1, "70684206568419061514", 20, 0x1f9a8c4}, -+ {__LINE__,0x54b8e14, "42015093765128581010", 20, 0x49c19218}, -+ {__LINE__,0xd6aa5616, "88214814356148806939", 20, 0xbbfc5a38}, -+ {__LINE__,0x11e63098, "43472694284527343838", 20, 0x93434b8}, -+ {__LINE__,0xbe92385, "49769333513942933689", 20, 0xfe1827af}, -+ {__LINE__,0x49511de0, "54979784887993251199", 20, 0xcba8221c}, -+ {__LINE__,0x3db13bc1, "58360544869206793220", 20, 0x14643fda}, -+ {__LINE__,0xbb899bea, "27347953487840714234", 20, 0x1604a006}, -+ {__LINE__,0xf6cd9436, "07650690295365319082", 20, 0xb69f984c}, -+ {__LINE__,0x9109e6c3, "42655507906821911703", 20, 0xc43eead4}, -+ {__LINE__,0x75770fc, "29977409200786225655", 20, 0x707751b}, -+ {__LINE__,0x69b1d19b, "85181542907229116674", 20, 0xf5bdd5b3}, -+ {__LINE__,0xc6132975, "87963594337989416799", 20, 0x2fed2db3}, -+ {__LINE__,0xd58cb00c, "21395988329504168551", 20, 0xc2a2b42a}, -+ {__LINE__,0xb63b8caa, "51991013580943379423", 20, 0xdf0590c0}, -+ {__LINE__,0x8a45a2b8, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x1980aaf8}, -+ {__LINE__,0xcbe95b78, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xf58662c8}, -+ {__LINE__,0x4ef8a54b, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x1f65ac54}, -+ {__LINE__,0x76ad267a, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x7b792e8e}, -+ {__LINE__,0x569e613c, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x1d61679c}, -+ {__LINE__,0x36aa61da, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x12ec687c}, -+ {__LINE__,0xf67222df, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x740329a9}, -+ {__LINE__,0x74b34fd3, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x374c5652}, -+ {__LINE__,0x351fd770, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xeadfde7e}, -+ {__LINE__,0xc45aef77, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x3fcbf664}, -+ {__LINE__,0xd034ea71, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x6b080911}, -+ {__LINE__,0xdeadc0de, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0x355fdf73}, -+ {__LINE__,0xba5eba11, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xb48bd8d8}, -+ {__LINE__,0x7712aa45, "qjdwq48mBukJVUzVVfMjiqSWL5GnFSPQQDi6mE9ZaAPh9drb5tXUULwqekEH6W7kAxNQRkdV5ynU" -+ "NWQYiW59RpDCxpuhCamrznzAdJ6uNerx7Q3vVhHSHSfKfeET9JfKwtxJ2y7BxXXpGbTg3kU6EZMtJ" -+ "qvnST6x5x4PzpMFVbdmfGnJmwzK8aqEDeb3hBVgy3PL58rzXbQgH7LcZB3C4ytukzhvCYpp8Hv5Xw" -+ "4LRVV4UC84TEaNZS7UuzfHpPJuYZhT6evzVFhuyHbkJMf36gyLEWtBBdd9uMZkFGfhqk5kfrM7cM7" -+ "ynu8bd7QfEmFKxWfB2F85qzy3RiUmXkhNJyBChux4fkJ56XTWh8J4mKpN3gCgAEeZxAP2E4tQ5XYj" -+ "6mbhGav6tv6CMGPuBCAVb29d2c5abXwVG6a7c8G6KUQmwPV5NxbvxENCANtvNBzXBRqUniAQdmaD7" -+ "Yf3J8YmwZbwrHqEjcuEiiSbnGPaFjcRDDGFviaiM7BewmLEF2Y447YCtyq72VGmmEeVumLpRXWzVK" -+ "EkpVrJdN3tiuSVw2wUQ3Fq4hqkB7RXBFQZbb4EKvTBwkVCxdKgNSukp9zwcyUMVE2YPFh9Tyhwb9P" -+ "wGcWWkjJQNBUG69UbvaN9NCGnxR69QChejPUhURi4TBW5wmJpe7r9tc9ZjprFCeUPxTAN76aiyewF" -+ "CXHYGCqqmAt7zuDSLUCf7etGVFucx5M7NiM6h2nHShKMdTzXdxx4qzdDa2XrprRmUUySHcaFeZaUP" -+ "9VJeqjYMxevK7MPN2b6fPhH4UXknfQM99aJNewyfFPpaFYaMLWiTMB3UvXvGp7afu4SyX9ggbBGci" -+ "MUnma7qf9nQ2VL6eTR249d6QBYq249GQEbY5u2TQGL5n4Y2yGFjc8MGLe3aNvAAWtRS2iDR8jdQ36" -+ "CVMewjUZwM4bm8JPQLPRcrbVC3N8K4dWDNUAA2JpbDdpjNCkAjBacuvLXUB4UXWeCbCudAvUzPtDe" -+ "5yYcxK47jeeDM5KBQ6dpTTRjMEEMrN687qxFSxEU4dB65WCemJe5jwVJwvd7vfKum8hWTeQjM8RYd" -+ "BR2rFj7dEqVkejP93XRpRbAv74AM2krE7X37k5cB7W5uJBQR2V7hQh9gGyccxMz7G2Jwvj59EbkzW" -+ "TCb4KRXTkVSG2jd6yE4PHKwamFZx9ji2dXua4aMz8ppzgtH5YLQcRFmEnGXdf7x8jgJzDSaShy5hY" -+ "NpwYWhENv8QDWZkferZD7RDT2HXzGXfvEzPvUHe4RWUxtt4wprzK9fghPrfvkhce58aLFJMGRaNqS" -+ "gWe7RKRABz6vSpwnexkErjfYx89zeT6EGv9fDANvyU7DM2E5WG6b9qgYFfkqQExYCRG6Rh4JdUDb9" -+ "b8rfVdgb2zZdmXvjYdwK8GrvjNychu5zgJHaZbzGCrPfyP6FPh79w7yR3nEhGD4mYEqkafaRBqtWE" -+ "TpH7kX2dX6WnHmwMiYMEF5RppycbqR9YtT7wuKMQznP7gx6R4xNvwM6jKv7aY4aM6nz3E2VN4iEfu" -+ "WJWe83QeaFPc3PkizdqmqMad8D3FMedEjzVedzHDJ8XgEiuc7AwSJ2Ae8rqCm99ag2yyPMe83Trm8" -+ "jvrpMZYga92dHBm946aZVuSHg3XhiN3BSEk9k29RAi3LXMBS4SFFFwudMT9KB7RUR8D8T5UtERxnx" -+ "hvkBNkEUTtpruZhtE4iPzfzqMpfAK2DtjfcYENMxkg7TU2cdVg2zLijYqbTAyvatN5tZ5nDayGnPx" -+ "VkM8tJZGg59RhPPJNXpGJp2yAvdGUz3VMyqUNMYpBZUhjqzqxw7dJQuFq3m9cQWd67bVM7Pjrk9hR" -+ "zmbiBuEL9kvhhW2KeMUQpAQYJGETULfqG4zKKyaUWKDPcNDVSY6TpRyyJaTJWQ9pFPXyk9zz4Gdaz" -+ "Xnh4JPWVDrUma8abXFJXL4SX5WpWhyxBfdCXw7rgVTHai4Nvcwn23AiAJ9Ncz7nn3nhniRibEhkUc" -+ "cU6fxqNyHMeJBUBrga8VaGVyuccvCHWygzQ24kSmfeGHvQ3PefSVPcUe3Pxdc7cfgDw2tqyg2QV4K" -+ "aQgBbLx9maK4ixgQM9WN2wpv2kBy9kAcfZDRASdvwffqtK3jxDGPnurvUkA2dRNTG4Bgkth7JkFAC" -+ "gWgJFzSQcvMbDeHQSjvGERkfiPEFN6ypbtMcQB7gwJ73dVEmz66PPdirJHDHJrbnvzWeugBuZ2mD5" -+ "hFXB2r6wuY4NXKavV3jBrrCcwRgS8VbF2NMcK8YEENKXKVBxnQpaqfktzYEPZynacBVaxbdXrd8PH" -+ "FvrV5gJw6ihddpJccYSqWmU5GbHNzEZKEyMcGidwZDNNwStgyaYbHeMNfYY7a9bMUkaVkCnakUHAM" -+ "ivktadi3Fd52ApUcJURhGdAYvqXcwrx4j34bFdaLNJ3Zg6WQRuPtMA3F6yKYG2tvupwbGSK5p4dEw" -+ "6gtV4b2nbZ33fmd2camjXUED66FwH97ZYdXCKigpFYn2bF4RuVkfdJiabXH7vKaQiWMjMiainFhrq" -+ "4wxm4qyF8wi4DBALBUuKvKnaQiekvQU5wQcrA6MwygnevK7Wu2yfQueryawVpfQzCuii9SPqLrCHS" -+ "3Ep8SmQSKrVbJRmwcnQNQ4MufXSfUZxU4jK4GzX7QjRhiGmqcVTxUaEbQqEiFK7KiRJ5YFVB7R8Mi" -+ "fjZwjbBupNYrSrfhEJTBPRDVKAZARjzfBiYLFGVYwRCPGm97C5eywNKNaQjaW32fGwnM6FuK8g8MG" -+ "re9Zzy2GUkG6mAD4nb8aqSmS65R5D5SBgXT8QVdAngy8ah7K9HDJFwG4wTJFfi8XeBJKH7VyX7E8S" -+ "AdbwS8YaJdjEVJTEUR57VMEvD3z5rkzvemA7P8jXEfQq8Dgy8jAeBccMzk2cqvvyQyhgpvMmmCGDk" -+ "8uTnQHGHfbJj5Xci77qbR8bbzffhYQ7uBXeijMqCTMvtJJwbFvJme2ue8LVGqAjm7mgm5irppUyF6" -+ "fbu6qLMEtVWCtepwanwyXh8eGCHqrXG9ch7k8MGbamYQw8JzaFr4WMjPqazUyu3bZfY57gNMhMa3C" -+ "K66fapifqkTizwfZcHLXg6mgrwYuK8Lp8PRARAbZVaxVcGAHtY6PTLWNzgzkdEvCtZMZK4w95DWfU" -+ "85u6b5B8gyCEQze9pNSPDDfxkZ4RvXVkpbntcFRex9CDJ26fZDwJRjj9bwNNpRfZzjFrQeFxftVVA" -+ "yJGWZHrD5MuHVLNUVXzj9rvedRcuVxrc6kLhqwUWQgGFCtEaDhx95PRZEM5f42tA6frXGXYB8GEnB" -+ "vxfMRfBzY32qzGtPC66rzJrcnd6hewDDhVLuib5KdSy9NpErDkBzuvdQpK5mJrbYZ7pMJFEqxfEKU" -+ "U4fa6g5aqDU8FyRaP55xz6VTPDmy7U5CA7Qhwr6xgQibKFpBXQhiErCzvxWQ6p6bMKVxukdRSkQpn" -+ "hdQYxnx5Kt5wA5pkFzWpjUyVxGmyLAXHGAaJ5EPqEU7p6A9ndGDgihtWbcE2PdyJMu4gPSXJvw3vD" -+ "qUiUTqEY52tbjP2jD9yiB5Y3XLwmVXzXrZdHLAHkRX5iLmq3paGPjghRPYUzM5RMAEQVcwr4MSkND" -+ "iRRxtqTiuNKRxZKagGy9cjJS93HTfFq6DWFKheppbqNkACmyuBJvqDejeb2wRtJNjFTA8LmXiTgjc" -+ "V4Vh2hRp29kccGDhztihtWRnYi8u6G9TP99JPYRhXKzhLWrCU2LTk2m6WLPTZztiH5GwtEvzkbHbb" -+ "WWubihCQnHNu5uKXrMWU3YkP2kxfxCwzzbG8yWejv2vrtqzpYdw6ZDJL9FzGU4a8H6Uaq7yQJvmDP" -+ "Sjqvtntgj3t8fKK7bWdFiNKaRVVVvmAQ2yjctfkj7XyjbUFwW396ASJpq2Z7Lpb7b5iprrhPMhjcy" -+ "euhBd99ufdgupwu9ScLUgAyVFV6DDXiVmuYPJvLTAFMQHZ6v8pALPzCVaChXjW8GzjdM4uxwHgVqK" -+ "zbg23DNyGXFTvTLyvL9gcCR8LA7YNtnR6bnm9ihtTFaVNJJ3JqpW7bTGrMka7DHvyTACUPuqLRY4q" -+ "hyfFJxK7NBv3aZMtUx89VEtjKruYYAuwY2yQzSnJB2tXxKzg6dni7ZNFQ6wNrbkdWXStcUm642ew6" -+ "xZaQA74hHzreJqjw4qciR4xnrjrPgE7tkbZrAbdgiGVDEULbJUq2SKmAULkQ4NpkGC6RZByBBjyxL" -+ "dhLG6xHzT5dY42mqQyH6cNumUviYZ74LKFbv2Yhx8aRwqxEaTymC2QUTDQvuM9D8r8bmpE7CT9BAG" -+ "kbGzZGLNkh3kJefdxF8WK7T6hHVChPuHevwzPKrDGXZBXfHQ4eDyWZ64KAeaFSNhxSWJcEPgjawTm" -+ "ZXEPYRM2R2XNFXYWxzpJgnD4ip6Nr9GkEhThUhxBQ9H7wUPQdG6qpjjvCaXJNGYwfHCxFkz39rh87" -+ "5ViVCRqxN22iWFU7THfzEanuQtUYGt3Amr6dfenezFuUN8mhpRNSH66VMStqPEiuyg8LQYYGeWWCG" -+ "ybytuPRP5mNKBZwftkx3LbqdwSGEhRF4qe56F2nqTRyfnYh2FuxMiihwGCZviCaXUCY8dhRxVnvGi" -+ "DaUpUaebFwPdXnKh9Hrbg2fmXkmq6n5bGHdR9DUcrZYWSZxptxy4kjFUtCieibpe4Czh335QPnGiA" -+ "8cQzBaV42B2zuu3iLwygKHky2Bbe5e4eU4znPzacEfuMGCgzj4E7RtDKctpgWHCHJQJcF54WK7jhA" -+ "TKztSffjCc8n7cTURQE7AWZzK5j2HkajggWw4TA9JUeSNPKdkLQGZeWiHujCz4E2v5Lu9Za9AbCMG" -+ "XBC2YZeUnE5YnyFhHp9jYFVwYr8QfCJ4TtzQNMe743yEMmbSchwaXEdEzth9kpAkKHxqKZBua93UU" -+ "u8EDvykWYXkrRDXnQVdeDgxEVYwkmKrHDt26NUg3tB9tuMDzYKzKrV5iepMdtw6affWkLigMVMYbx" -+ "e4hhYgwZmee6RWMxGyVn6egAgKaN7pauE46MtXhgbjp5xxBP3JM7jZPyeQZetj3tFVxmbbByJLL93" -+ "Ra5jSVte26mHwrwr6Q3xzmAdxtEHcZxcPjruUWk6gXgnfn7HMBtv6vxgMfe2wmydHSqcKUH2XhdpQ" -+ "7JXiXfazVAF28zvhChe4gzwzhqp6Bnm8hWU7zhT6Jf4ZnQWz2N4tg7u4X2CFLnJnmj3P3YeJRAHeR" -+ "Dz7uXYyDwJmGUPH5SdaFFYcMf33LvVBUCAdNHQh784rpGvMDH7eEriKQiBDMZpcRGucHaNkEf9R7x" -+ "635ux3hvp6qrjufWTqPnYLB6UwP2TWRg233eNVajbe4TuJuuFBDGHxxk5Ge34BmLSbitTpMDZAAir" -+ "Jp4HUAGydQ5URF8qaSHn5z9g3uRHmGmbpcLZYumiKAQRTXGtb8776wMNfRGrLmqn75kX8guK7YwKq" -+ "UeWAriZapqL5PuntyGxCNXqPrUvArrqefczM7N6azZatfp4vJYjhMDtkABpQAyxX7pS8mMyKBA527" -+ "byRKqAu3J", 5552, 0x7dc51be2}, -+}; -+ -+static const int test_size = sizeof(tests) / sizeof(tests[0]); -+ -+int main(void) -+{ -+ int i; -+ for (i = 0; i < test_size; i++) { -+ test_adler32(tests[i].adler, tests[i].buf, tests[i].len, -+ tests[i].expect, tests[i].line); -+ } -+ return 0; -+} --- -2.34.3 - - -From f06e8c232a94d75f26c993cc879c914c066d3fd5 Mon Sep 17 00:00:00 2001 -From: Matheus Castanho -Date: Mon, 9 Mar 2020 16:30:11 -0300 -Subject: [PATCH 6/9] adler32_test: Fix warning when compiling with -Wall - ---- - test/adler32_test.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/test/adler32_test.c b/test/adler32_test.c -index 6cf3e2b..8042295 100644 ---- a/test/adler32_test.c -+++ b/test/adler32_test.c -@@ -17,7 +17,7 @@ int main OF((void)); - typedef struct { - int line; - uLong adler; -- Byte* buf; -+ char* buf; - int len; - uLong expect; - } adler32_test; -@@ -332,7 +332,7 @@ int main(void) - { - int i; - for (i = 0; i < test_size; i++) { -- test_adler32(tests[i].adler, tests[i].buf, tests[i].len, -+ test_adler32(tests[i].adler, (Byte*) tests[i].buf, tests[i].len, - tests[i].expect, tests[i].line); - } - return 0; --- -2.34.3 - - -From 11b722e4ae91b611f605221587ec8e0829c27949 Mon Sep 17 00:00:00 2001 -From: Matheus Castanho -Date: Tue, 23 Jun 2020 10:26:19 -0300 -Subject: [PATCH 7/9] Fix invalid memory access on ppc and ppc64 - ---- - contrib/power/adler32_power8.c | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/contrib/power/adler32_power8.c b/contrib/power/adler32_power8.c -index 473c394..fdd0864 100644 ---- a/contrib/power/adler32_power8.c -+++ b/contrib/power/adler32_power8.c -@@ -110,16 +110,15 @@ uLong ZLIB_INTERNAL _adler32_power8 (uLong adler, const Bytef* buf, uInt len) - 6, 5, 4, 3, 2, 1}; - const vector unsigned char vsh = vec_splat_u8(4); - const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0}; -- vector unsigned int vs1 = vec_xl(0, &s1); -- vector unsigned int vs2 = vec_xl(0, &s2); -+ vector unsigned int vs1 = { 0 }; -+ vector unsigned int vs2 = { 0 }; - vector unsigned int vs1_save = { 0 }; - vector unsigned int vsum1, vsum2; - vector unsigned char vbuf; - int n; - -- /* Zeros the undefined values of vectors vs1, vs2. */ -- vs1 = vec_and(vs1, vmask); -- vs2 = vec_and(vs2, vmask); -+ vs1[0] = s1; -+ vs2[0] = s2; - - /* Do length bigger than NMAX in blocks of NMAX size. */ - while (len >= NMAX) { --- -2.34.3 - - -From 4a8d89ae49aa17d1634a2816c8d159f533a07eae Mon Sep 17 00:00:00 2001 -From: Matheus Castanho -Date: Wed, 27 Nov 2019 10:18:10 -0300 -Subject: [PATCH 8/9] Add optimized slide_hash for Power - -Considerable time is spent on deflate.c:slide_hash() during -deflate. This commit introduces a new slide_hash function that -uses VSX vector instructions to slide 8 hash elements at a time, -instead of just one as the standard code does. - -The choice between the optimized and default versions is made only -on the first call to the function, enabling a fallback to standard -behavior if the host processor does not support VSX instructions, -so the same binary can be used for multiple Power processor -versions. - -Author: Matheus Castanho ---- - CMakeLists.txt | 3 +- - Makefile.in | 8 ++++ - configure | 4 +- - contrib/power/power.h | 3 ++ - contrib/power/slide_hash_power8.c | 63 +++++++++++++++++++++++++++++ - contrib/power/slide_hash_resolver.c | 15 +++++++ - deflate.c | 12 ++++++ - 7 files changed, 105 insertions(+), 3 deletions(-) - create mode 100644 contrib/power/slide_hash_power8.c - create mode 100644 contrib/power/slide_hash_resolver.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 44de486..8208c62 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -186,7 +186,8 @@ if(CMAKE_COMPILER_IS_GNUCC) - add_definitions(-DZ_POWER8) - set(ZLIB_POWER8 - contrib/power/adler32_power8.c -- contrib/power/crc32_z_power8.c) -+ contrib/power/crc32_z_power8.c -+ contrib/power/slide_hash_power8.c) - - set_source_files_properties( - ${ZLIB_POWER8} -diff --git a/Makefile.in b/Makefile.in -index 9ef9fa9..f71c6ea 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -183,6 +183,9 @@ crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c - deflate.o: $(SRCDIR)deflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c - -+slide_hash_power8.o: $(SRCDIR)contrib/power/slide_hash_power8.c -+ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/slide_hash_power8.c -+ - infback.o: $(SRCDIR)infback.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c - -@@ -245,6 +248,11 @@ deflate.lo: $(SRCDIR)deflate.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c - -@mv objs/deflate.o $@ - -+slide_hash_power8.lo: $(SRCDIR)contrib/power/slide_hash_power8.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/slide_hash_power8.o $(SRCDIR)contrib/power/slide_hash_power8.c -+ -@mv objs/slide_hash_power8.o $@ -+ - infback.lo: $(SRCDIR)infback.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c -diff --git a/configure b/configure -index 810a740..d0dacf9 100755 ---- a/configure -+++ b/configure -@@ -879,8 +879,8 @@ if tryboth $CC -c $CFLAGS $test.c; then - - if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then - POWER8="-DZ_POWER8" -- PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo" -- OBJC="${OBJC} adler32_power8.o crc32_z_power8.o" -+ PIC_OBJC="${PIC_OBJC} adler32_power8.lo crc32_z_power8.lo slide_hash_power8.lo" -+ OBJC="${OBJC} adler32_power8.o crc32_z_power8.o slide_hash_power8.o" - echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log - else - echo "Checking for -mcpu=power8 support... No." | tee -a configure.log -diff --git a/contrib/power/power.h b/contrib/power/power.h -index f57c761..28c8f78 100644 ---- a/contrib/power/power.h -+++ b/contrib/power/power.h -@@ -4,7 +4,10 @@ - */ - #include "../../zconf.h" - #include "../../zutil.h" -+#include "../../deflate.h" - - uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); - - unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); -+ -+void _slide_hash_power8(deflate_state *s); -diff --git a/contrib/power/slide_hash_power8.c b/contrib/power/slide_hash_power8.c -new file mode 100644 -index 0000000..c5a0eb5 ---- /dev/null -+++ b/contrib/power/slide_hash_power8.c -@@ -0,0 +1,63 @@ -+ /* Copyright (C) 2019 Matheus Castanho , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include -+#include "../../deflate.h" -+ -+local inline void slide_hash_power8_loop OF((deflate_state *s, -+ unsigned n_elems, Posf *table_end)) __attribute__((always_inline)); -+ -+local void slide_hash_power8_loop( -+ deflate_state *s, -+ unsigned n_elems, -+ Posf *table_end) -+{ -+ vector unsigned short vw, vm, *vp; -+ unsigned chunks; -+ -+ /* Each vector register (chunk) corresponds to 128 bits == 8 Posf, -+ * so instead of processing each of the n_elems in the hash table -+ * individually, we can do it in chunks of 8 with vector instructions. -+ * -+ * This function is only called from slide_hash_power8(), and both calls -+ * pass n_elems as a power of 2 higher than 2^7, as defined by -+ * deflateInit2_(), so n_elems will always be a multiple of 8. */ -+ chunks = n_elems >> 3; -+ Assert(n_elems % 8 == 0, "Weird hash table size!"); -+ -+ /* This type casting is safe since s->w_size is always <= 64KB -+ * as defined by deflateInit2_() and Posf == unsigned short */ -+ vw[0] = (Posf) s->w_size; -+ vw = vec_splat(vw,0); -+ -+ vp = (vector unsigned short *) table_end; -+ -+ do { -+ /* Processing 8 elements at a time */ -+ vp--; -+ vm = *vp; -+ -+ /* This is equivalent to: m >= w_size ? m - w_size : 0 -+ * Since we are using a saturated unsigned subtraction, any -+ * values that are > w_size will be set to 0, while the others -+ * will be subtracted by w_size. */ -+ *vp = vec_subs(vm,vw); -+ } while (--chunks); -+}; -+ -+void ZLIB_INTERNAL _slide_hash_power8(deflate_state *s) -+{ -+ unsigned n; -+ Posf *p; -+ -+ n = s->hash_size; -+ p = &s->head[n]; -+ slide_hash_power8_loop(s,n,p); -+ -+#ifndef FASTEST -+ n = s->w_size; -+ p = &s->prev[n]; -+ slide_hash_power8_loop(s,n,p); -+#endif -+} -diff --git a/contrib/power/slide_hash_resolver.c b/contrib/power/slide_hash_resolver.c -new file mode 100644 -index 0000000..54fa1eb ---- /dev/null -+++ b/contrib/power/slide_hash_resolver.c -@@ -0,0 +1,15 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "../gcc/zifunc.h" -+#include "power.h" -+ -+Z_IFUNC(slide_hash) { -+#ifdef Z_POWER8 -+ if (__builtin_cpu_supports("arch_2_07")) -+ return _slide_hash_power8; -+#endif -+ -+ return slide_hash_default; -+} -diff --git a/deflate.c b/deflate.c -index 799fb93..b2db576 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -196,6 +196,13 @@ local const config configuration_table[10] = { - (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ - } while (0) - -+#ifdef Z_POWER_OPT -+/* Rename function so resolver can use its symbol. The default version will be -+ * returned by the resolver if the host has no support for an optimized version. -+ */ -+#define slide_hash slide_hash_default -+#endif /* Z_POWER_OPT */ -+ - /* =========================================================================== - * Slide the hash table when sliding the window down (could be avoided with 32 - * bit values at the expense of memory usage). We slide even when level == 0 to -@@ -227,6 +234,11 @@ local void slide_hash(s) - #endif - } - -+#ifdef Z_POWER_OPT -+#undef slide_hash -+#include "contrib/power/slide_hash_resolver.c" -+#endif /* Z_POWER_OPT */ -+ - /* ========================================================================= */ - int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; --- -2.34.3 - - -From aecdff0646c7e188b48f6db285d8d63a74f246c1 Mon Sep 17 00:00:00 2001 -From: Matheus Castanho -Date: Tue, 29 Oct 2019 18:04:11 -0300 -Subject: [PATCH 9/9] Add vectorized longest_match for Power - -This commit introduces an optimized version of the longest_match -function for Power processors. It uses VSX instructions to match -16 bytes at a time on each comparison, instead of one by one. - -Author: Matheus Castanho ---- - CMakeLists.txt | 3 +- - Makefile.in | 8 + - configure | 4 +- - contrib/power/longest_match_power9.c | 194 +++++++++++++++++++++++++ - contrib/power/longest_match_resolver.c | 15 ++ - contrib/power/power.h | 2 + - deflate.c | 13 ++ - 7 files changed, 236 insertions(+), 3 deletions(-) - create mode 100644 contrib/power/longest_match_power9.c - create mode 100644 contrib/power/longest_match_resolver.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8208c62..017f88a 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -199,7 +199,8 @@ if(CMAKE_COMPILER_IS_GNUCC) - - if(POWER9) - add_definitions(-DZ_POWER9) -- set(ZLIB_POWER9 ) -+ set(ZLIB_POWER9 -+ contrib/power/longest_match_power9.c) - - set_source_files_properties( - ${ZLIB_POWER9} -diff --git a/Makefile.in b/Makefile.in -index f71c6ea..be0a2bc 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -183,6 +183,9 @@ crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c - deflate.o: $(SRCDIR)deflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c - -+longest_match_power9.o: $(SRCDIR)contrib/power/longest_match_power9.c -+ $(CC) $(CFLAGS) -mcpu=power9 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/longest_match_power9.c -+ - slide_hash_power8.o: $(SRCDIR)contrib/power/slide_hash_power8.c - $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/slide_hash_power8.c - -@@ -248,6 +251,11 @@ deflate.lo: $(SRCDIR)deflate.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c - -@mv objs/deflate.o $@ - -+longest_match_power9.lo: $(SRCDIR)contrib/power/longest_match_power9.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) -mcpu=power9 $(ZINC) -DPIC -c -o objs/longest_match_power9.o $(SRCDIR)contrib/power/longest_match_power9.c -+ -@mv objs/longest_match_power9.o $@ -+ - slide_hash_power8.lo: $(SRCDIR)contrib/power/slide_hash_power8.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/slide_hash_power8.o $(SRCDIR)contrib/power/slide_hash_power8.c -diff --git a/configure b/configure -index d0dacf9..b723b64 100755 ---- a/configure -+++ b/configure -@@ -888,8 +888,8 @@ if tryboth $CC -c $CFLAGS $test.c; then - - if tryboth $CC -c $CFLAGS -mcpu=power9 $test.c; then - POWER9="-DZ_POWER9" -- PIC_OBJC="${PIC_OBJC}" -- OBJC="${OBJC}" -+ PIC_OBJC="$PIC_OBJC longest_match_power9.lo" -+ OBJC="$OBJC longest_match_power9.o" - echo "Checking for -mcpu=power9 support... Yes." | tee -a configure.log - else - echo "Checking for -mcpu=power9 support... No." | tee -a configure.log -diff --git a/contrib/power/longest_match_power9.c b/contrib/power/longest_match_power9.c -new file mode 100644 -index 0000000..5177873 ---- /dev/null -+++ b/contrib/power/longest_match_power9.c -@@ -0,0 +1,194 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include -+#include "../../deflate.h" -+ -+local inline int vec_match OF((Bytef* scan, Bytef* match)) -+ __attribute__((always_inline)); -+ -+local inline int vec_match(Bytef* scan, Bytef* match) -+{ -+ vector unsigned char vscan, vmatch, vc; -+ int len; -+ -+ vscan = *((vector unsigned char *) scan); -+ vmatch = *((vector unsigned char *) match); -+ -+ /* Compare 16 bytes at a time. -+ * Each byte of vc will be either all ones or all zeroes, -+ * depending on the result of the comparison -+ */ -+ vc = (vector unsigned char) vec_cmpne(vscan,vmatch); -+ -+ /* Since the index of matching bytes will contain only zeroes -+ * on vc (since we used cmpne), counting the number of consecutive -+ * bytes where LSB == 0 is the same as counting the length of the match. -+ * -+ * There was an issue in the way the vec_cnttz_lsbb builtin was implemented -+ * that got fixed on GCC 12, but now we have to use different builtins -+ * depending on the compiler version. To avoid that, let's use inline asm to -+ * generate the exact instruction we need. -+ */ -+ #ifdef __LITTLE_ENDIAN__ -+ asm volatile("vctzlsbb %0, %1\n\t" : "=r" (len) : "v" (vc)); -+ #else -+ asm volatile("vclzlsbb %0, %1\n\t" : "=r" (len) : "v" (vc)); -+ #endif -+ -+ return len; -+} -+ -+uInt ZLIB_INTERNAL _longest_match_power9(deflate_state *s, IPos cur_match) -+{ -+ unsigned chain_length = s->max_chain_length;/* max hash chain length */ -+ register Bytef *scan = s->window + s->strstart; /* current string */ -+ register Bytef *match; /* matched string */ -+ register int len; /* length of current match */ -+ int best_len = (int)s->prev_length; /* best match length so far */ -+ int nice_match = s->nice_match; /* stop if match long enough */ -+ int mbytes; /* matched bytes inside loop */ -+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? -+ s->strstart - (IPos)MAX_DIST(s) : 0; -+ /* Stop when cur_match becomes <= limit. To simplify the code, -+ * we prevent matches with the string of window index 0. -+ */ -+ Posf *prev = s->prev; -+ uInt wmask = s->w_mask; -+ -+#if (MAX_MATCH == 258) -+ /* Compare the last two bytes at once. */ -+ register Bytef *strend2 = s->window + s->strstart + MAX_MATCH - 2; -+ register ush scan_end = *(ushf*)(scan+best_len-1); -+#else -+ register Bytef *strend = s->window + s->strstart + MAX_MATCH; -+ register Byte scan_end1 = scan[best_len-1]; -+ register Byte scan_end = scan[best_len]; -+#endif -+ -+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. -+ * It is easy to get rid of this optimization if necessary. -+ */ -+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); -+ -+ /* Do not waste too much time if we already have a good match: */ -+ if (s->prev_length >= s->good_match) { -+ chain_length >>= 2; -+ } -+ /* Do not look for matches beyond the end of the input. This is necessary -+ * to make deflate deterministic. -+ */ -+ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; -+ -+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); -+ -+ do { -+ Assert(cur_match < s->strstart, "no future"); -+ match = s->window + cur_match; -+ -+ /* Skip to next match if the match length cannot increase -+ * or if the match length is less than 2. Note that the checks below -+ * for insufficient lookahead only occur occasionally for performance -+ * reasons. Therefore uninitialized memory will be accessed, and -+ * conditional jumps will be made that depend on those values. -+ * However the length of the match is limited to the lookahead, so -+ * the output of deflate is not affected by the uninitialized values. -+ */ -+ -+/* MAX_MATCH - 2 should be a multiple of 16 for this optimization to work. */ -+#if (MAX_MATCH == 258) -+ -+ /* Compare ending (2 bytes) and beginning of potential match. -+ * -+ * On Power processors, loading a 16-byte vector takes only 1 extra -+ * cycle compared to a regular byte load. So instead of comparing the -+ * first two bytes and then the rest later if they match, we can compare -+ * the first 16 at once, and when we have a match longer than 2, we will -+ * already have the result of comparing the first 16 bytes saved in mbytes. -+ */ -+ if (*(ushf*)(match+best_len-1) != scan_end || -+ (mbytes = vec_match(scan,match)) < 3) continue; -+ -+ scan += mbytes; -+ match += mbytes; -+ -+ /* In case when we may have a match longer than 16, we perform further -+ * comparisons in chunks of 16 and keep going while all bytes match. -+ */ -+ while(mbytes == 16) { -+ mbytes = vec_match(scan,match); -+ scan += mbytes; -+ match += mbytes; -+ -+ /* We also have to limit the maximum match based on MAX_MATCH. -+ * Since we are comparing 16 bytes at a time and MAX_MATCH == 258 (to -+ * comply with default implementation), we should stop comparing when -+ * we have matched 256 bytes, which happens when scan == strend2. -+ * In this ("rare") case, we have to check the remaining 2 bytes -+ * individually using common load and compare operations. -+ */ -+ if(scan >= strend2) { -+ if(*scan == *match) { -+ if(*++scan == *++match) -+ scan++; -+ } -+ break; -+ } -+ } -+ -+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); -+ -+ len = (MAX_MATCH - 2) - (int)(strend2 - scan); -+ scan = strend2 - (MAX_MATCH - 2); -+ -+#else /* MAX_MATCH == 258 */ -+ -+ if (match[best_len] != scan_end || -+ match[best_len-1] != scan_end1 || -+ *match != *scan || -+ *++match != scan[1]) continue; -+ -+ /* The check at best_len-1 can be removed because it will be made -+ * again later. (This heuristic is not always a win.) -+ * It is not necessary to compare scan[2] and match[2] since they -+ * are always equal when the other bytes match, given that -+ * the hash keys are equal and that HASH_BITS >= 8. -+ */ -+ scan += 2, match++; -+ Assert(*scan == *match, "match[2]?"); -+ -+ /* We check for insufficient lookahead only every 8th comparison; -+ * the 256th check will be made at strstart+258. -+ */ -+ do { -+ } while (*++scan == *++match && *++scan == *++match && -+ *++scan == *++match && *++scan == *++match && -+ *++scan == *++match && *++scan == *++match && -+ *++scan == *++match && *++scan == *++match && -+ scan < strend); -+ -+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); -+ -+ len = MAX_MATCH - (int)(strend - scan); -+ scan = strend - MAX_MATCH; -+ -+#endif /* MAX_MATCH == 258 */ -+ -+ if (len > best_len) { -+ s->match_start = cur_match; -+ best_len = len; -+ if (len >= nice_match) break; -+#if (MAX_MATCH == 258) -+ scan_end = *(ushf*)(scan+best_len-1); -+#else -+ scan_end1 = scan[best_len-1]; -+ scan_end = scan[best_len]; -+#endif -+ } -+ } while ((cur_match = prev[cur_match & wmask]) > limit -+ && --chain_length != 0); -+ -+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len; -+ return s->lookahead; -+} -diff --git a/contrib/power/longest_match_resolver.c b/contrib/power/longest_match_resolver.c -new file mode 100644 -index 0000000..e81f28a ---- /dev/null -+++ b/contrib/power/longest_match_resolver.c -@@ -0,0 +1,15 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "../gcc/zifunc.h" -+#include "power.h" -+ -+Z_IFUNC(longest_match) { -+#ifdef Z_POWER9 -+ if (__builtin_cpu_supports("arch_3_00")) -+ return _longest_match_power9; -+#endif -+ -+ return longest_match_default; -+} -diff --git a/contrib/power/power.h b/contrib/power/power.h -index 28c8f78..62ca81b 100644 ---- a/contrib/power/power.h -+++ b/contrib/power/power.h -@@ -10,4 +10,6 @@ uLong _adler32_power8(uLong adler, const Bytef* buf, uInt len); - - unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); - -+uInt _longest_match_power9(deflate_state *s, IPos cur_match); -+ - void _slide_hash_power8(deflate_state *s); -diff --git a/deflate.c b/deflate.c -index b2db576..d7b30b5 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -1285,6 +1285,14 @@ local void lm_init (s) - /* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -+ -+#ifdef Z_POWER_OPT -+/* Rename function so resolver can use its symbol. The default version will be -+ * returned by the resolver if the host has no support for an optimized version. -+ */ -+#define longest_match longest_match_default -+#endif /* Z_POWER_OPT */ -+ - local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -@@ -1429,6 +1437,11 @@ local uInt longest_match(s, cur_match) - } - #endif /* ASMV */ - -+#ifdef Z_POWER_OPT -+#undef longest_match -+#include "contrib/power/longest_match_resolver.c" -+#endif /* Z_POWER_OPT */ -+ - #else /* FASTEST */ - - /* --------------------------------------------------------------------------- --- -2.34.3 +2.37.3 diff --git a/zlib-1.2.12-s390x-vectorize-crc32.patch b/zlib-1.2.13-s390x-vectorize-crc32.patch similarity index 95% rename from zlib-1.2.12-s390x-vectorize-crc32.patch rename to zlib-1.2.13-s390x-vectorize-crc32.patch index d354940..a102523 100644 --- a/zlib-1.2.12-s390x-vectorize-crc32.patch +++ b/zlib-1.2.13-s390x-vectorize-crc32.patch @@ -1,4 +1,4 @@ -From 957bc67cfb4e01403c01fe6243850383183a7c19 Mon Sep 17 00:00:00 2001 +From 6ae549062cb4b766c5cc726406f8612310cc12b5 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Thu, 19 Mar 2020 11:52:03 +0100 Subject: [PATCH] s390x: vectorize crc32 @@ -19,18 +19,18 @@ choose between the regular and the vectorized implementations. create mode 100644 contrib/s390/crc32_z_resolver.c diff --git a/Makefile.in b/Makefile.in -index 2e78f38..04c2f5d 100644 +index a811c10..af62c22 100644 --- a/Makefile.in +++ b/Makefile.in -@@ -29,6 +29,7 @@ LDFLAGS= - TEST_LDFLAGS=-L. libz.a +@@ -25,6 +25,7 @@ LDFLAGS= + TEST_LDFLAGS=$(LDFLAGS) -L. libz.a LDSHARED=$(CC) CPP=$(CC) -E +VGFMAFLAG= STATICLIB=libz.a SHAREDLIB=libz.so -@@ -179,6 +180,9 @@ crc32.o: $(SRCDIR)crc32.c +@@ -175,6 +176,9 @@ crc32.o: $(SRCDIR)crc32.c crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c @@ -40,7 +40,7 @@ index 2e78f38..04c2f5d 100644 deflate.o: $(SRCDIR)deflate.c $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c -@@ -229,6 +233,11 @@ crc32.lo: $(SRCDIR)crc32.c +@@ -225,6 +229,11 @@ crc32.lo: $(SRCDIR)crc32.c $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c -@mv objs/crc32.o $@ @@ -53,11 +53,11 @@ index 2e78f38..04c2f5d 100644 -@mkdir objs 2>/dev/null || test -d objs $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c diff --git a/configure b/configure -index dd01b5c..acf94a5 100755 +index ab3204a..04ee943 100755 --- a/configure +++ b/configure -@@ -927,6 +927,32 @@ else - echo "Checking for sys/sdt.h ... No." | tee -a configure.log +@@ -921,6 +921,32 @@ else + echo "Checking for Power optimizations support... No." | tee -a configure.log fi +# check if we are compiling for s390 and binutils support vector extensions @@ -89,7 +89,7 @@ index dd01b5c..acf94a5 100755 # show the results in the log echo >> configure.log echo ALL = $ALL >> configure.log -@@ -960,6 +986,7 @@ echo mandir = $mandir >> configure.log +@@ -952,6 +978,7 @@ echo mandir = $mandir >> configure.log echo prefix = $prefix >> configure.log echo sharedlibdir = $sharedlibdir >> configure.log echo uname = $uname >> configure.log @@ -97,7 +97,7 @@ index dd01b5c..acf94a5 100755 # udpate Makefile with the configure results sed < ${SRCDIR}Makefile.in " -@@ -969,6 +996,7 @@ sed < ${SRCDIR}Makefile.in " +@@ -961,6 +988,7 @@ sed < ${SRCDIR}Makefile.in " /^LDFLAGS *=/s#=.*#=$LDFLAGS# /^LDSHARED *=/s#=.*#=$LDSHARED# /^CPP *=/s#=.*#=$CPP# @@ -388,10 +388,10 @@ index 0000000..9749cab + return crc32_z_default; +} diff --git a/crc32.c b/crc32.c -index ae7b7e7..c212261 100644 +index 4e5830b..0b458ce 100644 --- a/crc32.c +++ b/crc32.c -@@ -736,12 +736,12 @@ local z_word_t crc_word_big(data) +@@ -745,12 +745,12 @@ local z_word_t crc_word_big(data) #endif /* ========================================================================= */ @@ -406,7 +406,7 @@ index ae7b7e7..c212261 100644 unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; -@@ -1064,10 +1064,15 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) +@@ -1073,10 +1073,15 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) return crc ^ 0xffffffff; } @@ -424,5 +424,5 @@ index ae7b7e7..c212261 100644 #endif -- -2.35.1 +2.37.3 diff --git a/zlib.spec b/zlib.spec index b348aad..8c4f272 100644 --- a/zlib.spec +++ b/zlib.spec @@ -1,8 +1,8 @@ %bcond_without minizip Name: zlib -Version: 1.2.12 -Release: 5%{?dist} +Version: 1.2.13 +Release: 1%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -12,30 +12,21 @@ Source: https://www.zlib.net/zlib-%{version}.tar.xz # https://github.com/madler/zlib/pull/210 Patch0: zlib-1.2.5-minizip-fixuncrypt.patch # resolves: #805113 -Patch1: zlib-1.2.11-optimized-s390.patch +Patch1: zlib-1.2.13-optimized-s390.patch +# IBM optimized crc32 for Power 8+ processors +# ref: https://github.com/madler/zlib/pull/750 +Patch18: zlib-1.2.13-power-optimizations.patch # IBM Z hardware-accelerated deflate # ref: https://github.com/madler/zlib/pull/410 -Patch18: zlib-1.2.12-IBM-Z-hw-accelerated-deflate.patch -# IBM optimized crc32 for Power 8+ processors -# ref: https://github.com/madler/zlib/pull/478 -Patch19: zlib-1.2.12-power-optimizations.patch +Patch19: zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch # Patch for s390x crc32vx # ref: https://github.com/iii-i/zlib/releases/tag/crc32vx-v3 -Patch20: zlib-1.2.12-s390x-vectorize-crc32.patch -# Fix for configure -# ref: https://github.com/madler/zlib/pull/607/commits/80d086357a55b94a13e43756cf3e131f25eef0e4 -Patch21: zlib-1.2.12-fix-configure.patch +Patch20: zlib-1.2.13-s390x-vectorize-crc32.patch # fixed covscan issues Patch22: zlib-1.2.11-covscan-issues.patch # fixed issues found by covscan for rhel-9 # ref: https://github.com/madler/zlib/pull/554 Patch23: zlib-1.2.11-covscan-issues-rhel9.patch -# Correct incorrect inputs provided to the CRC functions. -# ref: https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 -Patch24: zlib-1.2.12-correct-inputs-provided-to-crc-func.patch -# Fix for CVE-2022-37434 -# ref: https://github.com/madler/zlib/commit/1eb7682f845ac9e9bf9ae35bbfb3bad5dacbd91d -Patch25: zlib-1.2.12-fix-CVE-2022-37434.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -94,11 +85,8 @@ developing applications which use minizip. %patch18 -p1 %patch19 -p1 %patch20 -p1 -%patch21 -p1 %patch22 -p1 %patch23 -p1 -%patch24 -p1 -%patch25 -p1 # Patch19 conflicts with Patch1, so the Patch1 has to be applied after, # because it is arch specific %ifarch s390 s390x @@ -181,6 +169,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Mon Oct 17 2022 Lukas Javorsky - 1.2.13-1 +- Rebase to version 1.2.13 +- Patches 21,24,25 has been upstreamed + * Tue Aug 09 2022 Lukas Javorsky - 1.2.12-5 - Fix heap-based buffer over-read or buffer overflow in inflate in inflate.c - Resolves: CVE-2022-37434 From 73adb24ba058326efc6b79fd8efedc1ce6cf8a73 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 11 Jan 2023 11:15:11 +0000 Subject: [PATCH 18/28] Fix for the libxml2 and lxml on s390x Resolves: #2155328 --- zlib-1.2.13-Fix-bug-in-deflateBound.patch | 30 ++ ...-1.2.13-IBM-Z-hw-accelerated-deflate.patch | 315 +++++++++++++----- zlib.spec | 10 +- 3 files changed, 269 insertions(+), 86 deletions(-) create mode 100644 zlib-1.2.13-Fix-bug-in-deflateBound.patch diff --git a/zlib-1.2.13-Fix-bug-in-deflateBound.patch b/zlib-1.2.13-Fix-bug-in-deflateBound.patch new file mode 100644 index 0000000..dd655d1 --- /dev/null +++ b/zlib-1.2.13-Fix-bug-in-deflateBound.patch @@ -0,0 +1,30 @@ +From e554695638228b846d49657f31eeff0ca4680e8a Mon Sep 17 00:00:00 2001 +From: Mark Adler +Date: Thu, 15 Dec 2022 09:07:13 -0800 +Subject: [PATCH] Fix bug in deflateBound() for level 0 and memLevel 9. + +memLevel 9 would cause deflateBound() to assume the use of fixed +blocks, even if the compression level was 0, which forces stored +blocks. That could result in a bound less than the size of the +compressed data. Now level 0 always uses the stored blocks bound. +--- + deflate.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/deflate.c b/deflate.c +index cd538b8..4a512e1 100644 +--- a/deflate.c ++++ b/deflate.c +@@ -752,7 +752,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) + + /* if not default parameters, return one of the conservative bounds */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) +- return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; ++ return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + ++ wraplen; + + /* default settings: return tight bound for that case -- ~0.03% overhead + plus a small constant */ +-- +2.38.1 + diff --git a/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch b/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch index 3f6f1dc..4a340c5 100644 --- a/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch +++ b/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch @@ -1,4 +1,4 @@ -From 48c5416a4e21227b8e1aa24fd819d4619a90e1a9 Mon Sep 17 00:00:00 2001 +From 113203437eda67261848b14b6c80a33ff7e33d34 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Wed, 18 Jul 2018 13:14:07 +0200 Subject: [PATCH] Add support for IBM Z hardware-accelerated deflate @@ -52,10 +52,11 @@ macros were introduced in order to encapsulate the allocation details. The same is true for window, for which ZALLOC_WINDOW and TRY_FREE_WINDOW macros were introduced. -While for inflate software and hardware window formats match, this is -not the case for deflate. Therefore, deflateSetDictionary and -deflateGetDictionary need special handling, which is triggered using the -new DEFLATE_SET_DICTIONARY_HOOK and DEFLATE_GET_DICTIONARY_HOOK macros. +Software and hardware window formats do not match, therefore, +deflateSetDictionary(), deflateGetDictionary(), inflateSetDictionary() +and inflateGetDictionary() need special handling, which is triggered +using DEFLATE_SET_DICTIONARY_HOOK, DEFLATE_GET_DICTIONARY_HOOK, +INFLATE_SET_DICTIONARY_HOOK and INFLATE_GET_DICTIONARY_HOOK macros. deflateResetKeep() and inflateResetKeep() now update the DFLTCC parameter block, which is allocated alongside zlib state, using @@ -95,31 +96,31 @@ Since the first call to dfltcc_inflate already needs the window, and it might be not allocated yet, inflate_ensure_window was factored out of updatewindow and made ZLIB_INTERNAL. --- - Makefile.in | 8 + - compress.c | 14 +- - configure | 24 + - contrib/README.contrib | 4 + - contrib/s390/README.txt | 17 + - contrib/s390/dfltcc.c | 995 ++++++++++++++++++++++++++++++++++ - contrib/s390/dfltcc.h | 81 +++ - contrib/s390/dfltcc_deflate.h | 55 ++ - deflate.c | 82 ++- - deflate.h | 12 + - gzguts.h | 4 + - inflate.c | 87 ++- - inflate.h | 2 + - test/infcover.c | 4 +- - test/minigzip.c | 4 + - trees.c | 13 +- - zutil.h | 2 + - 17 files changed, 1348 insertions(+), 60 deletions(-) + Makefile.in | 8 + + compress.c | 14 +- + configure | 24 + + contrib/README.contrib | 4 + + contrib/s390/README.txt | 17 + + contrib/s390/dfltcc.c | 1089 +++++++++++++++++++++++++++++++++ + contrib/s390/dfltcc.h | 100 +++ + contrib/s390/dfltcc_deflate.h | 55 ++ + deflate.c | 82 ++- + deflate.h | 12 + + gzguts.h | 4 + + inflate.c | 97 ++- + inflate.h | 2 + + test/infcover.c | 4 +- + test/minigzip.c | 4 + + trees.c | 13 +- + zutil.h | 2 + + 17 files changed, 1469 insertions(+), 62 deletions(-) create mode 100644 contrib/s390/README.txt create mode 100644 contrib/s390/dfltcc.c create mode 100644 contrib/s390/dfltcc.h create mode 100644 contrib/s390/dfltcc_deflate.h diff --git a/Makefile.in b/Makefile.in -index 408954d..a811c10 100644 +index 83d8ca4..54c529b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -139,6 +139,14 @@ match.lo: match.S @@ -260,10 +261,10 @@ index 0000000..48be008 +DFLTCC_LEVEL_MASK to 0x7e at run time. diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c new file mode 100644 -index 0000000..aa0b7a3 +index 0000000..b8c20bd --- /dev/null +++ b/contrib/s390/dfltcc.c -@@ -0,0 +1,995 @@ +@@ -0,0 +1,1089 @@ +/* dfltcc.c - SystemZ DEFLATE CONVERSION CALL support. */ + +/* @@ -723,7 +724,10 @@ index 0000000..aa0b7a3 + *strm->next_out = (Bytef)state->bi_buf; + /* Honor history and check value */ + param->nt = 0; -+ param->cv = state->wrap == 2 ? ZSWAP32(strm->adler) : strm->adler; ++ if (state->wrap == 1) ++ param->cv = strm->adler; ++ else if (state->wrap == 2) ++ param->cv = ZSWAP32(strm->adler); + + /* When opening a block, choose a Huffman-Table Type */ + if (!param->bcf) { @@ -755,7 +759,10 @@ index 0000000..aa0b7a3 + state->bi_buf = 0; /* Avoid accessing next_out */ + else + state->bi_buf = *strm->next_out & ((1 << state->bi_valid) - 1); -+ strm->adler = state->wrap == 2 ? ZSWAP32(param->cv) : param->cv; ++ if (state->wrap == 1) ++ strm->adler = param->cv; ++ else if (state->wrap == 2) ++ strm->adler = ZSWAP32(param->cv); + + /* Unmask the input data */ + strm->avail_in += masked_avail_in; @@ -806,10 +813,6 @@ index 0000000..aa0b7a3 + struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; + struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); + -+ /* Unsupported compression settings */ -+ if (state->wbits != HB_BITS) -+ return 0; -+ + /* Unsupported hardware */ + return is_bit_set(dfltcc_state->af.fns, DFLTCC_XPND) && + is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0); @@ -871,13 +874,12 @@ index 0000000..aa0b7a3 + } + + /* Translate stream to parameter block */ -+ param->cvt = state->flags ? CVT_CRC32 : CVT_ADLER32; ++ param->cvt = ((state->wrap & 4) && state->flags) ? CVT_CRC32 : CVT_ADLER32; + param->sbb = state->bits; -+ param->hl = state->whave; /* Software and hardware history formats match */ -+ param->ho = (state->wnext - state->whave) & ((1 << HB_BITS) - 1); + if (param->hl) + param->nt = 0; /* Honor history for the first block */ -+ param->cv = state->flags ? ZSWAP32(state->check) : state->check; ++ if (state->wrap & 4) ++ param->cv = state->flags ? ZSWAP32(state->check) : state->check; + + /* Inflate */ + do { @@ -888,9 +890,9 @@ index 0000000..aa0b7a3 + strm->msg = oesc_msg(dfltcc_state->msg, param->oesc); + state->last = cc == DFLTCC_CC_OK; + state->bits = param->sbb; -+ state->whave = param->hl; -+ state->wnext = (param->ho + param->hl) & ((1 << HB_BITS) - 1); -+ strm->adler = state->check = state->flags ? ZSWAP32(param->cv) : param->cv; ++ if (state->wrap & 4) ++ strm->adler = state->check = state->flags ? ++ ZSWAP32(param->cv) : param->cv; + if (cc == DFLTCC_CC_OP2_CORRUPT && param->oesc != 0) { + /* Report an error if stream is corrupted */ + state->mode = BAD; @@ -911,11 +913,52 @@ index 0000000..aa0b7a3 + return !param->nt; +} + ++/* ++ Rotates a circular buffer. ++ The implementation is based on https://cplusplus.com/reference/algorithm/rotate/ ++ */ ++local void rotate OF((Bytef *start, Bytef *pivot, Bytef *end)); ++local void rotate(start, pivot, end) ++ Bytef *start; ++ Bytef *pivot; ++ Bytef *end; ++{ ++ Bytef *p = pivot; ++ Bytef tmp; ++ ++ while (p != start) { ++ tmp = *start; ++ *start = *p; ++ *p = tmp; ++ ++ start++; ++ p++; ++ ++ if (p == end) ++ p = pivot; ++ else if (start == pivot) ++ pivot = p; ++ } ++} ++ ++#define MIN(x, y) ({ \ ++ typeof(x) _x = (x); \ ++ typeof(y) _y = (y); \ ++ _x < _y ? _x : _y; \ ++}) ++ ++#define MAX(x, y) ({ \ ++ typeof(x) _x = (x); \ ++ typeof(y) _y = (y); \ ++ _x > _y ? _x : _y; \ ++}) ++ +int ZLIB_INTERNAL dfltcc_inflate_disable(strm) + z_streamp strm; +{ + struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; + struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); ++ struct dfltcc_param_v0 *param = &dfltcc_state->param; + + if (!dfltcc_can_inflate(strm)) + return 0; @@ -927,6 +970,9 @@ index 0000000..aa0b7a3 + return 1; + /* DFLTCC was not used yet - decompress in software */ + memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af)); ++ /* Convert the window from the hardware to the software format */ ++ rotate(state->window, state->window + param->ho, state->window + HB_SIZE); ++ state->whave = state->wnext = MIN(param->hl, state->wsize); + return 0; +} + @@ -1096,9 +1142,9 @@ index 0000000..aa0b7a3 + voidpf p, w; + + /* To simplify freeing, we store the pointer to the allocated buffer right -+ * before the window. ++ * before the window. Note that DFLTCC always uses HB_SIZE bytes. + */ -+ p = ZALLOC(strm, sizeof(voidpf) + items * size + PAGE_ALIGN, ++ p = ZALLOC(strm, sizeof(voidpf) + MAX(items * size, HB_SIZE) + PAGE_ALIGN, + sizeof(unsigned char)); + if (p == NULL) + return NULL; @@ -1107,6 +1153,14 @@ index 0000000..aa0b7a3 + return w; +} + ++void ZLIB_INTERNAL dfltcc_copy_window(dest, src, n) ++ void *dest; ++ const void *src; ++ size_t n; ++{ ++ memcpy(dest, src, MAX(n, HB_SIZE)); ++} ++ +void ZLIB_INTERNAL dfltcc_free_window(strm, w) + z_streamp strm; + voidpf w; @@ -1217,6 +1271,24 @@ index 0000000..aa0b7a3 + } +} + ++local void get_history OF((struct dfltcc_param_v0 FAR *param, ++ const Bytef *history, ++ Bytef *buf)); ++local void get_history(param, history, buf) ++ struct dfltcc_param_v0 FAR *param; ++ const Bytef *history; ++ Bytef *buf; ++{ ++ if (param->ho + param->hl <= HB_SIZE) ++ /* Circular history buffer does not wrap - copy one chunk */ ++ memcpy(buf, history + param->ho, param->hl); ++ else { ++ /* Circular history buffer wraps - copy two chunks */ ++ memcpy(buf, history + param->ho, HB_SIZE - param->ho); ++ memcpy(buf + HB_SIZE - param->ho, history, param->ho + param->hl - HB_SIZE); ++ } ++} ++ +int ZLIB_INTERNAL dfltcc_deflate_set_dictionary(strm, dictionary, dict_length) + z_streamp strm; + const Bytef *dictionary; @@ -1241,30 +1313,53 @@ index 0000000..aa0b7a3 + struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); + struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; + -+ if (dictionary) { -+ if (param->ho + param->hl <= HB_SIZE) -+ /* Circular history buffer does not wrap - copy one chunk */ -+ zmemcpy(dictionary, state->window + param->ho, param->hl); -+ else { -+ /* Circular history buffer wraps - copy two chunks */ -+ zmemcpy(dictionary, -+ state->window + param->ho, -+ HB_SIZE - param->ho); -+ zmemcpy(dictionary + HB_SIZE - param->ho, -+ state->window, -+ param->ho + param->hl - HB_SIZE); -+ } ++ if (dictionary) ++ get_history(param, state->window, dictionary); ++ if (dict_length) ++ *dict_length = param->hl; ++ return Z_OK; ++} ++ ++int ZLIB_INTERNAL dfltcc_inflate_set_dictionary(strm, dictionary, dict_length) ++ z_streamp strm; ++ const Bytef *dictionary; ++ uInt dict_length; ++{ ++ struct inflate_state *state = (struct inflate_state *)strm->state; ++ struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); ++ struct dfltcc_param_v0 *param = &dfltcc_state->param; ++ ++ if (inflate_ensure_window(state)) { ++ state->mode = MEM; ++ return Z_MEM_ERROR; + } ++ ++ append_history(param, state->window, dictionary, dict_length); ++ state->havedict = 1; ++ return Z_OK; ++} ++ ++int ZLIB_INTERNAL dfltcc_inflate_get_dictionary(strm, dictionary, dict_length) ++ z_streamp strm; ++ Bytef *dictionary; ++ uInt *dict_length; ++{ ++ struct inflate_state *state = (struct inflate_state *)strm->state; ++ struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); ++ struct dfltcc_param_v0 *param = &dfltcc_state->param; ++ ++ if (dictionary && state->window) ++ get_history(param, state->window, dictionary); + if (dict_length) + *dict_length = param->hl; + return Z_OK; +} diff --git a/contrib/s390/dfltcc.h b/contrib/s390/dfltcc.h new file mode 100644 -index 0000000..da26612 +index 0000000..be28b8a --- /dev/null +++ b/contrib/s390/dfltcc.h -@@ -0,0 +1,81 @@ +@@ -0,0 +1,100 @@ +#ifndef DFLTCC_H +#define DFLTCC_H + @@ -1278,6 +1373,8 @@ index 0000000..da26612 +void ZLIB_INTERNAL dfltcc_reset OF((z_streamp strm, uInt size)); +voidpf ZLIB_INTERNAL dfltcc_alloc_window OF((z_streamp strm, uInt items, + uInt size)); ++void ZLIB_INTERNAL dfltcc_copy_window OF((void *dest, const void *src, ++ size_t n)); +void ZLIB_INTERNAL dfltcc_free_window OF((z_streamp strm, voidpf w)); +#define DFLTCC_BLOCK_HEADER_BITS 3 +#define DFLTCC_HLITS_COUNT_BITS 5 @@ -1311,11 +1408,18 @@ index 0000000..da26612 + int flush, int *ret)); +int ZLIB_INTERNAL dfltcc_was_inflate_used OF((z_streamp strm)); +int ZLIB_INTERNAL dfltcc_inflate_disable OF((z_streamp strm)); ++int ZLIB_INTERNAL dfltcc_inflate_set_dictionary OF((z_streamp strm, ++ const Bytef *dictionary, ++ uInt dict_length)); ++int ZLIB_INTERNAL dfltcc_inflate_get_dictionary OF((z_streamp strm, ++ Bytef *dictionary, ++ uInt* dict_length)); + +#define ZALLOC_STATE dfltcc_alloc_state +#define ZFREE_STATE ZFREE +#define ZCOPY_STATE dfltcc_copy_state +#define ZALLOC_WINDOW dfltcc_alloc_window ++#define ZCOPY_WINDOW dfltcc_copy_window +#define ZFREE_WINDOW dfltcc_free_window +#define TRY_FREE_WINDOW dfltcc_free_window +#define INFLATE_RESET_KEEP_HOOK(strm) \ @@ -1344,6 +1448,16 @@ index 0000000..da26612 + do { \ + if (dfltcc_was_inflate_used((strm))) return Z_STREAM_ERROR; \ + } while (0) ++#define INFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \ ++ do { \ ++ if (dfltcc_can_inflate(strm)) \ ++ return dfltcc_inflate_set_dictionary(strm, dict, dict_len); \ ++ } while (0) ++#define INFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) \ ++ do { \ ++ if (dfltcc_can_inflate(strm)) \ ++ return dfltcc_inflate_get_dictionary(strm, dict, dict_len); \ ++ } while (0) + +#endif diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h @@ -1408,7 +1522,7 @@ index 0000000..46acfc5 + +#endif diff --git a/deflate.c b/deflate.c -index 4a689db..9fd3bdb 100644 +index 4a512e1..ba446d9 100644 --- a/deflate.c +++ b/deflate.c @@ -61,15 +61,30 @@ const char deflate_copyright[] = @@ -1552,10 +1666,10 @@ index 4a689db..9fd3bdb 100644 - if (s->w_bits != 15 || s->hash_bits != 8 + 7) + if (DEFLATE_NEED_CONSERVATIVE_BOUND(strm) || + s->w_bits != 15 || s->hash_bits != 8 + 7) - return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; + return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + + wraplen; - /* default settings: return tight bound for that case -- ~0.03% overhead -@@ -779,7 +804,7 @@ local void putShortMSB(s, b) +@@ -780,7 +805,7 @@ local void putShortMSB(s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ @@ -1564,7 +1678,7 @@ index 4a689db..9fd3bdb 100644 z_streamp strm; { unsigned len; -@@ -1051,7 +1076,8 @@ int ZEXPORT deflate(strm, flush) +@@ -1052,7 +1077,8 @@ int ZEXPORT deflate(strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; @@ -1574,7 +1688,7 @@ index 4a689db..9fd3bdb 100644 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush); -@@ -1098,7 +1124,6 @@ int ZEXPORT deflate(strm, flush) +@@ -1099,7 +1125,6 @@ int ZEXPORT deflate(strm, flush) } if (flush != Z_FINISH) return Z_OK; @@ -1582,7 +1696,7 @@ index 4a689db..9fd3bdb 100644 /* Write the trailer */ #ifdef GZIP -@@ -1114,7 +1139,7 @@ int ZEXPORT deflate(strm, flush) +@@ -1115,7 +1140,7 @@ int ZEXPORT deflate(strm, flush) } else #endif @@ -1591,7 +1705,7 @@ index 4a689db..9fd3bdb 100644 putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } -@@ -1123,7 +1148,11 @@ int ZEXPORT deflate(strm, flush) +@@ -1124,7 +1149,11 @@ int ZEXPORT deflate(strm, flush) * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ @@ -1604,7 +1718,7 @@ index 4a689db..9fd3bdb 100644 } /* ========================================================================= */ -@@ -1140,9 +1169,9 @@ int ZEXPORT deflateEnd(strm) +@@ -1141,9 +1170,9 @@ int ZEXPORT deflateEnd(strm) TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); @@ -1616,7 +1730,7 @@ index 4a689db..9fd3bdb 100644 strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -@@ -1172,13 +1201,13 @@ int ZEXPORT deflateCopy(dest, source) +@@ -1173,13 +1202,13 @@ int ZEXPORT deflateCopy(dest, source) zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); @@ -1633,7 +1747,7 @@ index 4a689db..9fd3bdb 100644 ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); -@@ -1225,7 +1254,8 @@ local unsigned read_buf(strm, buf, size) +@@ -1226,7 +1255,8 @@ local unsigned read_buf(strm, buf, size) strm->avail_in -= len; zmemcpy(buf, strm->next_in, len); @@ -1688,10 +1802,10 @@ index 57faf37..581f2b6 100644 /* gzip modes, also provide a little integrity check on the passed structure */ #define GZ_NONE 0 diff --git a/inflate.c b/inflate.c -index 8acbef4..918dfa7 100644 +index 8acbef4..19dc724 100644 --- a/inflate.c +++ b/inflate.c -@@ -85,6 +85,24 @@ +@@ -85,6 +85,27 @@ #include "inflate.h" #include "inffast.h" @@ -1703,6 +1817,7 @@ index 8acbef4..918dfa7 100644 +#define ZFREE_STATE ZFREE +#define ZCOPY_STATE zmemcpy +#define ZALLOC_WINDOW ZALLOC ++#define ZCOPY_WINDOW zmemcpy +#define ZFREE_WINDOW ZFREE +#define INFLATE_RESET_KEEP_HOOK(strm) do {} while (0) +#define INFLATE_PRIME_HOOK(strm, bits, value) do {} while (0) @@ -1711,12 +1826,14 @@ index 8acbef4..918dfa7 100644 +#define INFLATE_NEED_UPDATEWINDOW(strm) 1 +#define INFLATE_MARK_HOOK(strm) do {} while (0) +#define INFLATE_SYNC_POINT_HOOK(strm) do {} while (0) ++#define INFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) ++#define INFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) +#endif + #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED -@@ -138,6 +156,7 @@ z_streamp strm; +@@ -138,6 +159,7 @@ z_streamp strm; state->lencode = state->distcode = state->next = state->codes; state->sane = 1; state->back = -1; @@ -1724,7 +1841,7 @@ index 8acbef4..918dfa7 100644 Tracev((stderr, "inflate: reset\n")); return Z_OK; } -@@ -185,7 +204,7 @@ int windowBits; +@@ -185,7 +207,7 @@ int windowBits; if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { @@ -1733,7 +1850,7 @@ index 8acbef4..918dfa7 100644 state->window = Z_NULL; } -@@ -224,7 +243,7 @@ int stream_size; +@@ -224,7 +246,7 @@ int stream_size; strm->zfree = zcfree; #endif state = (struct inflate_state FAR *) @@ -1742,7 +1859,7 @@ index 8acbef4..918dfa7 100644 if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; -@@ -233,7 +252,7 @@ int stream_size; +@@ -233,7 +255,7 @@ int stream_size; state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { @@ -1751,7 +1868,7 @@ index 8acbef4..918dfa7 100644 strm->state = Z_NULL; } return ret; -@@ -255,6 +274,7 @@ int value; +@@ -255,6 +277,7 @@ int value; struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1759,7 +1876,7 @@ index 8acbef4..918dfa7 100644 state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; -@@ -382,6 +402,27 @@ void makefixed() +@@ -382,6 +405,27 @@ void makefixed() } #endif /* MAKEFIXED */ @@ -1787,7 +1904,7 @@ index 8acbef4..918dfa7 100644 /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called -@@ -406,20 +447,7 @@ unsigned copy; +@@ -406,20 +450,7 @@ unsigned copy; state = (struct inflate_state FAR *)strm->state; @@ -1809,7 +1926,7 @@ index 8acbef4..918dfa7 100644 /* copy state->wsize or less output bytes into the circular window */ if (copy >= state->wsize) { -@@ -863,6 +891,7 @@ int flush; +@@ -863,6 +894,7 @@ int flush; if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; /* fallthrough */ case TYPEDO: @@ -1817,7 +1934,7 @@ index 8acbef4..918dfa7 100644 if (state->last) { BYTEBITS(); state->mode = CHECK; -@@ -1224,7 +1253,7 @@ int flush; +@@ -1224,7 +1256,7 @@ int flush; out -= left; strm->total_out += out; state->total += out; @@ -1826,7 +1943,7 @@ index 8acbef4..918dfa7 100644 strm->adler = state->check = UPDATE_CHECK(state->check, put - out, out); out = left; -@@ -1279,8 +1308,9 @@ int flush; +@@ -1279,8 +1311,9 @@ int flush; */ inf_leave: RESTORE(); @@ -1838,7 +1955,7 @@ index 8acbef4..918dfa7 100644 if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; -@@ -1290,7 +1320,7 @@ int flush; +@@ -1290,7 +1323,7 @@ int flush; strm->total_in += in; strm->total_out += out; state->total += out; @@ -1847,7 +1964,7 @@ index 8acbef4..918dfa7 100644 strm->adler = state->check = UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + -@@ -1308,8 +1338,8 @@ z_streamp strm; +@@ -1308,8 +1341,8 @@ z_streamp strm; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; @@ -1858,7 +1975,25 @@ index 8acbef4..918dfa7 100644 strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; -@@ -1488,6 +1518,7 @@ z_streamp strm; +@@ -1326,6 +1359,8 @@ uInt *dictLength; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + ++ INFLATE_GET_DICTIONARY_HOOK(strm, dictionary, dictLength); ++ + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, +@@ -1361,6 +1396,8 @@ uInt dictLength; + return Z_DATA_ERROR; + } + ++ INFLATE_SET_DICTIONARY_HOOK(strm, dictionary, dictLength); ++ + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); +@@ -1488,6 +1525,7 @@ z_streamp strm; struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1866,7 +2001,7 @@ index 8acbef4..918dfa7 100644 state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } -@@ -1508,21 +1539,22 @@ z_streamp source; +@@ -1508,21 +1546,22 @@ z_streamp source; /* allocate space */ copy = (struct inflate_state FAR *) @@ -1893,7 +2028,17 @@ index 8acbef4..918dfa7 100644 copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { -@@ -1579,6 +1611,7 @@ z_streamp strm; +@@ -1531,8 +1570,7 @@ z_streamp source; + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { +- wsize = 1U << state->wbits; +- zmemcpy(window, state->window, wsize); ++ ZCOPY_WINDOW(window, state->window, 1U << state->wbits); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; +@@ -1579,6 +1617,7 @@ z_streamp strm; if (inflateStateCheck(strm)) return -(1L << 16); @@ -2008,5 +2153,5 @@ index 0bc7f4e..75eb4df 100644 #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -- -2.37.3 +2.38.1 diff --git a/zlib.spec b/zlib.spec index 8c4f272..2b36633 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.13 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -13,6 +13,9 @@ Source: https://www.zlib.net/zlib-%{version}.tar.xz Patch0: zlib-1.2.5-minizip-fixuncrypt.patch # resolves: #805113 Patch1: zlib-1.2.13-optimized-s390.patch +# Upstream commit: https://github.com/madler/zlib/commit/e554695638228b846d49657f31eeff0ca4680e8a +# This patch is needed for a clean apply of the Patch19 +Patch2: zlib-1.2.13-Fix-bug-in-deflateBound.patch # IBM optimized crc32 for Power 8+ processors # ref: https://github.com/madler/zlib/pull/750 Patch18: zlib-1.2.13-power-optimizations.patch @@ -82,6 +85,7 @@ developing applications which use minizip. %prep %setup -q %patch0 -p1 -b .fixuncrypt +%patch2 -p1 %patch18 -p1 %patch19 -p1 %patch20 -p1 @@ -169,6 +173,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Tue Jan 10 2023 Lukas Javorsky - 1.2.13-2 +- Fix for the libxml2 and lxml on s390x +- Resolves #2155328 + * Mon Oct 17 2022 Lukas Javorsky - 1.2.13-1 - Rebase to version 1.2.13 - Patches 21,24,25 has been upstreamed From f8022d5b74fa1c29a86b331575ed89fde01bf27d Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 21 Jan 2023 08:18:27 +0000 Subject: [PATCH 19/28] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- zlib.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zlib.spec b/zlib.spec index 2b36633..fa33816 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.13 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: zlib and Boost @@ -173,6 +173,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Sat Jan 21 2023 Fedora Release Engineering - 1.2.13-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Tue Jan 10 2023 Lukas Javorsky - 1.2.13-2 - Fix for the libxml2 and lxml on s390x - Resolves #2155328 From 956bec8433068665329002c5153b17deebb74c99 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Fri, 17 Mar 2023 14:55:13 +0000 Subject: [PATCH 20/28] migrated to SPDX license --- zlib.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zlib.spec b/zlib.spec index fa33816..1be152b 100644 --- a/zlib.spec +++ b/zlib.spec @@ -5,7 +5,7 @@ Version: 1.2.13 Release: 3%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license -License: zlib and Boost +License: Zlib AND BSL-1.0 URL: https://www.zlib.net/ Source: https://www.zlib.net/zlib-%{version}.tar.xz From 94fb3f6768bc8ff028f3e25dd0151ed3aaa81055 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 14 Jun 2023 10:05:45 +0000 Subject: [PATCH 21/28] Add private CI for the RHEL distro Resolves: RHELPLAN-155186 --- ci.fmf | 7 ------- plan.fmf | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) delete mode 100644 ci.fmf create mode 100644 plan.fmf diff --git a/ci.fmf b/ci.fmf deleted file mode 100644 index 1b25926..0000000 --- a/ci.fmf +++ /dev/null @@ -1,7 +0,0 @@ -summary: CI plan -discover: - how: fmf - url: https://src.fedoraproject.org/tests/zlib.git - ref: main -execute: - how: tmt diff --git a/plan.fmf b/plan.fmf new file mode 100644 index 0000000..956251e --- /dev/null +++ b/plan.fmf @@ -0,0 +1,20 @@ +/public: + summary: Public (Fedora) beakerlib tests + discover: + how: fmf + url: https://src.fedoraproject.org/tests/zlib.git + execute: + how: tmt + +/private: + enabled: false + adjust: + - when: distro == rhel + enabled: true + because: private tests are accesible only within rhel pipline + + discover: + how: fmf + url: https://pkgs.devel.redhat.com/cgit/tests/zlib.git + execute: + how: tmt From 3a5a0e0d053aabbb78e4c106ef4a32ae60568564 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 14 Jun 2023 10:08:00 +0000 Subject: [PATCH 22/28] Separate public and private tests and update gating accordingly Gating also covers Fedora, so the gating.yaml files are the same Resolves: RHELPLAN-155186 --- ci.fmf | 1 + gating.yaml | 27 +++++++++++++++++++++++++++ plan.fmf | 20 -------------------- plans/internal.fmf | 12 ++++++++++++ plans/public.fmf | 7 +++++++ 5 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 ci.fmf create mode 100644 gating.yaml delete mode 100644 plan.fmf create mode 100644 plans/internal.fmf create mode 100644 plans/public.fmf diff --git a/ci.fmf b/ci.fmf new file mode 100644 index 0000000..c5aa0e0 --- /dev/null +++ b/ci.fmf @@ -0,0 +1 @@ +resultsdb-testcase: separate diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..dbde1aa --- /dev/null +++ b/gating.yaml @@ -0,0 +1,27 @@ +# Branched Fedora (non-Rawhide) +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_testing +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/public.functional} + + +# Rawhide Fedora +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/public.functional} + +# Gating RHEL +--- !Policy +product_versions: + - rhel-* +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: osci.brew-build./plans/internal.functional} + - !PassingTestCaseRule {test_case_name: osci.brew-build./plans/public.functional} diff --git a/plan.fmf b/plan.fmf deleted file mode 100644 index 956251e..0000000 --- a/plan.fmf +++ /dev/null @@ -1,20 +0,0 @@ -/public: - summary: Public (Fedora) beakerlib tests - discover: - how: fmf - url: https://src.fedoraproject.org/tests/zlib.git - execute: - how: tmt - -/private: - enabled: false - adjust: - - when: distro == rhel - enabled: true - because: private tests are accesible only within rhel pipline - - discover: - how: fmf - url: https://pkgs.devel.redhat.com/cgit/tests/zlib.git - execute: - how: tmt diff --git a/plans/internal.fmf b/plans/internal.fmf new file mode 100644 index 0000000..c013f71 --- /dev/null +++ b/plans/internal.fmf @@ -0,0 +1,12 @@ +summary: Private (RHEL) beakerlib tests +enabled: false +adjust: + - when: distro == rhel + enabled: true + because: private tests are accesible only within rhel pipline +discover: + - name: rhel + how: fmf + url: git://pkgs.devel.redhat.com/tests/zlib +execute: + how: tmt diff --git a/plans/public.fmf b/plans/public.fmf new file mode 100644 index 0000000..cf84547 --- /dev/null +++ b/plans/public.fmf @@ -0,0 +1,7 @@ +summary: Public (Fedora) beakerlib tests +discover: + - name: fedora + how: fmf + url: https://src.fedoraproject.org/tests/zlib.git +execute: + how: tmt From 66bfff65fa8601d202660b022b18d8fd919ea020 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Thu, 8 Jun 2023 12:44:22 +0000 Subject: [PATCH 23/28] Add distribution and file tests that were part of baseos.ci tests --- plans/internal.fmf | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plans/internal.fmf b/plans/internal.fmf index c013f71..9d7e32f 100644 --- a/plans/internal.fmf +++ b/plans/internal.fmf @@ -5,8 +5,16 @@ adjust: enabled: true because: private tests are accesible only within rhel pipline discover: - - name: rhel + - name: rhel-zlib how: fmf url: git://pkgs.devel.redhat.com/tests/zlib + - name: distribution + how: fmf + url: git://pkgs.devel.redhat.com/tests/distribution + test: /rebuild/TC#0517975 + - name: file + how: fmf + url: git://pkgs.devel.redhat.com/tests/file + test: /Sanity/command-line-options execute: how: tmt From e9f4684532b05f5120983b0c668f766d625038f7 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Thu, 8 Jun 2023 13:50:21 +0000 Subject: [PATCH 24/28] Filter-out the tests that are not suitable for Gating Excluded: https://pkgs.devel.redhat.com/cgit/tests/zlib/tree/Regression/bz1659433-IBM-8-2-FEAT-zlib-compression-improvements --- plans/internal.fmf | 1 + 1 file changed, 1 insertion(+) diff --git a/plans/internal.fmf b/plans/internal.fmf index 9d7e32f..064c62a 100644 --- a/plans/internal.fmf +++ b/plans/internal.fmf @@ -8,6 +8,7 @@ discover: - name: rhel-zlib how: fmf url: git://pkgs.devel.redhat.com/tests/zlib + filter: "tag:-NoGating" - name: distribution how: fmf url: git://pkgs.devel.redhat.com/tests/distribution From d1d9a0b3054a7752a3bf4e40140d6d52b70bda00 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 22 Jul 2023 19:44:56 +0000 Subject: [PATCH 25/28] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- zlib.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zlib.spec b/zlib.spec index 1be152b..cfdb146 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.13 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: Zlib AND BSL-1.0 @@ -173,6 +173,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Sat Jul 22 2023 Fedora Release Engineering - 1.2.13-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Sat Jan 21 2023 Fedora Release Engineering - 1.2.13-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild From eb01ebe050678091ca708d9df2d4257b0b58ee35 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Tue, 22 Aug 2023 10:18:18 +0000 Subject: [PATCH 26/28] Fix the deprecated %patch macros --- zlib.spec | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zlib.spec b/zlib.spec index cfdb146..b6c8247 100644 --- a/zlib.spec +++ b/zlib.spec @@ -84,17 +84,17 @@ developing applications which use minizip. %prep %setup -q -%patch0 -p1 -b .fixuncrypt -%patch2 -p1 -%patch18 -p1 -%patch19 -p1 -%patch20 -p1 -%patch22 -p1 -%patch23 -p1 +%patch -P0 -p1 -b .fixuncrypt +%patch -P2 -p1 +%patch -P18 -p1 +%patch -P19 -p1 +%patch -P20 -p1 +%patch -P22 -p1 +%patch -P23 -p1 # Patch19 conflicts with Patch1, so the Patch1 has to be applied after, # because it is arch specific %ifarch s390 s390x -%patch1 -p1 -b .optimized-deflate +%patch -P1 -p1 -b .optimized-deflate %endif From 1edfcf16dac9eb907416358df81404a7837024f1 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Tue, 17 Oct 2023 10:13:09 +0000 Subject: [PATCH 27/28] Fix integer overflow in zipOpenNewFileInZip4_6 Resolves: CVE-2023-45853 --- ...lows-of-zip-header-fields-in-minizip.patch | 39 +++++++++++++++++++ zlib.spec | 9 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch diff --git a/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch b/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch new file mode 100644 index 0000000..35e3073 --- /dev/null +++ b/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch @@ -0,0 +1,39 @@ +From 73331a6a0481067628f065ffe87bb1d8f787d10c Mon Sep 17 00:00:00 2001 +From: Hans Wennborg +Date: Fri, 18 Aug 2023 11:05:33 +0200 +Subject: [PATCH] Reject overflows of zip header fields in minizip. + +This checks the lengths of the file name, extra field, and comment +that would be put in the zip headers, and rejects them if they are +too long. They are each limited to 65535 bytes in length by the zip +format. This also avoids possible buffer overflows if the provided +fields are too long. +--- + contrib/minizip/zip.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c +index 3d3d4ca..0446109 100644 +--- a/contrib/minizip/zip.c ++++ b/contrib/minizip/zip.c +@@ -1043,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c + return ZIP_PARAMERROR; + #endif + ++ // The filename and comment length must fit in 16 bits. ++ if ((filename!=NULL) && (strlen(filename)>0xffff)) ++ return ZIP_PARAMERROR; ++ if ((comment!=NULL) && (strlen(comment)>0xffff)) ++ return ZIP_PARAMERROR; ++ // The extra field length must fit in 16 bits. If the member also requires ++ // a Zip64 extra block, that will also need to fit within that 16-bit ++ // length, but that will be checked for later. ++ if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) ++ return ZIP_PARAMERROR; ++ + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) +-- +2.41.0 + diff --git a/zlib.spec b/zlib.spec index b6c8247..b39ba8f 100644 --- a/zlib.spec +++ b/zlib.spec @@ -2,7 +2,7 @@ Name: zlib Version: 1.2.13 -Release: 4%{?dist} +Release: 5%{?dist} Summary: Compression and decompression library # /contrib/dotzlib/ have Boost license License: Zlib AND BSL-1.0 @@ -30,6 +30,8 @@ Patch22: zlib-1.2.11-covscan-issues.patch # fixed issues found by covscan for rhel-9 # ref: https://github.com/madler/zlib/pull/554 Patch23: zlib-1.2.11-covscan-issues-rhel9.patch +# Upstream patch: https://github.com/madler/zlib/commit/73331a6a0481067628f065ffe87bb1d8f787d10c +Patch24: zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch BuildRequires: make BuildRequires: automake, autoconf, libtool @@ -91,6 +93,7 @@ developing applications which use minizip. %patch -P20 -p1 %patch -P22 -p1 %patch -P23 -p1 +%patch -P24 -p1 # Patch19 conflicts with Patch1, so the Patch1 has to be applied after, # because it is arch specific %ifarch s390 s390x @@ -173,6 +176,10 @@ find $RPM_BUILD_ROOT -name '*.la' -delete %changelog +* Tue Oct 17 2023 Lukas Javorsky - 1.2.13-5 +- Applied upstream commit 73331a6a0481067628f065ffe87bb1d8f787d10c +- Resolves: CVE-2023-45853 + * Sat Jul 22 2023 Fedora Release Engineering - 1.2.13-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From 21593df55f1c52c56624a712b5c6751ec90c5aa2 Mon Sep 17 00:00:00 2001 From: Lukas Javorsky Date: Wed, 24 Jan 2024 10:17:38 +0000 Subject: [PATCH 28/28] Zlib has been obsoleted by zlib-ng, more in https://fedoraproject.org/wiki/Changes/ZlibNGTransition --- .fmf/version | 1 - .gitignore | 4 - STAGE1-zlib | 13 - ci.fmf | 1 - dead.package | 1 + gating.yaml | 27 - plans/internal.fmf | 21 - plans/public.fmf | 7 - sources | 1 - zlib-1.2.11-covscan-issues-rhel9.patch | 30 - zlib-1.2.11-covscan-issues.patch | 23 - zlib-1.2.13-Fix-bug-in-deflateBound.patch | 30 - ...-1.2.13-IBM-Z-hw-accelerated-deflate.patch | 2157 ------------- ...lows-of-zip-header-fields-in-minizip.patch | 39 - zlib-1.2.13-optimized-s390.patch | 39 - zlib-1.2.13-power-optimizations.patch | 2865 ----------------- zlib-1.2.13-s390x-vectorize-crc32.patch | 428 --- zlib-1.2.5-minizip-fixuncrypt.patch | 14 - zlib.spec | 656 ---- 19 files changed, 1 insertion(+), 6356 deletions(-) delete mode 100644 .fmf/version delete mode 100644 .gitignore delete mode 100644 STAGE1-zlib delete mode 100644 ci.fmf create mode 100644 dead.package delete mode 100644 gating.yaml delete mode 100644 plans/internal.fmf delete mode 100644 plans/public.fmf delete mode 100644 sources delete mode 100644 zlib-1.2.11-covscan-issues-rhel9.patch delete mode 100644 zlib-1.2.11-covscan-issues.patch delete mode 100644 zlib-1.2.13-Fix-bug-in-deflateBound.patch delete mode 100644 zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch delete mode 100644 zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch delete mode 100644 zlib-1.2.13-optimized-s390.patch delete mode 100644 zlib-1.2.13-power-optimizations.patch delete mode 100644 zlib-1.2.13-s390x-vectorize-crc32.patch delete mode 100644 zlib-1.2.5-minizip-fixuncrypt.patch delete mode 100644 zlib.spec diff --git a/.fmf/version b/.fmf/version deleted file mode 100644 index d00491f..0000000 --- a/.fmf/version +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c2ff4e6..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/zlib-1.2.11.tar.xz -/zlib-1.2.12.tar.gz -/zlib-1.2.12.tar.xz -/zlib-1.2.13.tar.xz diff --git a/STAGE1-zlib b/STAGE1-zlib deleted file mode 100644 index 4ddd8b3..0000000 --- a/STAGE1-zlib +++ /dev/null @@ -1,13 +0,0 @@ -srpm zlib -mcd $BUILDDIR/t-zlib -rsync -av $SRC/zlib-*/ ./ -if [ "$SUFFIX" = "64" ] -then - ARGS="--libdir=/usr/lib64" -fi -CHOST=${TARGET} \ - prefix=/usr \ - ./configure $ARGS -make -make $J install DESTDIR=${ROOTFS} -fix_la zlib diff --git a/ci.fmf b/ci.fmf deleted file mode 100644 index c5aa0e0..0000000 --- a/ci.fmf +++ /dev/null @@ -1 +0,0 @@ -resultsdb-testcase: separate diff --git a/dead.package b/dead.package new file mode 100644 index 0000000..854edd8 --- /dev/null +++ b/dead.package @@ -0,0 +1 @@ +Zlib has been obsoleted by zlib-ng, more in https://fedoraproject.org/wiki/Changes/ZlibNGTransition diff --git a/gating.yaml b/gating.yaml deleted file mode 100644 index dbde1aa..0000000 --- a/gating.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Branched Fedora (non-Rawhide) ---- !Policy -product_versions: - - fedora-* -decision_context: bodhi_update_push_testing -subject_type: koji_build -rules: - - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/public.functional} - - -# Rawhide Fedora ---- !Policy -product_versions: - - fedora-* -decision_context: bodhi_update_push_stable -subject_type: koji_build -rules: - - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build./plans/public.functional} - -# Gating RHEL ---- !Policy -product_versions: - - rhel-* -decision_context: osci_compose_gate -rules: - - !PassingTestCaseRule {test_case_name: osci.brew-build./plans/internal.functional} - - !PassingTestCaseRule {test_case_name: osci.brew-build./plans/public.functional} diff --git a/plans/internal.fmf b/plans/internal.fmf deleted file mode 100644 index 064c62a..0000000 --- a/plans/internal.fmf +++ /dev/null @@ -1,21 +0,0 @@ -summary: Private (RHEL) beakerlib tests -enabled: false -adjust: - - when: distro == rhel - enabled: true - because: private tests are accesible only within rhel pipline -discover: - - name: rhel-zlib - how: fmf - url: git://pkgs.devel.redhat.com/tests/zlib - filter: "tag:-NoGating" - - name: distribution - how: fmf - url: git://pkgs.devel.redhat.com/tests/distribution - test: /rebuild/TC#0517975 - - name: file - how: fmf - url: git://pkgs.devel.redhat.com/tests/file - test: /Sanity/command-line-options -execute: - how: tmt diff --git a/plans/public.fmf b/plans/public.fmf deleted file mode 100644 index cf84547..0000000 --- a/plans/public.fmf +++ /dev/null @@ -1,7 +0,0 @@ -summary: Public (Fedora) beakerlib tests -discover: - - name: fedora - how: fmf - url: https://src.fedoraproject.org/tests/zlib.git -execute: - how: tmt diff --git a/sources b/sources deleted file mode 100644 index d5a4893..0000000 --- a/sources +++ /dev/null @@ -1 +0,0 @@ -SHA512 (zlib-1.2.13.tar.xz) = 9e7ac71a1824855ae526506883e439456b74ac0b811d54e94f6908249ba8719bec4c8d7672903c5280658b26cb6b5e93ecaaafe5cdc2980c760fa196773f0725 diff --git a/zlib-1.2.11-covscan-issues-rhel9.patch b/zlib-1.2.11-covscan-issues-rhel9.patch deleted file mode 100644 index 2763cbc..0000000 --- a/zlib-1.2.11-covscan-issues-rhel9.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 1e56dd1e7285d3026092ba794078edb290b4c1b1 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Mon, 15 Mar 2021 13:06:35 +0100 -Subject: [PATCH] fixed isues found by covscan - ---- - contrib/minizip/mztools.c | 8 ++++++++ - contrib/minizip/zip.c | 4 ++-- - deflate.c | 5 +++-- - 3 files changed, 13 insertions(+), 4 deletions(-) - -diff --git a/contrib/minizip/mztools.c b/contrib/minizip/mztools.c -index 96891c2..1197928 100644 ---- a/contrib/minizip/mztools.c -+++ b/contrib/minizip/mztools.c -@@ -286,6 +286,14 @@ uLong* bytesRecovered; - } - } else { - err = Z_STREAM_ERROR; -+ if(fpZip != NULL) -+ fclose(fpZip); -+ -+ if(fpOut != NULL) -+ fclose(fpOut); -+ -+ if(fpOutCD != NULL) -+ fclose(fpOutCD); - } - return err; - } diff --git a/zlib-1.2.11-covscan-issues.patch b/zlib-1.2.11-covscan-issues.patch deleted file mode 100644 index 24f9947..0000000 --- a/zlib-1.2.11-covscan-issues.patch +++ /dev/null @@ -1,23 +0,0 @@ -From f776e1609cc63bf486634ee9bc6226dac2c0d2f3 Mon Sep 17 00:00:00 2001 -From: Ondrej Dubaj -Date: Tue, 15 Oct 2019 11:27:15 +0200 -Subject: [PATCH] fixed covscan issues - ---- - deflate.c | 2 +- - test/crc32_test.c | 8 ++++---- - 3 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/deflate.c b/deflate.c -index 089285a..9b09718 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -1015,7 +1015,7 @@ int ZEXPORT deflate (strm, flush) - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { -- block_state bstate; -+ block_state bstate = 0; - - bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : - s->level == 0 ? deflate_stored(s, flush) : diff --git a/zlib-1.2.13-Fix-bug-in-deflateBound.patch b/zlib-1.2.13-Fix-bug-in-deflateBound.patch deleted file mode 100644 index dd655d1..0000000 --- a/zlib-1.2.13-Fix-bug-in-deflateBound.patch +++ /dev/null @@ -1,30 +0,0 @@ -From e554695638228b846d49657f31eeff0ca4680e8a Mon Sep 17 00:00:00 2001 -From: Mark Adler -Date: Thu, 15 Dec 2022 09:07:13 -0800 -Subject: [PATCH] Fix bug in deflateBound() for level 0 and memLevel 9. - -memLevel 9 would cause deflateBound() to assume the use of fixed -blocks, even if the compression level was 0, which forces stored -blocks. That could result in a bound less than the size of the -compressed data. Now level 0 always uses the stored blocks bound. ---- - deflate.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/deflate.c b/deflate.c -index cd538b8..4a512e1 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -752,7 +752,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) - - /* if not default parameters, return one of the conservative bounds */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) -- return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; -+ return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + -+ wraplen; - - /* default settings: return tight bound for that case -- ~0.03% overhead - plus a small constant */ --- -2.38.1 - diff --git a/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch b/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch deleted file mode 100644 index 4a340c5..0000000 --- a/zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch +++ /dev/null @@ -1,2157 +0,0 @@ -From 113203437eda67261848b14b6c80a33ff7e33d34 Mon Sep 17 00:00:00 2001 -From: Ilya Leoshkevich -Date: Wed, 18 Jul 2018 13:14:07 +0200 -Subject: [PATCH] Add support for IBM Z hardware-accelerated deflate - -IBM Z mainframes starting from version z15 provide DFLTCC instruction, -which implements deflate algorithm in hardware with estimated -compression and decompression performance orders of magnitude faster -than the current zlib and ratio comparable with that of level 1. - -This patch adds DFLTCC support to zlib. In order to enable it, the -following build commands should be used: - - $ ./configure --dfltcc - $ make - -When built like this, zlib would compress in hardware on level 1, and in -software on all other levels. Decompression will always happen in -hardware. In order to enable DFLTCC compression for levels 1-6 (i.e. to -make it used by default) one could either configure with ---dfltcc-level-mask=0x7e or set the environment variable -DFLTCC_LEVEL_MASK to 0x7e at run time. - -Two DFLTCC compression calls produce the same results only when they -both are made on machines of the same generation, and when the -respective buffers have the same offset relative to the start of the -page. Therefore care should be taken when using hardware compression -when reproducible results are desired. One such use case - reproducible -software builds - is handled explicitly: when SOURCE_DATE_EPOCH -environment variable is set, the hardware compression is disabled. - -DFLTCC does not support every single zlib feature, in particular: - - * inflate(Z_BLOCK) and inflate(Z_TREES) - * inflateMark() - * inflatePrime() - * inflateSyncPoint() - -When used, these functions will either switch to software, or, in case -this is not possible, gracefully fail. - -This patch tries to add DFLTCC support in the least intrusive way. -All SystemZ-specific code is placed into a separate file, but -unfortunately there is still a noticeable amount of changes in the -main zlib code. Below is the summary of these changes. - -DFLTCC takes as arguments a parameter block, an input buffer, an output -buffer and a window. Since DFLTCC requires parameter block to be -doubleword-aligned, and it's reasonable to allocate it alongside -deflate and inflate states, ZALLOC_STATE, ZFREE_STATE and ZCOPY_STATE -macros were introduced in order to encapsulate the allocation details. -The same is true for window, for which ZALLOC_WINDOW and -TRY_FREE_WINDOW macros were introduced. - -Software and hardware window formats do not match, therefore, -deflateSetDictionary(), deflateGetDictionary(), inflateSetDictionary() -and inflateGetDictionary() need special handling, which is triggered -using DEFLATE_SET_DICTIONARY_HOOK, DEFLATE_GET_DICTIONARY_HOOK, -INFLATE_SET_DICTIONARY_HOOK and INFLATE_GET_DICTIONARY_HOOK macros. - -deflateResetKeep() and inflateResetKeep() now update the DFLTCC -parameter block, which is allocated alongside zlib state, using -the new DEFLATE_RESET_KEEP_HOOK and INFLATE_RESET_KEEP_HOOK macros. - -The new DEFLATE_PARAMS_HOOK switches between hardware and software -deflate implementations when deflateParams() arguments demand this. - -The new INFLATE_PRIME_HOOK, INFLATE_MARK_HOOK and -INFLATE_SYNC_POINT_HOOK macros make the respective unsupported calls -gracefully fail. - -The algorithm implemented in hardware has different compression ratio -than the one implemented in software. In order for deflateBound() to -return the correct results for the hardware implementation, the new -DEFLATE_BOUND_ADJUST_COMPLEN and DEFLATE_NEED_CONSERVATIVE_BOUND macros -were introduced. - -Actual compression and decompression are handled by the new DEFLATE_HOOK -and INFLATE_TYPEDO_HOOK macros. Since inflation with DFLTCC manages the -window on its own, calling updatewindow() is suppressed using the new -INFLATE_NEED_UPDATEWINDOW() macro. - -In addition to compression, DFLTCC computes CRC-32 and Adler-32 -checksums, therefore, whenever it's used, software checksumming needs to -be suppressed using the new DEFLATE_NEED_CHECKSUM and -INFLATE_NEED_CHECKSUM macros. - -DFLTCC will refuse to write an End-of-block Symbol if there is no input -data, thus in some cases it is necessary to do this manually. In order -to achieve this, send_bits, bi_reverse, bi_windup and flush_pending -were promoted from local to ZLIB_INTERNAL. Furthermore, since block and -stream termination must be handled in software as well, block_state enum -was moved to deflate.h. - -Since the first call to dfltcc_inflate already needs the window, and it -might be not allocated yet, inflate_ensure_window was factored out of -updatewindow and made ZLIB_INTERNAL. ---- - Makefile.in | 8 + - compress.c | 14 +- - configure | 24 + - contrib/README.contrib | 4 + - contrib/s390/README.txt | 17 + - contrib/s390/dfltcc.c | 1089 +++++++++++++++++++++++++++++++++ - contrib/s390/dfltcc.h | 100 +++ - contrib/s390/dfltcc_deflate.h | 55 ++ - deflate.c | 82 ++- - deflate.h | 12 + - gzguts.h | 4 + - inflate.c | 97 ++- - inflate.h | 2 + - test/infcover.c | 4 +- - test/minigzip.c | 4 + - trees.c | 13 +- - zutil.h | 2 + - 17 files changed, 1469 insertions(+), 62 deletions(-) - create mode 100644 contrib/s390/README.txt - create mode 100644 contrib/s390/dfltcc.c - create mode 100644 contrib/s390/dfltcc.h - create mode 100644 contrib/s390/dfltcc_deflate.h - -diff --git a/Makefile.in b/Makefile.in -index 83d8ca4..54c529b 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -139,6 +139,14 @@ match.lo: match.S - mv _match.o match.lo - rm -f _match.s - -+dfltcc.o: $(SRCDIR)contrib/s390/dfltcc.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/dfltcc.c -+ -+dfltcc.lo: $(SRCDIR)contrib/s390/dfltcc.c $(SRCDIR)zlib.h zconf.h -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/dfltcc.o $(SRCDIR)contrib/s390/dfltcc.c -+ -@mv objs/dfltcc.o $@ -+ - crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c - -diff --git a/compress.c b/compress.c -index 2ad5326..179ee27 100644 ---- a/compress.c -+++ b/compress.c -@@ -5,9 +5,15 @@ - - /* @(#) $Id$ */ - --#define ZLIB_INTERNAL -+#include "zutil.h" - #include "zlib.h" - -+#ifdef DFLTCC -+# include "contrib/s390/dfltcc.h" -+#else -+#define DEFLATE_BOUND_COMPLEN(source_len) 0 -+#endif -+ - /* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte -@@ -81,6 +87,12 @@ int ZEXPORT compress(dest, destLen, source, sourceLen) - uLong ZEXPORT compressBound(sourceLen) - uLong sourceLen; - { -+ uLong complen = DEFLATE_BOUND_COMPLEN(sourceLen); -+ -+ if (complen > 0) -+ /* Architecture-specific code provided an upper bound. */ -+ return complen + ZLIB_WRAPLEN; -+ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13; - } -diff --git a/configure b/configure -index 45d51e5..ab3204a 100755 ---- a/configure -+++ b/configure -@@ -118,6 +118,7 @@ case "$1" in - echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log - echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log - echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log -+ echo ' [--dfltcc] [--dfltcc-level-mask=MASK]' | tee -a configure.log - exit 0 ;; - -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; - -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; -@@ -142,6 +143,16 @@ case "$1" in - -w* | --warn) warn=1; shift ;; - -d* | --debug) debug=1; shift ;; - --sanitize) sanitize=1; shift ;; -+ --dfltcc) -+ CFLAGS="$CFLAGS -DDFLTCC" -+ OBJC="$OBJC dfltcc.o" -+ PIC_OBJC="$PIC_OBJC dfltcc.lo" -+ shift -+ ;; -+ --dfltcc-level-mask=*) -+ CFLAGS="$CFLAGS -DDFLTCC_LEVEL_MASK=`echo $1 | sed 's/.*=//'`" -+ shift -+ ;; - *) - echo "unknown option: $1" | tee -a configure.log - echo "$0 --help for help" | tee -a configure.log -@@ -828,6 +839,19 @@ EOF - fi - fi - -+# Check whether sys/sdt.h is available -+cat > $test.c << EOF -+#include -+int main() { return 0; } -+EOF -+if try $CC -c $CFLAGS $test.c; then -+ echo "Checking for sys/sdt.h ... Yes." | tee -a configure.log -+ CFLAGS="$CFLAGS -DHAVE_SYS_SDT_H" -+ SFLAGS="$SFLAGS -DHAVE_SYS_SDT_H" -+else -+ echo "Checking for sys/sdt.h ... No." | tee -a configure.log -+fi -+ - # test to see if we can use a gnu indirection function to detect and load optimized code at runtime - echo >> configure.log - cat > $test.c < - Small, low memory usage inflate. Also serves to provide an - unambiguous description of the deflate format. - -+s390/ by Ilya Leoshkevich -+ Hardware-accelerated deflate on IBM Z with DEFLATE CONVERSION CALL -+ instruction. -+ - testzlib/ by Gilles Vollant - Example of the use of zlib - -diff --git a/contrib/s390/README.txt b/contrib/s390/README.txt -new file mode 100644 -index 0000000..48be008 ---- /dev/null -+++ b/contrib/s390/README.txt -@@ -0,0 +1,17 @@ -+IBM Z mainframes starting from version z15 provide DFLTCC instruction, -+which implements deflate algorithm in hardware with estimated -+compression and decompression performance orders of magnitude faster -+than the current zlib and ratio comparable with that of level 1. -+ -+This directory adds DFLTCC support. In order to enable it, the following -+build commands should be used: -+ -+ $ ./configure --dfltcc -+ $ make -+ -+When built like this, zlib would compress in hardware on level 1, and in -+software on all other levels. Decompression will always happen in -+hardware. In order to enable DFLTCC compression for levels 1-6 (i.e. to -+make it used by default) one could either configure with -+--dfltcc-level-mask=0x7e or set the environment variable -+DFLTCC_LEVEL_MASK to 0x7e at run time. -diff --git a/contrib/s390/dfltcc.c b/contrib/s390/dfltcc.c -new file mode 100644 -index 0000000..b8c20bd ---- /dev/null -+++ b/contrib/s390/dfltcc.c -@@ -0,0 +1,1089 @@ -+/* dfltcc.c - SystemZ DEFLATE CONVERSION CALL support. */ -+ -+/* -+ Use the following commands to build zlib with DFLTCC support: -+ -+ $ ./configure --dfltcc -+ $ make -+*/ -+ -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "../../zutil.h" -+#include "../../deflate.h" -+#include "../../inftrees.h" -+#include "../../inflate.h" -+#include "dfltcc.h" -+#include "dfltcc_deflate.h" -+#ifdef HAVE_SYS_SDT_H -+#include -+#endif -+ -+/* -+ C wrapper for the DEFLATE CONVERSION CALL instruction. -+ */ -+typedef enum { -+ DFLTCC_CC_OK = 0, -+ DFLTCC_CC_OP1_TOO_SHORT = 1, -+ DFLTCC_CC_OP2_TOO_SHORT = 2, -+ DFLTCC_CC_OP2_CORRUPT = 2, -+ DFLTCC_CC_AGAIN = 3, -+} dfltcc_cc; -+ -+#define DFLTCC_QAF 0 -+#define DFLTCC_GDHT 1 -+#define DFLTCC_CMPR 2 -+#define DFLTCC_XPND 4 -+#define HBT_CIRCULAR (1 << 7) -+#define HB_BITS 15 -+#define HB_SIZE (1 << HB_BITS) -+#define DFLTCC_FACILITY 151 -+ -+local inline dfltcc_cc dfltcc OF((int fn, void *param, -+ Bytef **op1, size_t *len1, -+ z_const Bytef **op2, size_t *len2, -+ void *hist)); -+local inline dfltcc_cc dfltcc(fn, param, op1, len1, op2, len2, hist) -+ int fn; -+ void *param; -+ Bytef **op1; -+ size_t *len1; -+ z_const Bytef **op2; -+ size_t *len2; -+ void *hist; -+{ -+ Bytef *t2 = op1 ? *op1 : NULL; -+ size_t t3 = len1 ? *len1 : 0; -+ z_const Bytef *t4 = op2 ? *op2 : NULL; -+ size_t t5 = len2 ? *len2 : 0; -+ register int r0 __asm__("r0") = fn; -+ register void *r1 __asm__("r1") = param; -+ register Bytef *r2 __asm__("r2") = t2; -+ register size_t r3 __asm__("r3") = t3; -+ register z_const Bytef *r4 __asm__("r4") = t4; -+ register size_t r5 __asm__("r5") = t5; -+ int cc; -+ -+ __asm__ volatile( -+#ifdef HAVE_SYS_SDT_H -+ STAP_PROBE_ASM(zlib, dfltcc_entry, -+ STAP_PROBE_ASM_TEMPLATE(5)) -+#endif -+ ".insn rrf,0xb9390000,%[r2],%[r4],%[hist],0\n" -+#ifdef HAVE_SYS_SDT_H -+ STAP_PROBE_ASM(zlib, dfltcc_exit, -+ STAP_PROBE_ASM_TEMPLATE(5)) -+#endif -+ "ipm %[cc]\n" -+ : [r2] "+r" (r2) -+ , [r3] "+r" (r3) -+ , [r4] "+r" (r4) -+ , [r5] "+r" (r5) -+ , [cc] "=r" (cc) -+ : [r0] "r" (r0) -+ , [r1] "r" (r1) -+ , [hist] "r" (hist) -+#ifdef HAVE_SYS_SDT_H -+ , STAP_PROBE_ASM_OPERANDS(5, r2, r3, r4, r5, hist) -+#endif -+ : "cc", "memory"); -+ t2 = r2; t3 = r3; t4 = r4; t5 = r5; -+ -+ if (op1) -+ *op1 = t2; -+ if (len1) -+ *len1 = t3; -+ if (op2) -+ *op2 = t4; -+ if (len2) -+ *len2 = t5; -+ return (cc >> 28) & 3; -+} -+ -+/* -+ Parameter Block for Query Available Functions. -+ */ -+#define static_assert(c, msg) \ -+ __attribute__((unused)) \ -+ static char static_assert_failed_ ## msg[c ? 1 : -1] -+ -+struct dfltcc_qaf_param { -+ char fns[16]; -+ char reserved1[8]; -+ char fmts[2]; -+ char reserved2[6]; -+}; -+ -+static_assert(sizeof(struct dfltcc_qaf_param) == 32, -+ sizeof_struct_dfltcc_qaf_param_is_32); -+ -+local inline int is_bit_set OF((const char *bits, int n)); -+local inline int is_bit_set(bits, n) -+ const char *bits; -+ int n; -+{ -+ return bits[n / 8] & (1 << (7 - (n % 8))); -+} -+ -+local inline void clear_bit OF((char *bits, int n)); -+local inline void clear_bit(bits, n) -+ char *bits; -+ int n; -+{ -+ bits[n / 8] &= ~(1 << (7 - (n % 8))); -+} -+ -+#define DFLTCC_FMT0 0 -+ -+/* -+ Parameter Block for Generate Dynamic-Huffman Table, Compress and Expand. -+ */ -+#define CVT_CRC32 0 -+#define CVT_ADLER32 1 -+#define HTT_FIXED 0 -+#define HTT_DYNAMIC 1 -+ -+struct dfltcc_param_v0 { -+ uint16_t pbvn; /* Parameter-Block-Version Number */ -+ uint8_t mvn; /* Model-Version Number */ -+ uint8_t ribm; /* Reserved for IBM use */ -+ unsigned reserved32 : 31; -+ unsigned cf : 1; /* Continuation Flag */ -+ uint8_t reserved64[8]; -+ unsigned nt : 1; /* New Task */ -+ unsigned reserved129 : 1; -+ unsigned cvt : 1; /* Check Value Type */ -+ unsigned reserved131 : 1; -+ unsigned htt : 1; /* Huffman-Table Type */ -+ unsigned bcf : 1; /* Block-Continuation Flag */ -+ unsigned bcc : 1; /* Block Closing Control */ -+ unsigned bhf : 1; /* Block Header Final */ -+ unsigned reserved136 : 1; -+ unsigned reserved137 : 1; -+ unsigned dhtgc : 1; /* DHT Generation Control */ -+ unsigned reserved139 : 5; -+ unsigned reserved144 : 5; -+ unsigned sbb : 3; /* Sub-Byte Boundary */ -+ uint8_t oesc; /* Operation-Ending-Supplemental Code */ -+ unsigned reserved160 : 12; -+ unsigned ifs : 4; /* Incomplete-Function Status */ -+ uint16_t ifl; /* Incomplete-Function Length */ -+ uint8_t reserved192[8]; -+ uint8_t reserved256[8]; -+ uint8_t reserved320[4]; -+ uint16_t hl; /* History Length */ -+ unsigned reserved368 : 1; -+ uint16_t ho : 15; /* History Offset */ -+ uint32_t cv; /* Check Value */ -+ unsigned eobs : 15; /* End-of-block Symbol */ -+ unsigned reserved431: 1; -+ uint8_t eobl : 4; /* End-of-block Length */ -+ unsigned reserved436 : 12; -+ unsigned reserved448 : 4; -+ uint16_t cdhtl : 12; /* Compressed-Dynamic-Huffman Table -+ Length */ -+ uint8_t reserved464[6]; -+ uint8_t cdht[288]; -+ uint8_t reserved[32]; -+ uint8_t csb[1152]; -+}; -+ -+static_assert(sizeof(struct dfltcc_param_v0) == 1536, -+ sizeof_struct_dfltcc_param_v0_is_1536); -+ -+local z_const char *oesc_msg OF((char *buf, int oesc)); -+local z_const char *oesc_msg(buf, oesc) -+ char *buf; -+ int oesc; -+{ -+ if (oesc == 0x00) -+ return NULL; /* Successful completion */ -+ else { -+ sprintf(buf, "Operation-Ending-Supplemental Code is 0x%.2X", oesc); -+ return buf; -+ } -+} -+ -+/* -+ Extension of inflate_state and deflate_state. Must be doubleword-aligned. -+*/ -+struct dfltcc_state { -+ struct dfltcc_param_v0 param; /* Parameter block. */ -+ struct dfltcc_qaf_param af; /* Available functions. */ -+ uLong level_mask; /* Levels on which to use DFLTCC */ -+ uLong block_size; /* New block each X bytes */ -+ uLong block_threshold; /* New block after total_in > X */ -+ uLong dht_threshold; /* New block only if avail_in >= X */ -+ char msg[64]; /* Buffer for strm->msg */ -+}; -+ -+#define ALIGN_UP(p, size) \ -+ (__typeof__(p))(((uintptr_t)(p) + ((size) - 1)) & ~((size) - 1)) -+ -+#define GET_DFLTCC_STATE(state) ((struct dfltcc_state FAR *)( \ -+ (char FAR *)(state) + ALIGN_UP(sizeof(*state), 8))) -+ -+/* -+ Compress. -+ */ -+local inline int dfltcc_can_deflate_with_params(z_streamp strm, -+ int level, -+ uInt window_bits, -+ int strategy); -+local inline int dfltcc_can_deflate_with_params(strm, -+ level, -+ window_bits, -+ strategy) -+ z_streamp strm; -+ int level; -+ uInt window_bits; -+ int strategy; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ -+ /* Unsupported compression settings */ -+ if ((dfltcc_state->level_mask & (1 << level)) == 0) -+ return 0; -+ if (window_bits != HB_BITS) -+ return 0; -+ if (strategy != Z_FIXED && strategy != Z_DEFAULT_STRATEGY) -+ return 0; -+ -+ /* Unsupported hardware */ -+ if (!is_bit_set(dfltcc_state->af.fns, DFLTCC_GDHT) || -+ !is_bit_set(dfltcc_state->af.fns, DFLTCC_CMPR) || -+ !is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0)) -+ return 0; -+ -+ return 1; -+} -+ -+int ZLIB_INTERNAL dfltcc_can_deflate(strm) -+ z_streamp strm; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ -+ return dfltcc_can_deflate_with_params(strm, -+ state->level, -+ state->w_bits, -+ state->strategy); -+} -+ -+local void dfltcc_gdht OF((z_streamp strm)); -+local void dfltcc_gdht(strm) -+ z_streamp strm; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_param_v0 FAR *param = &GET_DFLTCC_STATE(state)->param; -+ size_t avail_in = avail_in = strm->avail_in; -+ -+ dfltcc(DFLTCC_GDHT, -+ param, NULL, NULL, -+ &strm->next_in, &avail_in, NULL); -+} -+ -+local dfltcc_cc dfltcc_cmpr OF((z_streamp strm)); -+local dfltcc_cc dfltcc_cmpr(strm) -+ z_streamp strm; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_param_v0 FAR *param = &GET_DFLTCC_STATE(state)->param; -+ size_t avail_in = strm->avail_in; -+ size_t avail_out = strm->avail_out; -+ dfltcc_cc cc; -+ -+ cc = dfltcc(DFLTCC_CMPR | HBT_CIRCULAR, -+ param, &strm->next_out, &avail_out, -+ &strm->next_in, &avail_in, state->window); -+ strm->total_in += (strm->avail_in - avail_in); -+ strm->total_out += (strm->avail_out - avail_out); -+ strm->avail_in = avail_in; -+ strm->avail_out = avail_out; -+ return cc; -+} -+ -+local void send_eobs OF((z_streamp strm, -+ z_const struct dfltcc_param_v0 FAR *param)); -+local void send_eobs(strm, param) -+ z_streamp strm; -+ z_const struct dfltcc_param_v0 FAR *param; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ -+ _tr_send_bits( -+ state, -+ bi_reverse(param->eobs >> (15 - param->eobl), param->eobl), -+ param->eobl); -+ flush_pending(strm); -+ if (state->pending != 0) { -+ /* The remaining data is located in pending_out[0:pending]. If someone -+ * calls put_byte() - this might happen in deflate() - the byte will be -+ * placed into pending_buf[pending], which is incorrect. Move the -+ * remaining data to the beginning of pending_buf so that put_byte() is -+ * usable again. -+ */ -+ memmove(state->pending_buf, state->pending_out, state->pending); -+ state->pending_out = state->pending_buf; -+ } -+#ifdef ZLIB_DEBUG -+ state->compressed_len += param->eobl; -+#endif -+} -+ -+int ZLIB_INTERNAL dfltcc_deflate(strm, flush, result) -+ z_streamp strm; -+ int flush; -+ block_state *result; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ uInt masked_avail_in; -+ dfltcc_cc cc; -+ int need_empty_block; -+ int soft_bcc; -+ int no_flush; -+ -+ if (!dfltcc_can_deflate(strm)) { -+ /* Clear history. */ -+ if (flush == Z_FULL_FLUSH) -+ param->hl = 0; -+ return 0; -+ } -+ -+again: -+ masked_avail_in = 0; -+ soft_bcc = 0; -+ no_flush = flush == Z_NO_FLUSH; -+ -+ /* No input data. Return, except when Continuation Flag is set, which means -+ * that DFLTCC has buffered some output in the parameter block and needs to -+ * be called again in order to flush it. -+ */ -+ if (strm->avail_in == 0 && !param->cf) { -+ /* A block is still open, and the hardware does not support closing -+ * blocks without adding data. Thus, close it manually. -+ */ -+ if (!no_flush && param->bcf) { -+ send_eobs(strm, param); -+ param->bcf = 0; -+ } -+ /* Let one of deflate_* functions write a trailing empty block. */ -+ if (flush == Z_FINISH) -+ return 0; -+ /* Clear history. */ -+ if (flush == Z_FULL_FLUSH) -+ param->hl = 0; -+ /* Trigger block post-processing if necessary. */ -+ *result = no_flush ? need_more : block_done; -+ return 1; -+ } -+ -+ /* There is an open non-BFINAL block, we are not going to close it just -+ * yet, we have compressed more than DFLTCC_BLOCK_SIZE bytes and we see -+ * more than DFLTCC_DHT_MIN_SAMPLE_SIZE bytes. Open a new block with a new -+ * DHT in order to adapt to a possibly changed input data distribution. -+ */ -+ if (param->bcf && no_flush && -+ strm->total_in > dfltcc_state->block_threshold && -+ strm->avail_in >= dfltcc_state->dht_threshold) { -+ if (param->cf) { -+ /* We need to flush the DFLTCC buffer before writing the -+ * End-of-block Symbol. Mask the input data and proceed as usual. -+ */ -+ masked_avail_in += strm->avail_in; -+ strm->avail_in = 0; -+ no_flush = 0; -+ } else { -+ /* DFLTCC buffer is empty, so we can manually write the -+ * End-of-block Symbol right away. -+ */ -+ send_eobs(strm, param); -+ param->bcf = 0; -+ dfltcc_state->block_threshold = -+ strm->total_in + dfltcc_state->block_size; -+ } -+ } -+ -+ /* No space for compressed data. If we proceed, dfltcc_cmpr() will return -+ * DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still -+ * set BCF=1, which is wrong. Avoid complications and return early. -+ */ -+ if (strm->avail_out == 0) { -+ *result = need_more; -+ return 1; -+ } -+ -+ /* The caller gave us too much data. Pass only one block worth of -+ * uncompressed data to DFLTCC and mask the rest, so that on the next -+ * iteration we start a new block. -+ */ -+ if (no_flush && strm->avail_in > dfltcc_state->block_size) { -+ masked_avail_in += (strm->avail_in - dfltcc_state->block_size); -+ strm->avail_in = dfltcc_state->block_size; -+ } -+ -+ /* When we have an open non-BFINAL deflate block and caller indicates that -+ * the stream is ending, we need to close an open deflate block and open a -+ * BFINAL one. -+ */ -+ need_empty_block = flush == Z_FINISH && param->bcf && !param->bhf; -+ -+ /* Translate stream to parameter block */ -+ param->cvt = state->wrap == 2 ? CVT_CRC32 : CVT_ADLER32; -+ if (!no_flush) -+ /* We need to close a block. Always do this in software - when there is -+ * no input data, the hardware will not honor BCC. */ -+ soft_bcc = 1; -+ if (flush == Z_FINISH && !param->bcf) -+ /* We are about to open a BFINAL block, set Block Header Final bit -+ * until the stream ends. -+ */ -+ param->bhf = 1; -+ /* DFLTCC-CMPR will write to next_out, so make sure that buffers with -+ * higher precedence are empty. -+ */ -+ Assert(state->pending == 0, "There must be no pending bytes"); -+ Assert(state->bi_valid < 8, "There must be less than 8 pending bits"); -+ param->sbb = (unsigned int)state->bi_valid; -+ if (param->sbb > 0) -+ *strm->next_out = (Bytef)state->bi_buf; -+ /* Honor history and check value */ -+ param->nt = 0; -+ if (state->wrap == 1) -+ param->cv = strm->adler; -+ else if (state->wrap == 2) -+ param->cv = ZSWAP32(strm->adler); -+ -+ /* When opening a block, choose a Huffman-Table Type */ -+ if (!param->bcf) { -+ if (state->strategy == Z_FIXED || -+ (strm->total_in == 0 && dfltcc_state->block_threshold > 0)) -+ param->htt = HTT_FIXED; -+ else { -+ param->htt = HTT_DYNAMIC; -+ dfltcc_gdht(strm); -+ } -+ } -+ -+ /* Deflate */ -+ do { -+ cc = dfltcc_cmpr(strm); -+ if (strm->avail_in < 4096 && masked_avail_in > 0) -+ /* We are about to call DFLTCC with a small input buffer, which is -+ * inefficient. Since there is masked data, there will be at least -+ * one more DFLTCC call, so skip the current one and make the next -+ * one handle more data. -+ */ -+ break; -+ } while (cc == DFLTCC_CC_AGAIN); -+ -+ /* Translate parameter block to stream */ -+ strm->msg = oesc_msg(dfltcc_state->msg, param->oesc); -+ state->bi_valid = param->sbb; -+ if (state->bi_valid == 0) -+ state->bi_buf = 0; /* Avoid accessing next_out */ -+ else -+ state->bi_buf = *strm->next_out & ((1 << state->bi_valid) - 1); -+ if (state->wrap == 1) -+ strm->adler = param->cv; -+ else if (state->wrap == 2) -+ strm->adler = ZSWAP32(param->cv); -+ -+ /* Unmask the input data */ -+ strm->avail_in += masked_avail_in; -+ masked_avail_in = 0; -+ -+ /* If we encounter an error, it means there is a bug in DFLTCC call */ -+ Assert(cc != DFLTCC_CC_OP2_CORRUPT || param->oesc == 0, "BUG"); -+ -+ /* Update Block-Continuation Flag. It will be used to check whether to call -+ * GDHT the next time. -+ */ -+ if (cc == DFLTCC_CC_OK) { -+ if (soft_bcc) { -+ send_eobs(strm, param); -+ param->bcf = 0; -+ dfltcc_state->block_threshold = -+ strm->total_in + dfltcc_state->block_size; -+ } else -+ param->bcf = 1; -+ if (flush == Z_FINISH) { -+ if (need_empty_block) -+ /* Make the current deflate() call also close the stream */ -+ return 0; -+ else { -+ bi_windup(state); -+ *result = finish_done; -+ } -+ } else { -+ if (flush == Z_FULL_FLUSH) -+ param->hl = 0; /* Clear history */ -+ *result = flush == Z_NO_FLUSH ? need_more : block_done; -+ } -+ } else { -+ param->bcf = 1; -+ *result = need_more; -+ } -+ if (strm->avail_in != 0 && strm->avail_out != 0) -+ goto again; /* deflate() must use all input or all output */ -+ return 1; -+} -+ -+/* -+ Expand. -+ */ -+int ZLIB_INTERNAL dfltcc_can_inflate(strm) -+ z_streamp strm; -+{ -+ struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ -+ /* Unsupported hardware */ -+ return is_bit_set(dfltcc_state->af.fns, DFLTCC_XPND) && -+ is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0); -+} -+ -+local dfltcc_cc dfltcc_xpnd OF((z_streamp strm)); -+local dfltcc_cc dfltcc_xpnd(strm) -+ z_streamp strm; -+{ -+ struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; -+ struct dfltcc_param_v0 FAR *param = &GET_DFLTCC_STATE(state)->param; -+ size_t avail_in = strm->avail_in; -+ size_t avail_out = strm->avail_out; -+ dfltcc_cc cc; -+ -+ cc = dfltcc(DFLTCC_XPND | HBT_CIRCULAR, -+ param, &strm->next_out, &avail_out, -+ &strm->next_in, &avail_in, state->window); -+ strm->avail_in = avail_in; -+ strm->avail_out = avail_out; -+ return cc; -+} -+ -+dfltcc_inflate_action ZLIB_INTERNAL dfltcc_inflate(strm, flush, ret) -+ z_streamp strm; -+ int flush; -+ int *ret; -+{ -+ struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ dfltcc_cc cc; -+ -+ if (flush == Z_BLOCK || flush == Z_TREES) { -+ /* DFLTCC does not support stopping on block boundaries */ -+ if (dfltcc_inflate_disable(strm)) { -+ *ret = Z_STREAM_ERROR; -+ return DFLTCC_INFLATE_BREAK; -+ } else -+ return DFLTCC_INFLATE_SOFTWARE; -+ } -+ -+ if (state->last) { -+ if (state->bits != 0) { -+ strm->next_in++; -+ strm->avail_in--; -+ state->bits = 0; -+ } -+ state->mode = CHECK; -+ return DFLTCC_INFLATE_CONTINUE; -+ } -+ -+ if (strm->avail_in == 0 && !param->cf) -+ return DFLTCC_INFLATE_BREAK; -+ -+ if (inflate_ensure_window(state)) { -+ state->mode = MEM; -+ return DFLTCC_INFLATE_CONTINUE; -+ } -+ -+ /* Translate stream to parameter block */ -+ param->cvt = ((state->wrap & 4) && state->flags) ? CVT_CRC32 : CVT_ADLER32; -+ param->sbb = state->bits; -+ if (param->hl) -+ param->nt = 0; /* Honor history for the first block */ -+ if (state->wrap & 4) -+ param->cv = state->flags ? ZSWAP32(state->check) : state->check; -+ -+ /* Inflate */ -+ do { -+ cc = dfltcc_xpnd(strm); -+ } while (cc == DFLTCC_CC_AGAIN); -+ -+ /* Translate parameter block to stream */ -+ strm->msg = oesc_msg(dfltcc_state->msg, param->oesc); -+ state->last = cc == DFLTCC_CC_OK; -+ state->bits = param->sbb; -+ if (state->wrap & 4) -+ strm->adler = state->check = state->flags ? -+ ZSWAP32(param->cv) : param->cv; -+ if (cc == DFLTCC_CC_OP2_CORRUPT && param->oesc != 0) { -+ /* Report an error if stream is corrupted */ -+ state->mode = BAD; -+ return DFLTCC_INFLATE_CONTINUE; -+ } -+ state->mode = TYPEDO; -+ /* Break if operands are exhausted, otherwise continue looping */ -+ return (cc == DFLTCC_CC_OP1_TOO_SHORT || cc == DFLTCC_CC_OP2_TOO_SHORT) ? -+ DFLTCC_INFLATE_BREAK : DFLTCC_INFLATE_CONTINUE; -+} -+ -+int ZLIB_INTERNAL dfltcc_was_inflate_used(strm) -+ z_streamp strm; -+{ -+ struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; -+ struct dfltcc_param_v0 FAR *param = &GET_DFLTCC_STATE(state)->param; -+ -+ return !param->nt; -+} -+ -+/* -+ Rotates a circular buffer. -+ The implementation is based on https://cplusplus.com/reference/algorithm/rotate/ -+ */ -+local void rotate OF((Bytef *start, Bytef *pivot, Bytef *end)); -+local void rotate(start, pivot, end) -+ Bytef *start; -+ Bytef *pivot; -+ Bytef *end; -+{ -+ Bytef *p = pivot; -+ Bytef tmp; -+ -+ while (p != start) { -+ tmp = *start; -+ *start = *p; -+ *p = tmp; -+ -+ start++; -+ p++; -+ -+ if (p == end) -+ p = pivot; -+ else if (start == pivot) -+ pivot = p; -+ } -+} -+ -+#define MIN(x, y) ({ \ -+ typeof(x) _x = (x); \ -+ typeof(y) _y = (y); \ -+ _x < _y ? _x : _y; \ -+}) -+ -+#define MAX(x, y) ({ \ -+ typeof(x) _x = (x); \ -+ typeof(y) _y = (y); \ -+ _x > _y ? _x : _y; \ -+}) -+ -+int ZLIB_INTERNAL dfltcc_inflate_disable(strm) -+ z_streamp strm; -+{ -+ struct inflate_state FAR *state = (struct inflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 *param = &dfltcc_state->param; -+ -+ if (!dfltcc_can_inflate(strm)) -+ return 0; -+ if (dfltcc_was_inflate_used(strm)) -+ /* DFLTCC has already decompressed some data. Since there is not -+ * enough information to resume decompression in software, the call -+ * must fail. -+ */ -+ return 1; -+ /* DFLTCC was not used yet - decompress in software */ -+ memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af)); -+ /* Convert the window from the hardware to the software format */ -+ rotate(state->window, state->window + param->ho, state->window + HB_SIZE); -+ state->whave = state->wnext = MIN(param->hl, state->wsize); -+ return 0; -+} -+ -+local int env_dfltcc_disabled; -+local int env_source_date_epoch; -+local unsigned long env_level_mask; -+local unsigned long env_block_size; -+local unsigned long env_block_threshold; -+local unsigned long env_dht_threshold; -+local unsigned long env_ribm; -+local uint64_t cpu_facilities[(DFLTCC_FACILITY / 64) + 1]; -+local struct dfltcc_qaf_param cpu_af __attribute__((aligned(8))); -+ -+local inline int is_dfltcc_enabled OF((void)); -+local inline int is_dfltcc_enabled(void) -+{ -+ if (env_dfltcc_disabled) -+ /* User has explicitly disabled DFLTCC. */ -+ return 0; -+ -+ return is_bit_set((const char *)cpu_facilities, DFLTCC_FACILITY); -+} -+ -+local unsigned long xstrtoul OF((const char *s, unsigned long _default)); -+local unsigned long xstrtoul(s, _default) -+ const char *s; -+ unsigned long _default; -+{ -+ char *endptr; -+ unsigned long result; -+ -+ if (!(s && *s)) -+ return _default; -+ errno = 0; -+ result = strtoul(s, &endptr, 0); -+ return (errno || *endptr) ? _default : result; -+} -+ -+__attribute__((constructor)) local void init_globals OF((void)); -+__attribute__((constructor)) local void init_globals(void) -+{ -+ const char *env; -+ register char r0 __asm__("r0"); -+ -+ env = secure_getenv("DFLTCC"); -+ env_dfltcc_disabled = env && !strcmp(env, "0"); -+ -+ env = secure_getenv("SOURCE_DATE_EPOCH"); -+ env_source_date_epoch = !!env; -+ -+#ifndef DFLTCC_LEVEL_MASK -+#define DFLTCC_LEVEL_MASK 0x2 -+#endif -+ env_level_mask = xstrtoul(secure_getenv("DFLTCC_LEVEL_MASK"), -+ DFLTCC_LEVEL_MASK); -+ -+#ifndef DFLTCC_BLOCK_SIZE -+#define DFLTCC_BLOCK_SIZE 1048576 -+#endif -+ env_block_size = xstrtoul(secure_getenv("DFLTCC_BLOCK_SIZE"), -+ DFLTCC_BLOCK_SIZE); -+ -+#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE -+#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096 -+#endif -+ env_block_threshold = xstrtoul(secure_getenv("DFLTCC_FIRST_FHT_BLOCK_SIZE"), -+ DFLTCC_FIRST_FHT_BLOCK_SIZE); -+ -+#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE -+#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096 -+#endif -+ env_dht_threshold = xstrtoul(secure_getenv("DFLTCC_DHT_MIN_SAMPLE_SIZE"), -+ DFLTCC_DHT_MIN_SAMPLE_SIZE); -+ -+#ifndef DFLTCC_RIBM -+#define DFLTCC_RIBM 0 -+#endif -+ env_ribm = xstrtoul(secure_getenv("DFLTCC_RIBM"), DFLTCC_RIBM); -+ -+ memset(cpu_facilities, 0, sizeof(cpu_facilities)); -+ r0 = sizeof(cpu_facilities) / sizeof(cpu_facilities[0]) - 1; -+ /* STFLE is supported since z9-109 and only in z/Architecture mode. When -+ * compiling with -m31, gcc defaults to ESA mode, however, since the kernel -+ * is 64-bit, it's always z/Architecture mode at runtime. -+ */ -+ __asm__ volatile( -+#ifndef __clang__ -+ ".machinemode push\n" -+ ".machinemode zarch\n" -+#endif -+ "stfle %[facilities]\n" -+#ifndef __clang__ -+ ".machinemode pop\n" -+#endif -+ : [facilities] "=Q" (cpu_facilities) -+ , [r0] "+r" (r0) -+ : -+ : "cc"); -+ -+ /* Initialize available functions */ -+ if (is_dfltcc_enabled()) -+ dfltcc(DFLTCC_QAF, &cpu_af, NULL, NULL, NULL, NULL, NULL); -+ else -+ memset(&cpu_af, 0, sizeof(cpu_af)); -+} -+ -+/* -+ Memory management. -+ -+ DFLTCC requires parameter blocks and window to be aligned. zlib allows -+ users to specify their own allocation functions, so using e.g. -+ `posix_memalign' is not an option. Thus, we overallocate and take the -+ aligned portion of the buffer. -+*/ -+void ZLIB_INTERNAL dfltcc_reset(strm, size) -+ z_streamp strm; -+ uInt size; -+{ -+ struct dfltcc_state *dfltcc_state = -+ (struct dfltcc_state *)((char FAR *)strm->state + ALIGN_UP(size, 8)); -+ -+ memcpy(&dfltcc_state->af, &cpu_af, sizeof(dfltcc_state->af)); -+ -+ if (env_source_date_epoch) -+ /* User needs reproducible results, but the output of DFLTCC_CMPR -+ * depends on buffers' page offsets. -+ */ -+ clear_bit(dfltcc_state->af.fns, DFLTCC_CMPR); -+ -+ /* Initialize parameter block */ -+ memset(&dfltcc_state->param, 0, sizeof(dfltcc_state->param)); -+ dfltcc_state->param.nt = 1; -+ -+ /* Initialize tuning parameters */ -+ dfltcc_state->level_mask = env_level_mask; -+ dfltcc_state->block_size = env_block_size; -+ dfltcc_state->block_threshold = env_block_threshold; -+ dfltcc_state->dht_threshold = env_dht_threshold; -+ dfltcc_state->param.ribm = env_ribm; -+} -+ -+voidpf ZLIB_INTERNAL dfltcc_alloc_state(strm, items, size) -+ z_streamp strm; -+ uInt items; -+ uInt size; -+{ -+ return ZALLOC(strm, -+ ALIGN_UP(items * size, 8) + sizeof(struct dfltcc_state), -+ sizeof(unsigned char)); -+} -+ -+void ZLIB_INTERNAL dfltcc_copy_state(dst, src, size) -+ voidpf dst; -+ const voidpf src; -+ uInt size; -+{ -+ zmemcpy(dst, src, ALIGN_UP(size, 8) + sizeof(struct dfltcc_state)); -+} -+ -+static const int PAGE_ALIGN = 0x1000; -+ -+voidpf ZLIB_INTERNAL dfltcc_alloc_window(strm, items, size) -+ z_streamp strm; -+ uInt items; -+ uInt size; -+{ -+ voidpf p, w; -+ -+ /* To simplify freeing, we store the pointer to the allocated buffer right -+ * before the window. Note that DFLTCC always uses HB_SIZE bytes. -+ */ -+ p = ZALLOC(strm, sizeof(voidpf) + MAX(items * size, HB_SIZE) + PAGE_ALIGN, -+ sizeof(unsigned char)); -+ if (p == NULL) -+ return NULL; -+ w = ALIGN_UP((char FAR *)p + sizeof(voidpf), PAGE_ALIGN); -+ *(voidpf *)((char FAR *)w - sizeof(voidpf)) = p; -+ return w; -+} -+ -+void ZLIB_INTERNAL dfltcc_copy_window(dest, src, n) -+ void *dest; -+ const void *src; -+ size_t n; -+{ -+ memcpy(dest, src, MAX(n, HB_SIZE)); -+} -+ -+void ZLIB_INTERNAL dfltcc_free_window(strm, w) -+ z_streamp strm; -+ voidpf w; -+{ -+ if (w) -+ ZFREE(strm, *(voidpf *)((unsigned char FAR *)w - sizeof(voidpf))); -+} -+ -+/* -+ Switching between hardware and software compression. -+ -+ DFLTCC does not support all zlib settings, e.g. generation of non-compressed -+ blocks or alternative window sizes. When such settings are applied on the -+ fly with deflateParams, we need to convert between hardware and software -+ window formats. -+*/ -+int ZLIB_INTERNAL dfltcc_deflate_params(strm, level, strategy, flush) -+ z_streamp strm; -+ int level; -+ int strategy; -+ int *flush; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ int could_deflate = dfltcc_can_deflate(strm); -+ int can_deflate = dfltcc_can_deflate_with_params(strm, -+ level, -+ state->w_bits, -+ strategy); -+ -+ if (can_deflate == could_deflate) -+ /* We continue to work in the same mode - no changes needed */ -+ return Z_OK; -+ -+ if (strm->total_in == 0 && param->nt == 1 && param->hl == 0) -+ /* DFLTCC was not used yet - no changes needed */ -+ return Z_OK; -+ -+ /* For now, do not convert between window formats - simply get rid of the -+ * old data instead. -+ */ -+ *flush = Z_FULL_FLUSH; -+ return Z_OK; -+} -+ -+int ZLIB_INTERNAL dfltcc_deflate_done(strm, flush) -+ z_streamp strm; -+ int flush; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ -+ /* When deflate(Z_FULL_FLUSH) is called with small avail_out, it might -+ * close the block without resetting the compression state. Detect this -+ * situation and return that deflation is not done. -+ */ -+ if (flush == Z_FULL_FLUSH && strm->avail_out == 0) -+ return 0; -+ -+ /* Return that deflation is not done if DFLTCC is used and either it -+ * buffered some data (Continuation Flag is set), or has not written EOBS -+ * yet (Block-Continuation Flag is set). -+ */ -+ return !dfltcc_can_deflate(strm) || (!param->cf && !param->bcf); -+} -+ -+/* -+ Preloading history. -+*/ -+local void append_history OF((struct dfltcc_param_v0 FAR *param, -+ Bytef *history, -+ const Bytef *buf, -+ uInt count)); -+local void append_history(param, history, buf, count) -+ struct dfltcc_param_v0 FAR *param; -+ Bytef *history; -+ const Bytef *buf; -+ uInt count; -+{ -+ size_t offset; -+ size_t n; -+ -+ /* Do not use more than 32K */ -+ if (count > HB_SIZE) { -+ buf += count - HB_SIZE; -+ count = HB_SIZE; -+ } -+ offset = (param->ho + param->hl) % HB_SIZE; -+ if (offset + count <= HB_SIZE) -+ /* Circular history buffer does not wrap - copy one chunk */ -+ zmemcpy(history + offset, buf, count); -+ else { -+ /* Circular history buffer wraps - copy two chunks */ -+ n = HB_SIZE - offset; -+ zmemcpy(history + offset, buf, n); -+ zmemcpy(history, buf + n, count - n); -+ } -+ n = param->hl + count; -+ if (n <= HB_SIZE) -+ /* All history fits into buffer - no need to discard anything */ -+ param->hl = n; -+ else { -+ /* History does not fit into buffer - discard extra bytes */ -+ param->ho = (param->ho + (n - HB_SIZE)) % HB_SIZE; -+ param->hl = HB_SIZE; -+ } -+} -+ -+local void get_history OF((struct dfltcc_param_v0 FAR *param, -+ const Bytef *history, -+ Bytef *buf)); -+local void get_history(param, history, buf) -+ struct dfltcc_param_v0 FAR *param; -+ const Bytef *history; -+ Bytef *buf; -+{ -+ if (param->ho + param->hl <= HB_SIZE) -+ /* Circular history buffer does not wrap - copy one chunk */ -+ memcpy(buf, history + param->ho, param->hl); -+ else { -+ /* Circular history buffer wraps - copy two chunks */ -+ memcpy(buf, history + param->ho, HB_SIZE - param->ho); -+ memcpy(buf + HB_SIZE - param->ho, history, param->ho + param->hl - HB_SIZE); -+ } -+} -+ -+int ZLIB_INTERNAL dfltcc_deflate_set_dictionary(strm, dictionary, dict_length) -+ z_streamp strm; -+ const Bytef *dictionary; -+ uInt dict_length; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ -+ append_history(param, state->window, dictionary, dict_length); -+ state->strstart = 1; /* Add FDICT to zlib header */ -+ state->block_start = state->strstart; /* Make deflate_stored happy */ -+ return Z_OK; -+} -+ -+int ZLIB_INTERNAL dfltcc_deflate_get_dictionary(strm, dictionary, dict_length) -+ z_streamp strm; -+ Bytef *dictionary; -+ uInt *dict_length; -+{ -+ deflate_state FAR *state = (deflate_state FAR *)strm->state; -+ struct dfltcc_state FAR *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 FAR *param = &dfltcc_state->param; -+ -+ if (dictionary) -+ get_history(param, state->window, dictionary); -+ if (dict_length) -+ *dict_length = param->hl; -+ return Z_OK; -+} -+ -+int ZLIB_INTERNAL dfltcc_inflate_set_dictionary(strm, dictionary, dict_length) -+ z_streamp strm; -+ const Bytef *dictionary; -+ uInt dict_length; -+{ -+ struct inflate_state *state = (struct inflate_state *)strm->state; -+ struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 *param = &dfltcc_state->param; -+ -+ if (inflate_ensure_window(state)) { -+ state->mode = MEM; -+ return Z_MEM_ERROR; -+ } -+ -+ append_history(param, state->window, dictionary, dict_length); -+ state->havedict = 1; -+ return Z_OK; -+} -+ -+int ZLIB_INTERNAL dfltcc_inflate_get_dictionary(strm, dictionary, dict_length) -+ z_streamp strm; -+ Bytef *dictionary; -+ uInt *dict_length; -+{ -+ struct inflate_state *state = (struct inflate_state *)strm->state; -+ struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); -+ struct dfltcc_param_v0 *param = &dfltcc_state->param; -+ -+ if (dictionary && state->window) -+ get_history(param, state->window, dictionary); -+ if (dict_length) -+ *dict_length = param->hl; -+ return Z_OK; -+} -diff --git a/contrib/s390/dfltcc.h b/contrib/s390/dfltcc.h -new file mode 100644 -index 0000000..be28b8a ---- /dev/null -+++ b/contrib/s390/dfltcc.h -@@ -0,0 +1,100 @@ -+#ifndef DFLTCC_H -+#define DFLTCC_H -+ -+#include "../../zlib.h" -+#include "../../zutil.h" -+ -+voidpf ZLIB_INTERNAL dfltcc_alloc_state OF((z_streamp strm, uInt items, -+ uInt size)); -+void ZLIB_INTERNAL dfltcc_copy_state OF((voidpf dst, const voidpf src, -+ uInt size)); -+void ZLIB_INTERNAL dfltcc_reset OF((z_streamp strm, uInt size)); -+voidpf ZLIB_INTERNAL dfltcc_alloc_window OF((z_streamp strm, uInt items, -+ uInt size)); -+void ZLIB_INTERNAL dfltcc_copy_window OF((void *dest, const void *src, -+ size_t n)); -+void ZLIB_INTERNAL dfltcc_free_window OF((z_streamp strm, voidpf w)); -+#define DFLTCC_BLOCK_HEADER_BITS 3 -+#define DFLTCC_HLITS_COUNT_BITS 5 -+#define DFLTCC_HDISTS_COUNT_BITS 5 -+#define DFLTCC_HCLENS_COUNT_BITS 4 -+#define DFLTCC_MAX_HCLENS 19 -+#define DFLTCC_HCLEN_BITS 3 -+#define DFLTCC_MAX_HLITS 286 -+#define DFLTCC_MAX_HDISTS 30 -+#define DFLTCC_MAX_HLIT_HDIST_BITS 7 -+#define DFLTCC_MAX_SYMBOL_BITS 16 -+#define DFLTCC_MAX_EOBS_BITS 15 -+#define DFLTCC_MAX_PADDING_BITS 7 -+#define DEFLATE_BOUND_COMPLEN(source_len) \ -+ ((DFLTCC_BLOCK_HEADER_BITS + \ -+ DFLTCC_HLITS_COUNT_BITS + \ -+ DFLTCC_HDISTS_COUNT_BITS + \ -+ DFLTCC_HCLENS_COUNT_BITS + \ -+ DFLTCC_MAX_HCLENS * DFLTCC_HCLEN_BITS + \ -+ (DFLTCC_MAX_HLITS + DFLTCC_MAX_HDISTS) * DFLTCC_MAX_HLIT_HDIST_BITS + \ -+ (source_len) * DFLTCC_MAX_SYMBOL_BITS + \ -+ DFLTCC_MAX_EOBS_BITS + \ -+ DFLTCC_MAX_PADDING_BITS) >> 3) -+int ZLIB_INTERNAL dfltcc_can_inflate OF((z_streamp strm)); -+typedef enum { -+ DFLTCC_INFLATE_CONTINUE, -+ DFLTCC_INFLATE_BREAK, -+ DFLTCC_INFLATE_SOFTWARE, -+} dfltcc_inflate_action; -+dfltcc_inflate_action ZLIB_INTERNAL dfltcc_inflate OF((z_streamp strm, -+ int flush, int *ret)); -+int ZLIB_INTERNAL dfltcc_was_inflate_used OF((z_streamp strm)); -+int ZLIB_INTERNAL dfltcc_inflate_disable OF((z_streamp strm)); -+int ZLIB_INTERNAL dfltcc_inflate_set_dictionary OF((z_streamp strm, -+ const Bytef *dictionary, -+ uInt dict_length)); -+int ZLIB_INTERNAL dfltcc_inflate_get_dictionary OF((z_streamp strm, -+ Bytef *dictionary, -+ uInt* dict_length)); -+ -+#define ZALLOC_STATE dfltcc_alloc_state -+#define ZFREE_STATE ZFREE -+#define ZCOPY_STATE dfltcc_copy_state -+#define ZALLOC_WINDOW dfltcc_alloc_window -+#define ZCOPY_WINDOW dfltcc_copy_window -+#define ZFREE_WINDOW dfltcc_free_window -+#define TRY_FREE_WINDOW dfltcc_free_window -+#define INFLATE_RESET_KEEP_HOOK(strm) \ -+ dfltcc_reset((strm), sizeof(struct inflate_state)) -+#define INFLATE_PRIME_HOOK(strm, bits, value) \ -+ do { if (dfltcc_inflate_disable((strm))) return Z_STREAM_ERROR; } while (0) -+#define INFLATE_TYPEDO_HOOK(strm, flush) \ -+ if (dfltcc_can_inflate((strm))) { \ -+ dfltcc_inflate_action action; \ -+\ -+ RESTORE(); \ -+ action = dfltcc_inflate((strm), (flush), &ret); \ -+ LOAD(); \ -+ if (action == DFLTCC_INFLATE_CONTINUE) \ -+ break; \ -+ else if (action == DFLTCC_INFLATE_BREAK) \ -+ goto inf_leave; \ -+ } -+#define INFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_inflate((strm))) -+#define INFLATE_NEED_UPDATEWINDOW(strm) (!dfltcc_can_inflate((strm))) -+#define INFLATE_MARK_HOOK(strm) \ -+ do { \ -+ if (dfltcc_was_inflate_used((strm))) return -(1L << 16); \ -+ } while (0) -+#define INFLATE_SYNC_POINT_HOOK(strm) \ -+ do { \ -+ if (dfltcc_was_inflate_used((strm))) return Z_STREAM_ERROR; \ -+ } while (0) -+#define INFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \ -+ do { \ -+ if (dfltcc_can_inflate(strm)) \ -+ return dfltcc_inflate_set_dictionary(strm, dict, dict_len); \ -+ } while (0) -+#define INFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) \ -+ do { \ -+ if (dfltcc_can_inflate(strm)) \ -+ return dfltcc_inflate_get_dictionary(strm, dict, dict_len); \ -+ } while (0) -+ -+#endif -diff --git a/contrib/s390/dfltcc_deflate.h b/contrib/s390/dfltcc_deflate.h -new file mode 100644 -index 0000000..46acfc5 ---- /dev/null -+++ b/contrib/s390/dfltcc_deflate.h -@@ -0,0 +1,55 @@ -+#ifndef DFLTCC_DEFLATE_H -+#define DFLTCC_DEFLATE_H -+ -+#include "dfltcc.h" -+ -+int ZLIB_INTERNAL dfltcc_can_deflate OF((z_streamp strm)); -+int ZLIB_INTERNAL dfltcc_deflate OF((z_streamp strm, -+ int flush, -+ block_state *result)); -+int ZLIB_INTERNAL dfltcc_deflate_params OF((z_streamp strm, -+ int level, -+ int strategy, -+ int *flush)); -+int ZLIB_INTERNAL dfltcc_deflate_done OF((z_streamp strm, int flush)); -+int ZLIB_INTERNAL dfltcc_deflate_set_dictionary OF((z_streamp strm, -+ const Bytef *dictionary, -+ uInt dict_length)); -+int ZLIB_INTERNAL dfltcc_deflate_get_dictionary OF((z_streamp strm, -+ Bytef *dictionary, -+ uInt* dict_length)); -+ -+#define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \ -+ do { \ -+ if (dfltcc_can_deflate((strm))) \ -+ return dfltcc_deflate_set_dictionary((strm), (dict), (dict_len)); \ -+ } while (0) -+#define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) \ -+ do { \ -+ if (dfltcc_can_deflate((strm))) \ -+ return dfltcc_deflate_get_dictionary((strm), (dict), (dict_len)); \ -+ } while (0) -+#define DEFLATE_RESET_KEEP_HOOK(strm) \ -+ dfltcc_reset((strm), sizeof(deflate_state)) -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) \ -+ do { \ -+ int err; \ -+\ -+ err = dfltcc_deflate_params((strm), \ -+ (level), \ -+ (strategy), \ -+ (hook_flush)); \ -+ if (err == Z_STREAM_ERROR) \ -+ return err; \ -+ } while (0) -+#define DEFLATE_DONE dfltcc_deflate_done -+#define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ -+ do { \ -+ if (dfltcc_can_deflate((strm))) \ -+ (complen) = DEFLATE_BOUND_COMPLEN(source_len); \ -+ } while (0) -+#define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) (dfltcc_can_deflate((strm))) -+#define DEFLATE_HOOK dfltcc_deflate -+#define DEFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_deflate((strm))) -+ -+#endif -diff --git a/deflate.c b/deflate.c -index 4a512e1..ba446d9 100644 ---- a/deflate.c -+++ b/deflate.c -@@ -61,15 +61,30 @@ const char deflate_copyright[] = - */ - - /* =========================================================================== -- * Function prototypes. -+ * Architecture-specific bits. - */ --typedef enum { -- need_more, /* block not completed, need more input or more output */ -- block_done, /* block flush performed */ -- finish_started, /* finish started, need only more output at next deflate */ -- finish_done /* finish done, accept no more input or output */ --} block_state; -+#ifdef DFLTCC -+# include "contrib/s390/dfltcc_deflate.h" -+#else -+#define ZALLOC_STATE ZALLOC -+#define ZFREE_STATE ZFREE -+#define ZCOPY_STATE zmemcpy -+#define ZALLOC_WINDOW ZALLOC -+#define TRY_FREE_WINDOW TRY_FREE -+#define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) -+#define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) -+#define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0) -+#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0) -+#define DEFLATE_DONE(strm, flush) 1 -+#define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0) -+#define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0 -+#define DEFLATE_HOOK(strm, flush, bstate) 0 -+#define DEFLATE_NEED_CHECKSUM(strm) 1 -+#endif - -+/* =========================================================================== -+ * Function prototypes. -+ */ - typedef block_state (*compress_func) OF((deflate_state *s, int flush)); - /* Compression function. Returns the block state after the call. */ - -@@ -85,7 +100,6 @@ local block_state deflate_rle OF((deflate_state *s, int flush)); - local block_state deflate_huff OF((deflate_state *s, int flush)); - local void lm_init OF((deflate_state *s)); - local void putShortMSB OF((deflate_state *s, uInt b)); --local void flush_pending OF((z_streamp strm)); - local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); - local uInt longest_match OF((deflate_state *s, IPos cur_match)); - -@@ -295,7 +309,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ -- s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); -+ s = (deflate_state *) ZALLOC_STATE(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; -@@ -312,7 +326,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); - -- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); -+ s->window = (Bytef *) ZALLOC_WINDOW(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - -@@ -430,6 +444,7 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap == 1) - strm->adler = adler32(strm->adler, dictionary, dictLength); -+ DEFLATE_SET_DICTIONARY_HOOK(strm, dictionary, dictLength); - s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ -@@ -488,6 +503,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) - - if (deflateStateCheck(strm)) - return Z_STREAM_ERROR; -+ DEFLATE_GET_DICTIONARY_HOOK(strm, dictionary, dictLength); - s = strm->state; - len = s->strstart + s->lookahead; - if (len > s->w_size) -@@ -534,6 +550,8 @@ int ZEXPORT deflateResetKeep(strm) - - _tr_init(s); - -+ DEFLATE_RESET_KEEP_HOOK(strm); -+ - return Z_OK; - } - -@@ -609,6 +627,7 @@ int ZEXPORT deflateParams(strm, level, strategy) - { - deflate_state *s; - compress_func func; -+ int hook_flush = Z_NO_FLUSH; - - if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - s = strm->state; -@@ -621,15 +640,18 @@ int ZEXPORT deflateParams(strm, level, strategy) - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } -+ DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); - func = configuration_table[s->level].func; - -- if ((strategy != s->strategy || func != configuration_table[level].func) && -- s->last_flush != -2) { -+ if (((strategy != s->strategy || func != configuration_table[level].func) && -+ s->last_flush != -2) || hook_flush != Z_NO_FLUSH) { - /* Flush the last buffer: */ -- int err = deflate(strm, Z_BLOCK); -+ int flush = RANK(hook_flush) > RANK(Z_BLOCK) ? hook_flush : Z_BLOCK; -+ int err = deflate(strm, flush); - if (err == Z_STREAM_ERROR) - return err; -- if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) -+ if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead || -+ !DEFLATE_DONE(strm, flush)) - return Z_BUF_ERROR; - } - if (s->level != level) { -@@ -705,11 +727,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) - ~13% overhead plus a small constant */ - fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + - (sourceLen >> 9) + 4; -+ DEFLATE_BOUND_ADJUST_COMPLEN(strm, fixedlen, sourceLen); - - /* upper bound for stored blocks with length 127 (memLevel == 1) -- - ~4% overhead plus a small constant */ - storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + - (sourceLen >> 11) + 7; -+ DEFLATE_BOUND_ADJUST_COMPLEN(strm, storelen, sourceLen); - - /* if can't get parameters, return larger bound plus a zlib wrapper */ - if (deflateStateCheck(strm)) -@@ -751,7 +775,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) - } - - /* if not default parameters, return one of the conservative bounds */ -- if (s->w_bits != 15 || s->hash_bits != 8 + 7) -+ if (DEFLATE_NEED_CONSERVATIVE_BOUND(strm) || -+ s->w_bits != 15 || s->hash_bits != 8 + 7) - return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + - wraplen; - -@@ -780,7 +805,7 @@ local void putShortMSB(s, b) - * applications may wish to modify it to avoid allocating a large - * strm->next_out buffer and copying into it. (See also read_buf()). - */ --local void flush_pending(strm) -+void ZLIB_INTERNAL flush_pending(strm) - z_streamp strm; - { - unsigned len; -@@ -1052,7 +1077,8 @@ int ZEXPORT deflate(strm, flush) - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - -- bstate = s->level == 0 ? deflate_stored(s, flush) : -+ bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : -+ s->level == 0 ? deflate_stored(s, flush) : - s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush); -@@ -1099,7 +1125,6 @@ int ZEXPORT deflate(strm, flush) - } - - if (flush != Z_FINISH) return Z_OK; -- if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ - #ifdef GZIP -@@ -1115,7 +1140,7 @@ int ZEXPORT deflate(strm, flush) - } - else - #endif -- { -+ if (s->wrap == 1) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } -@@ -1124,7 +1149,11 @@ int ZEXPORT deflate(strm, flush) - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ -- return s->pending != 0 ? Z_OK : Z_STREAM_END; -+ if (s->pending == 0) { -+ Assert(s->bi_valid == 0, "bi_buf not flushed"); -+ return Z_STREAM_END; -+ } -+ return Z_OK; - } - - /* ========================================================================= */ -@@ -1141,9 +1170,9 @@ int ZEXPORT deflateEnd(strm) - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); -- TRY_FREE(strm, strm->state->window); -+ TRY_FREE_WINDOW(strm, strm->state->window); - -- ZFREE(strm, strm->state); -+ ZFREE_STATE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -@@ -1173,13 +1202,13 @@ int ZEXPORT deflateCopy(dest, source) - - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - -- ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); -+ ds = (deflate_state *) ZALLOC_STATE(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; -- zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); -+ ZCOPY_STATE((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); - ds->strm = dest; - -- ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); -+ ds->window = (Bytef *) ZALLOC_WINDOW(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); -@@ -1226,7 +1255,8 @@ local unsigned read_buf(strm, buf, size) - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); -- if (strm->state->wrap == 1) { -+ if (!DEFLATE_NEED_CHECKSUM(strm)) {} -+ else if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } - #ifdef GZIP -diff --git a/deflate.h b/deflate.h -index 1a06cd5..f92750c 100644 ---- a/deflate.h -+++ b/deflate.h -@@ -299,6 +299,7 @@ void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); - void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); - void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -+void ZLIB_INTERNAL _tr_send_bits OF((deflate_state *s, int value, int length)); - - #define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -@@ -343,4 +344,15 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - flush = _tr_tally(s, distance, length) - #endif - -+typedef enum { -+ need_more, /* block not completed, need more input or more output */ -+ block_done, /* block flush performed */ -+ finish_started, /* finish started, need only more output at next deflate */ -+ finish_done /* finish done, accept no more input or output */ -+} block_state; -+ -+unsigned ZLIB_INTERNAL bi_reverse OF((unsigned code, int len)); -+void ZLIB_INTERNAL bi_windup OF((deflate_state *s)); -+void ZLIB_INTERNAL flush_pending OF((z_streamp strm)); -+ - #endif /* DEFLATE_H */ -diff --git a/gzguts.h b/gzguts.h -index 57faf37..581f2b6 100644 ---- a/gzguts.h -+++ b/gzguts.h -@@ -153,7 +153,11 @@ - - /* default i/o buffer size -- double this for output when reading (this and - twice this must be able to fit in an unsigned type) */ -+#ifdef DFLTCC -+#define GZBUFSIZE 131072 -+#else - #define GZBUFSIZE 8192 -+#endif - - /* gzip modes, also provide a little integrity check on the passed structure */ - #define GZ_NONE 0 -diff --git a/inflate.c b/inflate.c -index 8acbef4..19dc724 100644 ---- a/inflate.c -+++ b/inflate.c -@@ -85,6 +85,27 @@ - #include "inflate.h" - #include "inffast.h" - -+/* architecture-specific bits */ -+#ifdef DFLTCC -+# include "contrib/s390/dfltcc.h" -+#else -+#define ZALLOC_STATE ZALLOC -+#define ZFREE_STATE ZFREE -+#define ZCOPY_STATE zmemcpy -+#define ZALLOC_WINDOW ZALLOC -+#define ZCOPY_WINDOW zmemcpy -+#define ZFREE_WINDOW ZFREE -+#define INFLATE_RESET_KEEP_HOOK(strm) do {} while (0) -+#define INFLATE_PRIME_HOOK(strm, bits, value) do {} while (0) -+#define INFLATE_TYPEDO_HOOK(strm, flush) do {} while (0) -+#define INFLATE_NEED_CHECKSUM(strm) 1 -+#define INFLATE_NEED_UPDATEWINDOW(strm) 1 -+#define INFLATE_MARK_HOOK(strm) do {} while (0) -+#define INFLATE_SYNC_POINT_HOOK(strm) do {} while (0) -+#define INFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) -+#define INFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0) -+#endif -+ - #ifdef MAKEFIXED - # ifndef BUILDFIXED - # define BUILDFIXED -@@ -138,6 +159,7 @@ z_streamp strm; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; -+ INFLATE_RESET_KEEP_HOOK(strm); - Tracev((stderr, "inflate: reset\n")); - return Z_OK; - } -@@ -185,7 +207,7 @@ int windowBits; - if (windowBits && (windowBits < 8 || windowBits > 15)) - return Z_STREAM_ERROR; - if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { -- ZFREE(strm, state->window); -+ ZFREE_WINDOW(strm, state->window); - state->window = Z_NULL; - } - -@@ -224,7 +246,7 @@ int stream_size; - strm->zfree = zcfree; - #endif - state = (struct inflate_state FAR *) -- ZALLOC(strm, 1, sizeof(struct inflate_state)); -+ ZALLOC_STATE(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; -@@ -233,7 +255,7 @@ int stream_size; - state->mode = HEAD; /* to pass state test in inflateReset2() */ - ret = inflateReset2(strm, windowBits); - if (ret != Z_OK) { -- ZFREE(strm, state); -+ ZFREE_STATE(strm, state); - strm->state = Z_NULL; - } - return ret; -@@ -255,6 +277,7 @@ int value; - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; -+ INFLATE_PRIME_HOOK(strm, bits, value); - state = (struct inflate_state FAR *)strm->state; - if (bits < 0) { - state->hold = 0; -@@ -382,6 +405,27 @@ void makefixed() - } - #endif /* MAKEFIXED */ - -+int ZLIB_INTERNAL inflate_ensure_window(state) -+ struct inflate_state *state; -+{ -+ /* if it hasn't been done already, allocate space for the window */ -+ if (state->window == Z_NULL) { -+ state->window = (unsigned char FAR *) -+ ZALLOC_WINDOW(state->strm, 1U << state->wbits, -+ sizeof(unsigned char)); -+ if (state->window == Z_NULL) return 1; -+ } -+ -+ /* if window not in use yet, initialize */ -+ if (state->wsize == 0) { -+ state->wsize = 1U << state->wbits; -+ state->wnext = 0; -+ state->whave = 0; -+ } -+ -+ return 0; -+} -+ - /* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called -@@ -406,20 +450,7 @@ unsigned copy; - - state = (struct inflate_state FAR *)strm->state; - -- /* if it hasn't been done already, allocate space for the window */ -- if (state->window == Z_NULL) { -- state->window = (unsigned char FAR *) -- ZALLOC(strm, 1U << state->wbits, -- sizeof(unsigned char)); -- if (state->window == Z_NULL) return 1; -- } -- -- /* if window not in use yet, initialize */ -- if (state->wsize == 0) { -- state->wsize = 1U << state->wbits; -- state->wnext = 0; -- state->whave = 0; -- } -+ if (inflate_ensure_window(state)) return 1; - - /* copy state->wsize or less output bytes into the circular window */ - if (copy >= state->wsize) { -@@ -863,6 +894,7 @@ int flush; - if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; - /* fallthrough */ - case TYPEDO: -+ INFLATE_TYPEDO_HOOK(strm, flush); - if (state->last) { - BYTEBITS(); - state->mode = CHECK; -@@ -1224,7 +1256,7 @@ int flush; - out -= left; - strm->total_out += out; - state->total += out; -- if ((state->wrap & 4) && out) -+ if (INFLATE_NEED_CHECKSUM(strm) && (state->wrap & 4) && out) - strm->adler = state->check = - UPDATE_CHECK(state->check, put - out, out); - out = left; -@@ -1279,8 +1311,9 @@ int flush; - */ - inf_leave: - RESTORE(); -- if (state->wsize || (out != strm->avail_out && state->mode < BAD && -- (state->mode < CHECK || flush != Z_FINISH))) -+ if (INFLATE_NEED_UPDATEWINDOW(strm) && -+ (state->wsize || (out != strm->avail_out && state->mode < BAD && -+ (state->mode < CHECK || flush != Z_FINISH)))) - if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; -@@ -1290,7 +1323,7 @@ int flush; - strm->total_in += in; - strm->total_out += out; - state->total += out; -- if ((state->wrap & 4) && out) -+ if (INFLATE_NEED_CHECKSUM(strm) && (state->wrap & 4) && out) - strm->adler = state->check = - UPDATE_CHECK(state->check, strm->next_out - out, out); - strm->data_type = (int)state->bits + (state->last ? 64 : 0) + -@@ -1308,8 +1341,8 @@ z_streamp strm; - if (inflateStateCheck(strm)) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; -- if (state->window != Z_NULL) ZFREE(strm, state->window); -- ZFREE(strm, strm->state); -+ if (state->window != Z_NULL) ZFREE_WINDOW(strm, state->window); -+ ZFREE_STATE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -@@ -1326,6 +1359,8 @@ uInt *dictLength; - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - -+ INFLATE_GET_DICTIONARY_HOOK(strm, dictionary, dictLength); -+ - /* copy dictionary */ - if (state->whave && dictionary != Z_NULL) { - zmemcpy(dictionary, state->window + state->wnext, -@@ -1361,6 +1396,8 @@ uInt dictLength; - return Z_DATA_ERROR; - } - -+ INFLATE_SET_DICTIONARY_HOOK(strm, dictionary, dictLength); -+ - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary + dictLength, dictLength); -@@ -1488,6 +1525,7 @@ z_streamp strm; - struct inflate_state FAR *state; - - if (inflateStateCheck(strm)) return Z_STREAM_ERROR; -+ INFLATE_SYNC_POINT_HOOK(strm); - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; - } -@@ -1508,21 +1546,22 @@ z_streamp source; - - /* allocate space */ - copy = (struct inflate_state FAR *) -- ZALLOC(source, 1, sizeof(struct inflate_state)); -+ ZALLOC_STATE(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) -- ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); -+ ZALLOC_WINDOW(source, 1U << state->wbits, -+ sizeof(unsigned char)); - if (window == Z_NULL) { -- ZFREE(source, copy); -+ ZFREE_STATE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); -- zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); -+ ZCOPY_STATE((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); - copy->strm = dest; - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { -@@ -1531,8 +1570,7 @@ z_streamp source; - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { -- wsize = 1U << state->wbits; -- zmemcpy(window, state->window, wsize); -+ ZCOPY_WINDOW(window, state->window, 1U << state->wbits); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; -@@ -1579,6 +1617,7 @@ z_streamp strm; - - if (inflateStateCheck(strm)) - return -(1L << 16); -+ INFLATE_MARK_HOOK(strm); - state = (struct inflate_state FAR *)strm->state; - return (long)(((unsigned long)((long)state->back)) << 16) + - (state->mode == COPY ? state->length : -diff --git a/inflate.h b/inflate.h -index f127b6b..519ed35 100644 ---- a/inflate.h -+++ b/inflate.h -@@ -124,3 +124,5 @@ struct inflate_state { - int back; /* bits back of last unprocessed length/lit */ - unsigned was; /* initial length of match */ - }; -+ -+int ZLIB_INTERNAL inflate_ensure_window OF((struct inflate_state *state)); -diff --git a/test/infcover.c b/test/infcover.c -index 2be0164..a208219 100644 ---- a/test/infcover.c -+++ b/test/infcover.c -@@ -373,7 +373,7 @@ local void cover_support(void) - mem_setup(&strm); - strm.avail_in = 0; - strm.next_in = Z_NULL; -- ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); -+ ret = inflateInit_(&strm, &ZLIB_VERSION[1], (int)sizeof(z_stream)); - assert(ret == Z_VERSION_ERROR); - mem_done(&strm, "wrong version"); - -@@ -444,7 +444,7 @@ local void cover_wrap(void) - } - - /* input and output functions for inflateBack() */ --local unsigned pull(void *desc, unsigned char **buf) -+local unsigned pull(void *desc, z_const unsigned char **buf) - { - static unsigned int next = 0; - static unsigned char dat[] = {0x63, 0, 2, 0}; -diff --git a/test/minigzip.c b/test/minigzip.c -index a649d2b..964408a 100644 ---- a/test/minigzip.c -+++ b/test/minigzip.c -@@ -132,7 +132,11 @@ static void pwinerror (s) - #endif - #define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) - -+#ifdef DFLTCC -+#define BUFLEN 262144 -+#else - #define BUFLEN 16384 -+#endif - #define MAX_NAME_LEN 1024 - - #ifdef MAXSEG_64K -diff --git a/trees.c b/trees.c -index 5f305c4..4924bdf 100644 ---- a/trees.c -+++ b/trees.c -@@ -149,8 +149,6 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); - local int detect_data_type OF((deflate_state *s)); --local unsigned bi_reverse OF((unsigned code, int len)); --local void bi_windup OF((deflate_state *s)); - local void bi_flush OF((deflate_state *s)); - - #ifdef GEN_TREES_H -@@ -223,6 +221,13 @@ local void send_bits(s, value, length) - } - #endif /* ZLIB_DEBUG */ - -+void ZLIB_INTERNAL _tr_send_bits(s, value, length) -+ deflate_state *s; -+ int value; -+ int length; -+{ -+ send_bits(s, value, length); -+} - - /* the arguments must not have side effects */ - -@@ -1133,7 +1138,7 @@ local int detect_data_type(s) - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ --local unsigned bi_reverse(code, len) -+unsigned ZLIB_INTERNAL bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ - { -@@ -1165,7 +1170,7 @@ local void bi_flush(s) - /* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ --local void bi_windup(s) -+void ZLIB_INTERNAL bi_windup(s) - deflate_state *s; - { - if (s->bi_valid > 8) { -diff --git a/zutil.h b/zutil.h -index 0bc7f4e..75eb4df 100644 ---- a/zutil.h -+++ b/zutil.h -@@ -87,6 +87,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ - - #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - -+#define ZLIB_WRAPLEN 6 /* zlib format overhead */ -+ - /* target dependencies */ - - #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) --- -2.38.1 - diff --git a/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch b/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch deleted file mode 100644 index 35e3073..0000000 --- a/zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 73331a6a0481067628f065ffe87bb1d8f787d10c Mon Sep 17 00:00:00 2001 -From: Hans Wennborg -Date: Fri, 18 Aug 2023 11:05:33 +0200 -Subject: [PATCH] Reject overflows of zip header fields in minizip. - -This checks the lengths of the file name, extra field, and comment -that would be put in the zip headers, and rejects them if they are -too long. They are each limited to 65535 bytes in length by the zip -format. This also avoids possible buffer overflows if the provided -fields are too long. ---- - contrib/minizip/zip.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c -index 3d3d4ca..0446109 100644 ---- a/contrib/minizip/zip.c -+++ b/contrib/minizip/zip.c -@@ -1043,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c - return ZIP_PARAMERROR; - #endif - -+ // The filename and comment length must fit in 16 bits. -+ if ((filename!=NULL) && (strlen(filename)>0xffff)) -+ return ZIP_PARAMERROR; -+ if ((comment!=NULL) && (strlen(comment)>0xffff)) -+ return ZIP_PARAMERROR; -+ // The extra field length must fit in 16 bits. If the member also requires -+ // a Zip64 extra block, that will also need to fit within that 16-bit -+ // length, but that will be checked for later. -+ if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) -+ return ZIP_PARAMERROR; -+ - zi = (zip64_internal*)file; - - if (zi->in_opened_file_inzip == 1) --- -2.41.0 - diff --git a/zlib-1.2.13-optimized-s390.patch b/zlib-1.2.13-optimized-s390.patch deleted file mode 100644 index 6e8fd46..0000000 --- a/zlib-1.2.13-optimized-s390.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- zlib-1.2.13/deflate.c.old 2022-11-24 16:41:34.527200490 +0000 -+++ zlib-1.2.13/deflate.c 2022-11-24 16:43:28.064200490 +0000 -@@ -1305,15 +1305,16 @@ local void lm_init(s) - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ --local uInt longest_match(s, cur_match) -+local uInt longest_match(s, pcur_match) - deflate_state *s; -- IPos cur_match; /* current match */ -+ IPos pcur_match; /* current match */ - { -+ ptrdiff_t cur_match = pcur_match; /* extend to pointer width */ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ -- int best_len = (int)s->prev_length; /* best match length so far */ -+ ptrdiff_t best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; -@@ -1328,12 +1329,12 @@ local uInt longest_match(s, cur_match) - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; -- register ush scan_start = *(ushf*)scan; -- register ush scan_end = *(ushf*)(scan + best_len - 1); -+ register uInt scan_start = *(ushf*)scan; -+ register uInt scan_end = *(ushf*)(scan+best_len-1); - #else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; -- register Byte scan_end1 = scan[best_len - 1]; -- register Byte scan_end = scan[best_len]; -+ register uInt scan_end1 = scan[best_len-1]; -+ register uInt scan_end = scan[best_len]; - #endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. diff --git a/zlib-1.2.13-power-optimizations.patch b/zlib-1.2.13-power-optimizations.patch deleted file mode 100644 index 09f7c4d..0000000 --- a/zlib-1.2.13-power-optimizations.patch +++ /dev/null @@ -1,2865 +0,0 @@ -From 7edf70d6b010dd803d324bf90f5241a44bec3df7 Mon Sep 17 00:00:00 2001 -From: Manjunath S Matti -Date: Tue, 15 Nov 2022 02:45:53 -0600 -Subject: [PATCH 1/3] Preparation for Power optimizations - -Optimized functions for Power will make use of GNU indirect functions, -an extension to support different implementations of the same function, -which can be selected during runtime. This will be used to provide -optimized functions for different processor versions. - -Since this is a GNU extension, we placed the definition of the Z_IFUNC -macro under `contrib/gcc`. This can be reused by other archs as well. - -Author: Matheus Castanho -Author: Rogerio Alves -Signed-off-by: Manjunath Matti ---- - CMakeLists.txt | 71 ++++++++++++++++++++++++++++++++++++++++++ - configure | 66 +++++++++++++++++++++++++++++++++++++++ - contrib/README.contrib | 8 +++++ - contrib/gcc/zifunc.h | 60 +++++++++++++++++++++++++++++++++++ - contrib/power/power.h | 4 +++ - 5 files changed, 209 insertions(+) - create mode 100644 contrib/gcc/zifunc.h - create mode 100644 contrib/power/power.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index b412dc7..e313f95 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -5,6 +5,8 @@ project(zlib C) - - set(VERSION "1.2.13") - -+option(POWER "Enable building power implementation") -+ - set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") - set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") - set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") -@@ -126,6 +128,75 @@ if(NOT MINGW) - ) - endif() - -+if(CMAKE_COMPILER_IS_GNUCC) -+ -+ # test to see if we can use a GNU indirect function to detect and load optimized code at runtime -+ CHECK_C_SOURCE_COMPILES(" -+ static int test_ifunc_native(void) -+ { -+ return 1; -+ } -+ static int (*(check_ifunc_native(void)))(void) -+ { -+ return test_ifunc_native; -+ } -+ int test_ifunc(void) __attribute__ ((ifunc (\"check_ifunc_native\"))); -+ int main(void) -+ { -+ return 0; -+ } -+ " HAS_C_ATTR_IFUNC) -+ -+ if(HAS_C_ATTR_IFUNC) -+ add_definitions(-DHAVE_IFUNC) -+ set(ZLIB_PRIVATE_HDRS ${ZLIB_PRIVATE_HDRS} contrib/gcc/zifunc.h) -+ endif() -+ -+ if(POWER) -+ # Test to see if we can use the optimizations for Power -+ CHECK_C_SOURCE_COMPILES(" -+ #ifndef _ARCH_PPC -+ #error \"Target is not Power\" -+ #endif -+ #ifndef __BUILTIN_CPU_SUPPORTS__ -+ #error \"Target doesn't support __builtin_cpu_supports()\" -+ #endif -+ int main() { return 0; } -+ " HAS_POWER_SUPPORT) -+ -+ if(HAS_POWER_SUPPORT AND HAS_C_ATTR_IFUNC) -+ add_definitions(-DZ_POWER_OPT) -+ -+ set(CMAKE_REQUIRED_FLAGS -mcpu=power8) -+ CHECK_C_SOURCE_COMPILES("int main(void){return 0;}" POWER8) -+ -+ if(POWER8) -+ add_definitions(-DZ_POWER8) -+ set(ZLIB_POWER8 ) -+ -+ set_source_files_properties( -+ ${ZLIB_POWER8} -+ PROPERTIES COMPILE_FLAGS -mcpu=power8) -+ endif() -+ -+ set(CMAKE_REQUIRED_FLAGS -mcpu=power9) -+ CHECK_C_SOURCE_COMPILES("int main(void){return 0;}" POWER9) -+ -+ if(POWER9) -+ add_definitions(-DZ_POWER9) -+ set(ZLIB_POWER9 ) -+ -+ set_source_files_properties( -+ ${ZLIB_POWER9} -+ PROPERTIES COMPILE_FLAGS -mcpu=power9) -+ endif() -+ -+ set(ZLIB_PRIVATE_HDRS ${ZLIB_PRIVATE_HDRS} contrib/power/power.h) -+ set(ZLIB_SRCS ${ZLIB_SRCS} ${ZLIB_POWER8} ${ZLIB_POWER9}) -+ endif() -+ endif() -+endif() -+ - # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) - string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" -diff --git a/configure b/configure -index fa4d5da..9ee7008 100755 ---- a/configure -+++ b/configure -@@ -828,6 +828,72 @@ EOF - fi - fi - -+# test to see if we can use a gnu indirection function to detect and load optimized code at runtime -+echo >> configure.log -+cat > $test.c <> configure.log -+cat > $test.c < $test.c -+ -+ if tryboth $CC -c $CFLAGS -mcpu=power8 $test.c; then -+ POWER8="-DZ_POWER8" -+ PIC_OBJC="${PIC_OBJC}" -+ OBJC="${OBJC}" -+ echo "Checking for -mcpu=power8 support... Yes." | tee -a configure.log -+ else -+ echo "Checking for -mcpu=power8 support... No." | tee -a configure.log -+ fi -+ -+ if tryboth $CC -c $CFLAGS -mcpu=power9 $test.c; then -+ POWER9="-DZ_POWER9" -+ PIC_OBJC="${PIC_OBJC}" -+ OBJC="${OBJC}" -+ echo "Checking for -mcpu=power9 support... Yes." | tee -a configure.log -+ else -+ echo "Checking for -mcpu=power9 support... No." | tee -a configure.log -+ fi -+ -+ SFLAGS="${SFLAGS} ${POWER8} ${POWER9} -DZ_POWER_OPT" -+ CFLAGS="${CFLAGS} ${POWER8} ${POWER9} -DZ_POWER_OPT" -+ echo "Checking for Power optimizations support... Yes." | tee -a configure.log -+else -+ echo "Checking for Power optimizations support... No." | tee -a configure.log -+fi -+ - # show the results in the log - echo >> configure.log - echo ALL = $ALL >> configure.log -diff --git a/contrib/README.contrib b/contrib/README.contrib -index 5e5f950..c57b520 100644 ---- a/contrib/README.contrib -+++ b/contrib/README.contrib -@@ -11,6 +11,10 @@ ada/ by Dmitriy Anisimkov - blast/ by Mark Adler - Decompressor for output of PKWare Data Compression Library (DCL) - -+gcc/ by Matheus Castanho -+ and Rogerio Alves -+ Optimization helpers using GCC-specific extensions -+ - delphi/ by Cosmin Truta - Support for Delphi and C++ Builder - -@@ -42,6 +46,10 @@ minizip/ by Gilles Vollant - pascal/ by Bob Dellaca et al. - Support for Pascal - -+power/ by Matheus Castanho -+ and Rogerio Alves -+ Optimized functions for Power processors -+ - puff/ by Mark Adler - Small, low memory usage inflate. Also serves to provide an - unambiguous description of the deflate format. -diff --git a/contrib/gcc/zifunc.h b/contrib/gcc/zifunc.h -new file mode 100644 -index 0000000..daf4fe4 ---- /dev/null -+++ b/contrib/gcc/zifunc.h -@@ -0,0 +1,60 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * 2019 Rogerio Alves , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#ifndef Z_IFUNC_H_ -+#define Z_IFUNC_H_ -+ -+/* Helpers for arch optimizations */ -+ -+#define Z_IFUNC(fname) \ -+ typeof(fname) fname __attribute__ ((ifunc (#fname "_resolver"))); \ -+ local typeof(fname) *fname##_resolver(void) -+/* This is a helper macro to declare a resolver for an indirect function -+ * (ifunc). Let's say you have function -+ * -+ * int foo (int a); -+ * -+ * for which you want to provide different implementations, for example: -+ * -+ * int foo_clever (int a) { -+ * ... clever things ... -+ * } -+ * -+ * int foo_smart (int a) { -+ * ... smart things ... -+ * } -+ * -+ * You will have to declare foo() as an indirect function and also provide a -+ * resolver for it, to choose between foo_clever() and foo_smart() based on -+ * some criteria you define (e.g. processor features). -+ * -+ * Since most likely foo() has a default implementation somewhere in zlib, you -+ * may have to rename it so the 'foo' symbol can be used by the ifunc without -+ * conflicts. -+ * -+ * #define foo foo_default -+ * int foo (int a) { -+ * ... -+ * } -+ * #undef foo -+ * -+ * Now you just have to provide a resolver function to choose which function -+ * should be used (decided at runtime on the first call to foo()): -+ * -+ * Z_IFUNC(foo) { -+ * if (... some condition ...) -+ * return foo_clever; -+ * -+ * if (... other condition ...) -+ * return foo_smart; -+ * -+ * return foo_default; -+ * } -+ * -+ * All calls to foo() throughout the code can remain untouched, all the magic -+ * will be done by the linker using the resolver function. -+ */ -+ -+#endif /* Z_IFUNC_H_ */ -diff --git a/contrib/power/power.h b/contrib/power/power.h -new file mode 100644 -index 0000000..b42c7d6 ---- /dev/null -+++ b/contrib/power/power.h -@@ -0,0 +1,4 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * 2019 Rogerio Alves , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ --- -2.37.3 - -From 2b843de4ffa241edc20877f3ec47e75c9ed13ec8 Mon Sep 17 00:00:00 2001 -From: Manjunath S Matti -Date: Wed, 16 Nov 2022 03:53:53 -0600 -Subject: [PATCH 2/3] Add Power8+ optimized crc32 - -This commit adds an optimized version for the crc32 function based -on crc32-vpmsum from https://github.com/antonblanchard/crc32-vpmsum/ - -This is the C implementation created by Rogerio Alves - - -It makes use of vector instructions to speed up CRC32 algorithm. - -Author: Rogerio Alves -Signed-off-by: Manjunath Matti ---- - .gitignore | 3 + - CMakeLists.txt | 7 +- - Makefile.in | 43 +- - configure | 7 +- - contrib/README.contrib | 3 +- - contrib/power/clang_workaround.h | 82 ++ - contrib/power/crc32_constants.h | 1206 ++++++++++++++++++++++++++++++ - contrib/power/crc32_z_power8.c | 679 +++++++++++++++++ - contrib/power/crc32_z_resolver.c | 15 + - contrib/power/power.h | 4 + - crc32.c | 12 + - test/crc32_test.c | 205 +++++ - 12 files changed, 2252 insertions(+), 14 deletions(-) - create mode 100644 contrib/power/clang_workaround.h - create mode 100644 contrib/power/crc32_constants.h - create mode 100644 contrib/power/crc32_z_power8.c - create mode 100644 contrib/power/crc32_z_resolver.c - create mode 100644 test/crc32_test.c - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index e313f95..4ba992b 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -172,7 +172,8 @@ if(CMAKE_COMPILER_IS_GNUCC) - - if(POWER8) - add_definitions(-DZ_POWER8) -- set(ZLIB_POWER8 ) -+ set(ZLIB_POWER8 -+ contrib/power/crc32_z_power8.c) - - set_source_files_properties( - ${ZLIB_POWER8} -@@ -269,6 +270,10 @@ add_executable(example test/example.c) - target_link_libraries(example zlib) - add_test(example example) - -+add_executable(crc32_test test/crc32_test.c) -+target_link_libraries(crc32_test zlib) -+add_test(crc32_test crc32_test) -+ - add_executable(minigzip test/minigzip.c) - target_link_libraries(minigzip zlib) - -diff --git a/Makefile.in b/Makefile.in -index 7d2713f..408954d 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -71,11 +71,11 @@ PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) - - all: static shared - --static: example$(EXE) minigzip$(EXE) -+static: crc32_test$(EXE) example$(EXE) minigzip$(EXE) - --shared: examplesh$(EXE) minigzipsh$(EXE) -+shared: crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) - --all64: example64$(EXE) minigzip64$(EXE) -+all64: crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) - - check: test - -@@ -83,7 +83,7 @@ test: all teststatic testshared - - teststatic: static - @TMPST=tmpst_$$; \ -- if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST ; then \ -+ if echo hello world | ${QEMU_RUN} ./minigzip | ${QEMU_RUN} ./minigzip -d && ${QEMU_RUN} ./example $$TMPST && ${QEMU_RUN} ./crc32_test; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; false; \ -@@ -96,7 +96,7 @@ testshared: shared - DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ - SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ - TMPSH=tmpsh_$$; \ -- if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH; then \ -+ if echo hello world | ${QEMU_RUN} ./minigzipsh | ${QEMU_RUN} ./minigzipsh -d && ${QEMU_RUN} ./examplesh $$TMPSH && ${QEMU_RUN} ./crc32_testsh; then \ - echo ' *** zlib shared test OK ***'; \ - else \ - echo ' *** zlib shared test FAILED ***'; false; \ -@@ -105,7 +105,7 @@ testshared: shared - - test64: all64 - @TMP64=tmp64_$$; \ -- if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64; then \ -+ if echo hello world | ${QEMU_RUN} ./minigzip64 | ${QEMU_RUN} ./minigzip64 -d && ${QEMU_RUN} ./example64 $$TMP64 && ${QEMU_RUN} ./crc32_test64; then \ - echo ' *** zlib 64-bit test OK ***'; \ - else \ - echo ' *** zlib 64-bit test FAILED ***'; false; \ -@@ -139,12 +139,18 @@ match.lo: match.S - mv _match.o match.lo - rm -f _match.s - -+crc32_test.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/crc32_test.c -+ - example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c - - minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c - -+crc32_test64.o: $(SRCDIR)test/crc32_test.c $(SRCDIR)zlib.h zconf.h -+ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/crc32_test.c -+ - example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h - $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c - -@@ -158,6 +164,9 @@ adler32.o: $(SRCDIR)adler32.c - crc32.o: $(SRCDIR)crc32.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c - -+crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c -+ $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c -+ - deflate.o: $(SRCDIR)deflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c - -@@ -208,6 +217,11 @@ crc32.lo: $(SRCDIR)crc32.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c - -@mv objs/crc32.o $@ - -+crc32_z_power8.lo: $(SRCDIR)contrib/power/crc32_z_power8.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c -+ -@mv objs/crc32_z_power8.o $@ -+ - deflate.lo: $(SRCDIR)deflate.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c -@@ -281,18 +295,27 @@ placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a - ln -s $@ $(SHAREDLIBM) - -@rmdir objs - -+crc32_test$(EXE): crc32_test.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ crc32_test.o $(TEST_LDFLAGS) -+ - example$(EXE): example.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) - - minigzip$(EXE): minigzip.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) - -+crc32_testsh$(EXE): crc32_test.o $(SHAREDLIBV) -+ $(CC) $(CFLAGS) -o $@ crc32_test.o -L. $(SHAREDLIBV) -+ - examplesh$(EXE): example.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) -L. $(SHAREDLIBV) - - minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) -L. $(SHAREDLIBV) - -+crc32_test64$(EXE): crc32_test64.o $(STATICLIB) -+ $(CC) $(CFLAGS) -o $@ crc32_test64.o $(TEST_LDFLAGS) -+ - example64$(EXE): example64.o $(STATICLIB) - $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) - -@@ -362,8 +385,8 @@ zconf: $(SRCDIR)zconf.h.in - mostlyclean: clean - clean: - rm -f *.o *.lo *~ \ -- example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -- example64$(EXE) minigzip64$(EXE) \ -+ crc32_test$(EXE) example$(EXE) minigzip$(EXE) crc32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ -+ crc32_test64$(EXE) example64$(EXE) minigzip64$(EXE) \ - infcover \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o -@@ -385,7 +408,7 @@ tags: - - adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h --compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h -+compress.o crc32_test.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h - crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h - deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -@@ -395,7 +418,7 @@ trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)tr - - adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h --compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h -+compress.lo crc32_test.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h - crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h - deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h - infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h -diff --git a/configure b/configure -index 9ee7008..45d51e5 100755 ---- a/configure -+++ b/configure -@@ -858,6 +858,9 @@ cat > $test.c < - pascal/ by Bob Dellaca et al. - Support for Pascal - --power/ by Matheus Castanho -+power/ by Daniel Black -+ Matheus Castanho - and Rogerio Alves - Optimized functions for Power processors - -diff --git a/contrib/power/clang_workaround.h b/contrib/power/clang_workaround.h -new file mode 100644 -index 0000000..b5e7dae ---- /dev/null -+++ b/contrib/power/clang_workaround.h -@@ -0,0 +1,82 @@ -+#ifndef CLANG_WORKAROUNDS_H -+#define CLANG_WORKAROUNDS_H -+ -+/* -+ * These stubs fix clang incompatibilities with GCC builtins. -+ */ -+ -+#ifndef __builtin_crypto_vpmsumw -+#define __builtin_crypto_vpmsumw __builtin_crypto_vpmsumb -+#endif -+#ifndef __builtin_crypto_vpmsumd -+#define __builtin_crypto_vpmsumd __builtin_crypto_vpmsumb -+#endif -+ -+static inline -+__vector unsigned long long __attribute__((overloadable)) -+vec_ld(int __a, const __vector unsigned long long* __b) -+{ -+ return (__vector unsigned long long)__builtin_altivec_lvx(__a, __b); -+} -+ -+/* -+ * GCC __builtin_pack_vector_int128 returns a vector __int128_t but Clang -+ * does not recognize this type. On GCC this builtin is translated to a -+ * xxpermdi instruction that only moves the registers __a, __b instead generates -+ * a load. -+ * -+ * Clang has vec_xxpermdi intrinsics. It was implemented in 4.0.0. -+ */ -+static inline -+__vector unsigned long long __builtin_pack_vector (unsigned long __a, -+ unsigned long __b) -+{ -+ #if defined(__BIG_ENDIAN__) -+ __vector unsigned long long __v = {__a, __b}; -+ #else -+ __vector unsigned long long __v = {__b, __a}; -+ #endif -+ return __v; -+} -+ -+#ifndef vec_xxpermdi -+ -+static inline -+unsigned long __builtin_unpack_vector (__vector unsigned long long __v, -+ int __o) -+{ -+ return __v[__o]; -+} -+ -+#if defined(__BIG_ENDIAN__) -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 0) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 1) -+#else -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector ((a), 1) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector ((a), 0) -+#endif -+ -+#else -+ -+static inline -+unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v) -+{ -+ #if defined(__BIG_ENDIAN__) -+ return vec_xxpermdi(__v, __v, 0x0)[1]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x0)[0]; -+ #endif -+} -+ -+static inline -+unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v) -+{ -+ #if defined(__BIG_ENDIAN__) -+ return vec_xxpermdi(__v, __v, 0x3)[1]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x3)[0]; -+ #endif -+} -+#endif /* vec_xxpermdi */ -+ -+#endif -diff --git a/contrib/power/crc32_constants.h b/contrib/power/crc32_constants.h -new file mode 100644 -index 0000000..58088dc ---- /dev/null -+++ b/contrib/power/crc32_constants.h -@@ -0,0 +1,1206 @@ -+/* -+* -+* THIS FILE IS GENERATED WITH -+./crc32_constants -c -r -x 0x04C11DB7 -+ -+* This is from https://github.com/antonblanchard/crc32-vpmsum/ -+* DO NOT MODIFY IT MANUALLY! -+* -+*/ -+ -+#define CRC 0x4c11db7 -+#define CRC_XOR -+#define REFLECT -+#define MAX_SIZE 32768 -+ -+#ifndef __ASSEMBLER__ -+#ifdef CRC_TABLE -+static const unsigned int crc_table[] = { -+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, -+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, -+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, -+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, -+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, -+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, -+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, -+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, -+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, -+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, -+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, -+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, -+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, -+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, -+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, -+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, -+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, -+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, -+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, -+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, -+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, -+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, -+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, -+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, -+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, -+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, -+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, -+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, -+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, -+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, -+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, -+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, -+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,}; -+ -+#endif /* CRC_TABLE */ -+#ifdef POWER8_INTRINSICS -+ -+/* Constants */ -+ -+/* Reduce 262144 kbits to 1024 bits */ -+static const __vector unsigned long long vcrc_const[255] -+ __attribute__((aligned (16))) = { -+#ifdef __LITTLE_ENDIAN__ -+ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ -+ { 0x0000000099ea94a8, 0x00000001651797d2 }, -+ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ -+ { 0x00000000945a8420, 0x0000000021e0d56c }, -+ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ -+ { 0x0000000030762706, 0x000000000f95ecaa }, -+ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ -+ { 0x00000001a52fc582, 0x00000001ebd224ac }, -+ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ -+ { 0x00000001a4a7167a, 0x000000000ccb97ca }, -+ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ -+ { 0x000000000c18249a, 0x00000001006ec8a8 }, -+ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ -+ { 0x00000000a924ae7c, 0x000000014f58f196 }, -+ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ -+ { 0x00000001e12ccc12, 0x00000001a7192ca6 }, -+ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ -+ { 0x00000000a0b9d4ac, 0x000000019a64bab2 }, -+ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ -+ { 0x0000000095e8ddfe, 0x0000000014f4ed2e }, -+ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ -+ { 0x00000000233fddc4, 0x000000011092b6a2 }, -+ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ -+ { 0x00000001b4529b62, 0x00000000c8a1629c }, -+ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ -+ { 0x00000001a7fa0e64, 0x000000017bf32e8e }, -+ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ -+ { 0x00000001b5334592, 0x00000001f8cc6582 }, -+ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ -+ { 0x000000011f8ee1b4, 0x000000008631ddf0 }, -+ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ -+ { 0x000000006252e632, 0x000000007e5a76d0 }, -+ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ -+ { 0x00000000ab973e84, 0x000000002b09b31c }, -+ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ -+ { 0x000000007734f5ec, 0x00000001b2df1f84 }, -+ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ -+ { 0x000000007c547798, 0x00000001d6f56afc }, -+ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ -+ { 0x000000007ec40210, 0x00000001b9b5e70c }, -+ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ -+ { 0x00000001ab1695a8, 0x0000000034b626d2 }, -+ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ -+ { 0x0000000090494bba, 0x000000014c53479a }, -+ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ -+ { 0x00000001123fb816, 0x00000001a6d179a4 }, -+ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ -+ { 0x00000001e188c74c, 0x000000015abd16b4 }, -+ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ -+ { 0x00000001c2d3451c, 0x00000000018f9852 }, -+ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ -+ { 0x00000000f55cf1ca, 0x000000001fb3084a }, -+ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ -+ { 0x00000001a0531540, 0x00000000c53dfb04 }, -+ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ -+ { 0x0000000132cd7ebc, 0x00000000e10c9ad6 }, -+ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ -+ { 0x0000000073ab7f36, 0x0000000025aa994a }, -+ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ -+ { 0x0000000041aed1c2, 0x00000000fa3a74c4 }, -+ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ -+ { 0x0000000136c53800, 0x0000000033eb3f40 }, -+ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ -+ { 0x0000000126835a30, 0x000000017193f296 }, -+ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ -+ { 0x000000006241b502, 0x0000000043f6c86a }, -+ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ -+ { 0x00000000d5196ad4, 0x000000016b513ec6 }, -+ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ -+ { 0x000000009cfa769a, 0x00000000c8f25b4e }, -+ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ -+ { 0x00000000920e5df4, 0x00000001a45048ec }, -+ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ -+ { 0x0000000169dc310e, 0x000000000c441004 }, -+ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ -+ { 0x0000000009fc331c, 0x000000000e17cad6 }, -+ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ -+ { 0x000000010d94a81e, 0x00000001253ae964 }, -+ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ -+ { 0x0000000027a20ab2, 0x00000001d7c88ebc }, -+ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ -+ { 0x0000000114f87504, 0x00000001e7ca913a }, -+ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ -+ { 0x000000004b076d96, 0x0000000033ed078a }, -+ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ -+ { 0x00000000da4d1e74, 0x00000000e1839c78 }, -+ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ -+ { 0x000000001b81f672, 0x00000001322b267e }, -+ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ -+ { 0x000000009367c988, 0x00000000638231b6 }, -+ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ -+ { 0x00000001717214ca, 0x00000001ee7f16f4 }, -+ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ -+ { 0x000000009f47d820, 0x0000000117d9924a }, -+ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ -+ { 0x000000010d9a47d2, 0x00000000e1a9e0c4 }, -+ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ -+ { 0x00000000a696c58c, 0x00000001403731dc }, -+ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ -+ { 0x000000002aa28ec6, 0x00000001a5ea9682 }, -+ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ -+ { 0x00000001fe18fd9a, 0x0000000101c5c578 }, -+ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ -+ { 0x000000019d4fc1ae, 0x00000000dddf6494 }, -+ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ -+ { 0x00000001ba0e3dea, 0x00000000f1c3db28 }, -+ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ -+ { 0x0000000074b59a5e, 0x000000013112fb9c }, -+ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ -+ { 0x00000000f2b5ea98, 0x00000000b680b906 }, -+ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ -+ { 0x0000000187132676, 0x000000001a282932 }, -+ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ -+ { 0x000000010a8c6ad4, 0x0000000089406e7e }, -+ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ -+ { 0x00000001e21dfe70, 0x00000001def6be8c }, -+ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ -+ { 0x00000001da0050e4, 0x0000000075258728 }, -+ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ -+ { 0x00000000772172ae, 0x000000019536090a }, -+ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ -+ { 0x00000000e47724aa, 0x00000000f2455bfc }, -+ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ -+ { 0x000000003cd63ac4, 0x000000018c40baf4 }, -+ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ -+ { 0x00000001bf47d352, 0x000000004cd390d4 }, -+ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ -+ { 0x000000018dc1d708, 0x00000001e4ece95a }, -+ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ -+ { 0x000000002d4620a4, 0x000000001a3ee918 }, -+ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ -+ { 0x0000000058fd1740, 0x000000007c652fb8 }, -+ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ -+ { 0x00000000dadd9bfc, 0x000000011c67842c }, -+ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ -+ { 0x00000001ea2140be, 0x00000000254f759c }, -+ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ -+ { 0x000000009de128ba, 0x000000007ece94ca }, -+ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ -+ { 0x000000013ac3aa8e, 0x0000000038f258c2 }, -+ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ -+ { 0x0000000099980562, 0x00000001cdf17b00 }, -+ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ -+ { 0x00000001c1579c86, 0x000000011f882c16 }, -+ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ -+ { 0x0000000068dbbf94, 0x0000000100093fc8 }, -+ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ -+ { 0x000000004509fb04, 0x00000001cd684f16 }, -+ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ -+ { 0x00000001202f6398, 0x000000004bc6a70a }, -+ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ -+ { 0x000000013aea243e, 0x000000004fc7e8e4 }, -+ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ -+ { 0x00000001b4052ae6, 0x0000000130103f1c }, -+ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ -+ { 0x00000001cd2a0ae8, 0x0000000111b0024c }, -+ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ -+ { 0x00000001fe4aa8b4, 0x000000010b3079da }, -+ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ -+ { 0x00000001d1559a42, 0x000000010192bcc2 }, -+ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ -+ { 0x00000001f3e05ecc, 0x0000000074838d50 }, -+ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ -+ { 0x0000000104ddd2cc, 0x000000001b20f520 }, -+ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ -+ { 0x000000015393153c, 0x0000000050c3590a }, -+ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ -+ { 0x0000000057e942c6, 0x00000000b41cac8e }, -+ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ -+ { 0x000000012c633850, 0x000000000c72cc78 }, -+ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ -+ { 0x00000000ebcaae4c, 0x0000000030cdb032 }, -+ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ -+ { 0x000000013ee532a6, 0x000000013e09fc32 }, -+ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ -+ { 0x00000001bf0cbc7e, 0x000000001ed624d2 }, -+ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ -+ { 0x00000000d50b7a5a, 0x00000000781aee1a }, -+ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ -+ { 0x0000000002fca6e8, 0x00000001c4d8348c }, -+ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ -+ { 0x000000007af40044, 0x0000000057a40336 }, -+ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ -+ { 0x0000000016178744, 0x0000000085544940 }, -+ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ -+ { 0x000000014c177458, 0x000000019cd21e80 }, -+ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ -+ { 0x000000011b6ddf04, 0x000000013eb95bc0 }, -+ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ -+ { 0x00000001f3e29ccc, 0x00000001dfc9fdfc }, -+ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ -+ { 0x0000000135ae7562, 0x00000000cd028bc2 }, -+ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ -+ { 0x0000000190ef812c, 0x0000000090db8c44 }, -+ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ -+ { 0x0000000067a2c786, 0x000000010010a4ce }, -+ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ -+ { 0x0000000048b9496c, 0x00000001c8f4c72c }, -+ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ -+ { 0x000000015a422de6, 0x000000001c26170c }, -+ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ -+ { 0x00000001ef0e3640, 0x00000000e3fccf68 }, -+ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ -+ { 0x00000001006d2d26, 0x00000000d513ed24 }, -+ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ -+ { 0x00000001170d56d6, 0x00000000141beada }, -+ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ -+ { 0x00000000a5fb613c, 0x000000011071aea0 }, -+ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ -+ { 0x0000000040bbf7fc, 0x000000012e19080a }, -+ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ -+ { 0x000000016ac3a5b2, 0x0000000100ecf826 }, -+ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ -+ { 0x00000000abf16230, 0x0000000069b09412 }, -+ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ -+ { 0x00000001ebe23fac, 0x0000000122297bac }, -+ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ -+ { 0x000000008b6a0894, 0x00000000e9e4b068 }, -+ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ -+ { 0x00000001288ea478, 0x000000004b38651a }, -+ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ -+ { 0x000000016619c442, 0x00000001468360e2 }, -+ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ -+ { 0x0000000086230038, 0x00000000121c2408 }, -+ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ -+ { 0x000000017746a756, 0x00000000da7e7d08 }, -+ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ -+ { 0x0000000191b8f8f8, 0x00000001058d7652 }, -+ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ -+ { 0x000000008e167708, 0x000000014a098a90 }, -+ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ -+ { 0x0000000148b22d54, 0x0000000020dbe72e }, -+ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ -+ { 0x0000000044ba2c3c, 0x000000011e7323e8 }, -+ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ -+ { 0x00000000b54d2b52, 0x00000000d5d4bf94 }, -+ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ -+ { 0x0000000005a4fd8a, 0x0000000199d8746c }, -+ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ -+ { 0x0000000139f9fc46, 0x00000000ce9ca8a0 }, -+ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ -+ { 0x000000015a1fa824, 0x00000000136edece }, -+ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ -+ { 0x000000000a61ae4c, 0x000000019b92a068 }, -+ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ -+ { 0x0000000145e9113e, 0x0000000071d62206 }, -+ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ -+ { 0x000000006a348448, 0x00000000dfc50158 }, -+ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ -+ { 0x000000004d80a08c, 0x00000001517626bc }, -+ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ -+ { 0x000000014b6837a0, 0x0000000148d1e4fa }, -+ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ -+ { 0x000000016896a7fc, 0x0000000094d8266e }, -+ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ -+ { 0x000000014f187140, 0x00000000606c5e34 }, -+ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ -+ { 0x000000019581b9da, 0x000000019766beaa }, -+ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ -+ { 0x00000001091bc984, 0x00000001d80c506c }, -+ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ -+ { 0x000000001067223c, 0x000000001e73837c }, -+ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ -+ { 0x00000001ab16ea02, 0x0000000064d587de }, -+ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ -+ { 0x000000013c4598a8, 0x00000000f4a507b0 }, -+ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ -+ { 0x00000000b3735430, 0x0000000040e342fc }, -+ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ -+ { 0x00000001bb3fc0c0, 0x00000001d5ad9c3a }, -+ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ -+ { 0x00000001570ae19c, 0x0000000094a691a4 }, -+ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ -+ { 0x00000001ea910712, 0x00000001271ecdfa }, -+ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ -+ { 0x0000000167127128, 0x000000009e54475a }, -+ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ -+ { 0x0000000019e790a2, 0x00000000c9c099ee }, -+ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ -+ { 0x000000003788f710, 0x000000009a2f736c }, -+ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ -+ { 0x00000001682a160e, 0x00000000bb9f4996 }, -+ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ -+ { 0x000000007f0ebd2e, 0x00000001db688050 }, -+ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ -+ { 0x000000002b032080, 0x00000000e9b10af4 }, -+ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ -+ { 0x00000000cfd1664a, 0x000000012d4545e4 }, -+ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ -+ { 0x00000000aa1181c2, 0x000000000361139c }, -+ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ -+ { 0x00000000ddd08002, 0x00000001a5a1a3a8 }, -+ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ -+ { 0x00000000e8dd0446, 0x000000006844e0b0 }, -+ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ -+ { 0x00000001bbd94a00, 0x00000000c3762f28 }, -+ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ -+ { 0x00000000ab6cd180, 0x00000001d26287a2 }, -+ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ -+ { 0x0000000031803ce2, 0x00000001f6f0bba8 }, -+ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ -+ { 0x0000000024f40b0c, 0x000000002ffabd62 }, -+ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ -+ { 0x00000001ba1d9834, 0x00000000fb4516b8 }, -+ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ -+ { 0x0000000104de61aa, 0x000000018cfa961c }, -+ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ -+ { 0x0000000113e40d46, 0x000000019e588d52 }, -+ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ -+ { 0x00000001415598a0, 0x00000001180f0bbc }, -+ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ -+ { 0x00000000bf6c8c90, 0x00000000e1d9177a }, -+ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ -+ { 0x00000001788b0504, 0x0000000105abc27c }, -+ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ -+ { 0x0000000038385d02, 0x00000000972e4a58 }, -+ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ -+ { 0x00000001b6c83844, 0x0000000183499a5e }, -+ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ -+ { 0x0000000051061a8a, 0x00000001c96a8cca }, -+ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ -+ { 0x000000017351388a, 0x00000001a1a5b60c }, -+ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ -+ { 0x0000000132928f92, 0x00000000e4b6ac9c }, -+ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ -+ { 0x00000000e6b4f48a, 0x00000001807e7f5a }, -+ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ -+ { 0x0000000039d15e90, 0x000000017a7e3bc8 }, -+ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ -+ { 0x00000000312d6074, 0x00000000d73975da }, -+ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ -+ { 0x000000017bbb2cc4, 0x000000017375d038 }, -+ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ -+ { 0x000000016ded3e18, 0x00000000193680bc }, -+ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ -+ { 0x00000000f1638b16, 0x00000000999b06f6 }, -+ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ -+ { 0x00000001d38b9ecc, 0x00000001f685d2b8 }, -+ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ -+ { 0x000000018b8d09dc, 0x00000001f4ecbed2 }, -+ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ -+ { 0x00000000e7bc27d2, 0x00000000ba16f1a0 }, -+ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ -+ { 0x00000000275e1e96, 0x0000000115aceac4 }, -+ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ -+ { 0x00000000e2e3031e, 0x00000001aeff6292 }, -+ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ -+ { 0x00000001041c84d8, 0x000000009640124c }, -+ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ -+ { 0x00000000706ce672, 0x0000000114f41f02 }, -+ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ -+ { 0x000000015d5070da, 0x000000009c5f3586 }, -+ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ -+ { 0x0000000038f9493a, 0x00000001878275fa }, -+ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ -+ { 0x00000000a3348a76, 0x00000000ddc42ce8 }, -+ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ -+ { 0x00000001ad0aab92, 0x0000000181d2c73a }, -+ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ -+ { 0x000000019e85f712, 0x0000000141c9320a }, -+ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ -+ { 0x000000005a871e76, 0x000000015235719a }, -+ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ -+ { 0x000000017249c662, 0x00000000be27d804 }, -+ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ -+ { 0x000000003a084712, 0x000000006242d45a }, -+ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ -+ { 0x00000000ed438478, 0x000000009a53638e }, -+ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ -+ { 0x00000000abac34cc, 0x00000001001ecfb6 }, -+ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ -+ { 0x000000005f35ef3e, 0x000000016d7c2d64 }, -+ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ -+ { 0x0000000047d6608c, 0x00000001d0ce46c0 }, -+ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ -+ { 0x000000002d01470e, 0x0000000124c907b4 }, -+ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ -+ { 0x0000000158bbc7b0, 0x0000000018a555ca }, -+ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ -+ { 0x00000000c0a23e8e, 0x000000006b0980bc }, -+ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ -+ { 0x00000001ebd85c88, 0x000000008bbba964 }, -+ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ -+ { 0x000000019ee20bb2, 0x00000001070a5a1e }, -+ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ -+ { 0x00000001acabf2d6, 0x000000002204322a }, -+ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ -+ { 0x00000001b7963d56, 0x00000000a27524d0 }, -+ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ -+ { 0x000000017bffa1fe, 0x0000000020b1e4ba }, -+ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ -+ { 0x000000001f15333e, 0x0000000032cc27fc }, -+ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ -+ { 0x000000018593129e, 0x0000000044dd22b8 }, -+ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ -+ { 0x000000019cb32602, 0x00000000dffc9e0a }, -+ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ -+ { 0x0000000142b05cc8, 0x00000001b7a0ed14 }, -+ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ -+ { 0x00000001be49e7a4, 0x00000000c7842488 }, -+ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ -+ { 0x0000000108f69d6c, 0x00000001c02a4fee }, -+ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ -+ { 0x000000006c0971f0, 0x000000003c273778 }, -+ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ -+ { 0x000000005b16467a, 0x00000001d63f8894 }, -+ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ -+ { 0x00000001551a628e, 0x000000006be557d6 }, -+ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ -+ { 0x000000019e42ea92, 0x000000006a7806ea }, -+ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ -+ { 0x000000012fa83ff2, 0x000000016155aa0c }, -+ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ -+ { 0x000000011ca9cde0, 0x00000000908650ac }, -+ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ -+ { 0x00000000c8e5cd74, 0x00000000aa5a8084 }, -+ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ -+ { 0x0000000096c27f0c, 0x0000000191bb500a }, -+ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ -+ { 0x000000002baed926, 0x0000000064e9bed0 }, -+ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ -+ { 0x000000017c8de8d2, 0x000000009444f302 }, -+ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ -+ { 0x00000000d43d6068, 0x000000019db07d3c }, -+ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ -+ { 0x00000000cb2c4b26, 0x00000001359e3e6e }, -+ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ -+ { 0x0000000145b8da26, 0x00000001e4f10dd2 }, -+ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ -+ { 0x000000018fff4b08, 0x0000000124f5735e }, -+ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ -+ { 0x0000000150b58ed0, 0x0000000124760a4c }, -+ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ -+ { 0x00000001549f39bc, 0x000000000f1fc186 }, -+ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ -+ { 0x00000000ef4d2f42, 0x00000000150e4cc4 }, -+ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ -+ { 0x00000001b1468572, 0x000000002a6204e8 }, -+ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ -+ { 0x000000013d7403b2, 0x00000000beb1d432 }, -+ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ -+ { 0x00000001a4681842, 0x0000000135f3f1f0 }, -+ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ -+ { 0x0000000167714492, 0x0000000074fe2232 }, -+ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ -+ { 0x00000001e599099a, 0x000000001ac6e2ba }, -+ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ -+ { 0x00000000fe128194, 0x0000000013fca91e }, -+ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ -+ { 0x0000000077e8b990, 0x0000000183f4931e }, -+ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ -+ { 0x00000001a267f63a, 0x00000000b6d9b4e4 }, -+ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ -+ { 0x00000001945c245a, 0x00000000b5188656 }, -+ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ -+ { 0x0000000149002e76, 0x0000000027a81a84 }, -+ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ -+ { 0x00000001bb8310a4, 0x0000000125699258 }, -+ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ -+ { 0x000000019ec60bcc, 0x00000001b23de796 }, -+ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ -+ { 0x000000012d8590ae, 0x00000000fe4365dc }, -+ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ -+ { 0x0000000065b00684, 0x00000000c68f497a }, -+ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ -+ { 0x000000015e5aeadc, 0x00000000fbf521ee }, -+ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ -+ { 0x00000000b77ff2b0, 0x000000015eac3378 }, -+ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ -+ { 0x0000000188da2ff6, 0x0000000134914b90 }, -+ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ -+ { 0x0000000063da929a, 0x0000000016335cfe }, -+ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ -+ { 0x00000001389caa80, 0x000000010372d10c }, -+ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ -+ { 0x000000013db599d2, 0x000000015097b908 }, -+ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ -+ { 0x0000000122505a86, 0x00000001227a7572 }, -+ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ -+ { 0x000000016bd72746, 0x000000009a8f75c0 }, -+ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ -+ { 0x00000001c3faf1d4, 0x00000000682c77a2 }, -+ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ -+ { 0x00000001111c826c, 0x00000000231f091c }, -+ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ -+ { 0x00000000153e9fb2, 0x000000007d4439f2 }, -+ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ -+ { 0x000000002b1f7b60, 0x000000017e221efc }, -+ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ -+ { 0x00000000b1dba570, 0x0000000167457c38 }, -+ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ -+ { 0x00000001f6397b76, 0x00000000bdf081c4 }, -+ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ -+ { 0x0000000156335214, 0x000000016286d6b0 }, -+ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ -+ { 0x00000001d70e3986, 0x00000000c84f001c }, -+ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ -+ { 0x000000003701a774, 0x0000000064efe7c0 }, -+ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ -+ { 0x00000000ac81ef72, 0x000000000ac2d904 }, -+ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ -+ { 0x0000000133212464, 0x00000000fd226d14 }, -+ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ -+ { 0x00000000e4e45610, 0x000000011cfd42e0 }, -+ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ -+ { 0x000000000c1bd370, 0x000000016e5a5678 }, -+ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ -+ { 0x00000001a7b9e7a6, 0x00000001d888fe22 }, -+ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ -+ { 0x000000007d657a10, 0x00000001af77fcd4 } -+#else /* __LITTLE_ENDIAN__ */ -+ /* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */ -+ { 0x00000001651797d2, 0x0000000099ea94a8 }, -+ /* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */ -+ { 0x0000000021e0d56c, 0x00000000945a8420 }, -+ /* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */ -+ { 0x000000000f95ecaa, 0x0000000030762706 }, -+ /* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */ -+ { 0x00000001ebd224ac, 0x00000001a52fc582 }, -+ /* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */ -+ { 0x000000000ccb97ca, 0x00000001a4a7167a }, -+ /* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */ -+ { 0x00000001006ec8a8, 0x000000000c18249a }, -+ /* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */ -+ { 0x000000014f58f196, 0x00000000a924ae7c }, -+ /* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */ -+ { 0x00000001a7192ca6, 0x00000001e12ccc12 }, -+ /* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */ -+ { 0x000000019a64bab2, 0x00000000a0b9d4ac }, -+ /* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */ -+ { 0x0000000014f4ed2e, 0x0000000095e8ddfe }, -+ /* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */ -+ { 0x000000011092b6a2, 0x00000000233fddc4 }, -+ /* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */ -+ { 0x00000000c8a1629c, 0x00000001b4529b62 }, -+ /* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */ -+ { 0x000000017bf32e8e, 0x00000001a7fa0e64 }, -+ /* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */ -+ { 0x00000001f8cc6582, 0x00000001b5334592 }, -+ /* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */ -+ { 0x000000008631ddf0, 0x000000011f8ee1b4 }, -+ /* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */ -+ { 0x000000007e5a76d0, 0x000000006252e632 }, -+ /* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */ -+ { 0x000000002b09b31c, 0x00000000ab973e84 }, -+ /* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */ -+ { 0x00000001b2df1f84, 0x000000007734f5ec }, -+ /* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */ -+ { 0x00000001d6f56afc, 0x000000007c547798 }, -+ /* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */ -+ { 0x00000001b9b5e70c, 0x000000007ec40210 }, -+ /* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */ -+ { 0x0000000034b626d2, 0x00000001ab1695a8 }, -+ /* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */ -+ { 0x000000014c53479a, 0x0000000090494bba }, -+ /* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */ -+ { 0x00000001a6d179a4, 0x00000001123fb816 }, -+ /* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */ -+ { 0x000000015abd16b4, 0x00000001e188c74c }, -+ /* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */ -+ { 0x00000000018f9852, 0x00000001c2d3451c }, -+ /* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */ -+ { 0x000000001fb3084a, 0x00000000f55cf1ca }, -+ /* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */ -+ { 0x00000000c53dfb04, 0x00000001a0531540 }, -+ /* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */ -+ { 0x00000000e10c9ad6, 0x0000000132cd7ebc }, -+ /* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */ -+ { 0x0000000025aa994a, 0x0000000073ab7f36 }, -+ /* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */ -+ { 0x00000000fa3a74c4, 0x0000000041aed1c2 }, -+ /* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */ -+ { 0x0000000033eb3f40, 0x0000000136c53800 }, -+ /* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */ -+ { 0x000000017193f296, 0x0000000126835a30 }, -+ /* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */ -+ { 0x0000000043f6c86a, 0x000000006241b502 }, -+ /* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */ -+ { 0x000000016b513ec6, 0x00000000d5196ad4 }, -+ /* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */ -+ { 0x00000000c8f25b4e, 0x000000009cfa769a }, -+ /* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */ -+ { 0x00000001a45048ec, 0x00000000920e5df4 }, -+ /* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */ -+ { 0x000000000c441004, 0x0000000169dc310e }, -+ /* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */ -+ { 0x000000000e17cad6, 0x0000000009fc331c }, -+ /* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */ -+ { 0x00000001253ae964, 0x000000010d94a81e }, -+ /* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */ -+ { 0x00000001d7c88ebc, 0x0000000027a20ab2 }, -+ /* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */ -+ { 0x00000001e7ca913a, 0x0000000114f87504 }, -+ /* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */ -+ { 0x0000000033ed078a, 0x000000004b076d96 }, -+ /* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */ -+ { 0x00000000e1839c78, 0x00000000da4d1e74 }, -+ /* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */ -+ { 0x00000001322b267e, 0x000000001b81f672 }, -+ /* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */ -+ { 0x00000000638231b6, 0x000000009367c988 }, -+ /* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */ -+ { 0x00000001ee7f16f4, 0x00000001717214ca }, -+ /* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */ -+ { 0x0000000117d9924a, 0x000000009f47d820 }, -+ /* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */ -+ { 0x00000000e1a9e0c4, 0x000000010d9a47d2 }, -+ /* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */ -+ { 0x00000001403731dc, 0x00000000a696c58c }, -+ /* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */ -+ { 0x00000001a5ea9682, 0x000000002aa28ec6 }, -+ /* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */ -+ { 0x0000000101c5c578, 0x00000001fe18fd9a }, -+ /* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */ -+ { 0x00000000dddf6494, 0x000000019d4fc1ae }, -+ /* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */ -+ { 0x00000000f1c3db28, 0x00000001ba0e3dea }, -+ /* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */ -+ { 0x000000013112fb9c, 0x0000000074b59a5e }, -+ /* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */ -+ { 0x00000000b680b906, 0x00000000f2b5ea98 }, -+ /* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */ -+ { 0x000000001a282932, 0x0000000187132676 }, -+ /* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */ -+ { 0x0000000089406e7e, 0x000000010a8c6ad4 }, -+ /* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */ -+ { 0x00000001def6be8c, 0x00000001e21dfe70 }, -+ /* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */ -+ { 0x0000000075258728, 0x00000001da0050e4 }, -+ /* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */ -+ { 0x000000019536090a, 0x00000000772172ae }, -+ /* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */ -+ { 0x00000000f2455bfc, 0x00000000e47724aa }, -+ /* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */ -+ { 0x000000018c40baf4, 0x000000003cd63ac4 }, -+ /* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */ -+ { 0x000000004cd390d4, 0x00000001bf47d352 }, -+ /* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */ -+ { 0x00000001e4ece95a, 0x000000018dc1d708 }, -+ /* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */ -+ { 0x000000001a3ee918, 0x000000002d4620a4 }, -+ /* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */ -+ { 0x000000007c652fb8, 0x0000000058fd1740 }, -+ /* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */ -+ { 0x000000011c67842c, 0x00000000dadd9bfc }, -+ /* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */ -+ { 0x00000000254f759c, 0x00000001ea2140be }, -+ /* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */ -+ { 0x000000007ece94ca, 0x000000009de128ba }, -+ /* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */ -+ { 0x0000000038f258c2, 0x000000013ac3aa8e }, -+ /* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */ -+ { 0x00000001cdf17b00, 0x0000000099980562 }, -+ /* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */ -+ { 0x000000011f882c16, 0x00000001c1579c86 }, -+ /* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */ -+ { 0x0000000100093fc8, 0x0000000068dbbf94 }, -+ /* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */ -+ { 0x00000001cd684f16, 0x000000004509fb04 }, -+ /* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */ -+ { 0x000000004bc6a70a, 0x00000001202f6398 }, -+ /* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */ -+ { 0x000000004fc7e8e4, 0x000000013aea243e }, -+ /* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */ -+ { 0x0000000130103f1c, 0x00000001b4052ae6 }, -+ /* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */ -+ { 0x0000000111b0024c, 0x00000001cd2a0ae8 }, -+ /* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */ -+ { 0x000000010b3079da, 0x00000001fe4aa8b4 }, -+ /* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */ -+ { 0x000000010192bcc2, 0x00000001d1559a42 }, -+ /* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */ -+ { 0x0000000074838d50, 0x00000001f3e05ecc }, -+ /* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */ -+ { 0x000000001b20f520, 0x0000000104ddd2cc }, -+ /* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */ -+ { 0x0000000050c3590a, 0x000000015393153c }, -+ /* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */ -+ { 0x00000000b41cac8e, 0x0000000057e942c6 }, -+ /* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */ -+ { 0x000000000c72cc78, 0x000000012c633850 }, -+ /* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */ -+ { 0x0000000030cdb032, 0x00000000ebcaae4c }, -+ /* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */ -+ { 0x000000013e09fc32, 0x000000013ee532a6 }, -+ /* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */ -+ { 0x000000001ed624d2, 0x00000001bf0cbc7e }, -+ /* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */ -+ { 0x00000000781aee1a, 0x00000000d50b7a5a }, -+ /* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */ -+ { 0x00000001c4d8348c, 0x0000000002fca6e8 }, -+ /* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */ -+ { 0x0000000057a40336, 0x000000007af40044 }, -+ /* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */ -+ { 0x0000000085544940, 0x0000000016178744 }, -+ /* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */ -+ { 0x000000019cd21e80, 0x000000014c177458 }, -+ /* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */ -+ { 0x000000013eb95bc0, 0x000000011b6ddf04 }, -+ /* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */ -+ { 0x00000001dfc9fdfc, 0x00000001f3e29ccc }, -+ /* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */ -+ { 0x00000000cd028bc2, 0x0000000135ae7562 }, -+ /* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */ -+ { 0x0000000090db8c44, 0x0000000190ef812c }, -+ /* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */ -+ { 0x000000010010a4ce, 0x0000000067a2c786 }, -+ /* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */ -+ { 0x00000001c8f4c72c, 0x0000000048b9496c }, -+ /* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */ -+ { 0x000000001c26170c, 0x000000015a422de6 }, -+ /* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */ -+ { 0x00000000e3fccf68, 0x00000001ef0e3640 }, -+ /* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */ -+ { 0x00000000d513ed24, 0x00000001006d2d26 }, -+ /* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */ -+ { 0x00000000141beada, 0x00000001170d56d6 }, -+ /* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */ -+ { 0x000000011071aea0, 0x00000000a5fb613c }, -+ /* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */ -+ { 0x000000012e19080a, 0x0000000040bbf7fc }, -+ /* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */ -+ { 0x0000000100ecf826, 0x000000016ac3a5b2 }, -+ /* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */ -+ { 0x0000000069b09412, 0x00000000abf16230 }, -+ /* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */ -+ { 0x0000000122297bac, 0x00000001ebe23fac }, -+ /* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */ -+ { 0x00000000e9e4b068, 0x000000008b6a0894 }, -+ /* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */ -+ { 0x000000004b38651a, 0x00000001288ea478 }, -+ /* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */ -+ { 0x00000001468360e2, 0x000000016619c442 }, -+ /* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */ -+ { 0x00000000121c2408, 0x0000000086230038 }, -+ /* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */ -+ { 0x00000000da7e7d08, 0x000000017746a756 }, -+ /* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */ -+ { 0x00000001058d7652, 0x0000000191b8f8f8 }, -+ /* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */ -+ { 0x000000014a098a90, 0x000000008e167708 }, -+ /* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */ -+ { 0x0000000020dbe72e, 0x0000000148b22d54 }, -+ /* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */ -+ { 0x000000011e7323e8, 0x0000000044ba2c3c }, -+ /* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */ -+ { 0x00000000d5d4bf94, 0x00000000b54d2b52 }, -+ /* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */ -+ { 0x0000000199d8746c, 0x0000000005a4fd8a }, -+ /* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */ -+ { 0x00000000ce9ca8a0, 0x0000000139f9fc46 }, -+ /* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */ -+ { 0x00000000136edece, 0x000000015a1fa824 }, -+ /* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */ -+ { 0x000000019b92a068, 0x000000000a61ae4c }, -+ /* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */ -+ { 0x0000000071d62206, 0x0000000145e9113e }, -+ /* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */ -+ { 0x00000000dfc50158, 0x000000006a348448 }, -+ /* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */ -+ { 0x00000001517626bc, 0x000000004d80a08c }, -+ /* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */ -+ { 0x0000000148d1e4fa, 0x000000014b6837a0 }, -+ /* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */ -+ { 0x0000000094d8266e, 0x000000016896a7fc }, -+ /* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */ -+ { 0x00000000606c5e34, 0x000000014f187140 }, -+ /* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */ -+ { 0x000000019766beaa, 0x000000019581b9da }, -+ /* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */ -+ { 0x00000001d80c506c, 0x00000001091bc984 }, -+ /* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */ -+ { 0x000000001e73837c, 0x000000001067223c }, -+ /* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */ -+ { 0x0000000064d587de, 0x00000001ab16ea02 }, -+ /* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */ -+ { 0x00000000f4a507b0, 0x000000013c4598a8 }, -+ /* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */ -+ { 0x0000000040e342fc, 0x00000000b3735430 }, -+ /* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */ -+ { 0x00000001d5ad9c3a, 0x00000001bb3fc0c0 }, -+ /* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */ -+ { 0x0000000094a691a4, 0x00000001570ae19c }, -+ /* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */ -+ { 0x00000001271ecdfa, 0x00000001ea910712 }, -+ /* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */ -+ { 0x000000009e54475a, 0x0000000167127128 }, -+ /* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */ -+ { 0x00000000c9c099ee, 0x0000000019e790a2 }, -+ /* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */ -+ { 0x000000009a2f736c, 0x000000003788f710 }, -+ /* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */ -+ { 0x00000000bb9f4996, 0x00000001682a160e }, -+ /* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */ -+ { 0x00000001db688050, 0x000000007f0ebd2e }, -+ /* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */ -+ { 0x00000000e9b10af4, 0x000000002b032080 }, -+ /* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */ -+ { 0x000000012d4545e4, 0x00000000cfd1664a }, -+ /* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */ -+ { 0x000000000361139c, 0x00000000aa1181c2 }, -+ /* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */ -+ { 0x00000001a5a1a3a8, 0x00000000ddd08002 }, -+ /* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */ -+ { 0x000000006844e0b0, 0x00000000e8dd0446 }, -+ /* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */ -+ { 0x00000000c3762f28, 0x00000001bbd94a00 }, -+ /* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */ -+ { 0x00000001d26287a2, 0x00000000ab6cd180 }, -+ /* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */ -+ { 0x00000001f6f0bba8, 0x0000000031803ce2 }, -+ /* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */ -+ { 0x000000002ffabd62, 0x0000000024f40b0c }, -+ /* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */ -+ { 0x00000000fb4516b8, 0x00000001ba1d9834 }, -+ /* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */ -+ { 0x000000018cfa961c, 0x0000000104de61aa }, -+ /* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */ -+ { 0x000000019e588d52, 0x0000000113e40d46 }, -+ /* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */ -+ { 0x00000001180f0bbc, 0x00000001415598a0 }, -+ /* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */ -+ { 0x00000000e1d9177a, 0x00000000bf6c8c90 }, -+ /* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */ -+ { 0x0000000105abc27c, 0x00000001788b0504 }, -+ /* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */ -+ { 0x00000000972e4a58, 0x0000000038385d02 }, -+ /* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */ -+ { 0x0000000183499a5e, 0x00000001b6c83844 }, -+ /* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */ -+ { 0x00000001c96a8cca, 0x0000000051061a8a }, -+ /* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */ -+ { 0x00000001a1a5b60c, 0x000000017351388a }, -+ /* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */ -+ { 0x00000000e4b6ac9c, 0x0000000132928f92 }, -+ /* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */ -+ { 0x00000001807e7f5a, 0x00000000e6b4f48a }, -+ /* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */ -+ { 0x000000017a7e3bc8, 0x0000000039d15e90 }, -+ /* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */ -+ { 0x00000000d73975da, 0x00000000312d6074 }, -+ /* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */ -+ { 0x000000017375d038, 0x000000017bbb2cc4 }, -+ /* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */ -+ { 0x00000000193680bc, 0x000000016ded3e18 }, -+ /* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */ -+ { 0x00000000999b06f6, 0x00000000f1638b16 }, -+ /* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */ -+ { 0x00000001f685d2b8, 0x00000001d38b9ecc }, -+ /* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */ -+ { 0x00000001f4ecbed2, 0x000000018b8d09dc }, -+ /* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */ -+ { 0x00000000ba16f1a0, 0x00000000e7bc27d2 }, -+ /* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */ -+ { 0x0000000115aceac4, 0x00000000275e1e96 }, -+ /* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */ -+ { 0x00000001aeff6292, 0x00000000e2e3031e }, -+ /* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */ -+ { 0x000000009640124c, 0x00000001041c84d8 }, -+ /* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */ -+ { 0x0000000114f41f02, 0x00000000706ce672 }, -+ /* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */ -+ { 0x000000009c5f3586, 0x000000015d5070da }, -+ /* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */ -+ { 0x00000001878275fa, 0x0000000038f9493a }, -+ /* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */ -+ { 0x00000000ddc42ce8, 0x00000000a3348a76 }, -+ /* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */ -+ { 0x0000000181d2c73a, 0x00000001ad0aab92 }, -+ /* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */ -+ { 0x0000000141c9320a, 0x000000019e85f712 }, -+ /* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */ -+ { 0x000000015235719a, 0x000000005a871e76 }, -+ /* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */ -+ { 0x00000000be27d804, 0x000000017249c662 }, -+ /* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */ -+ { 0x000000006242d45a, 0x000000003a084712 }, -+ /* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */ -+ { 0x000000009a53638e, 0x00000000ed438478 }, -+ /* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */ -+ { 0x00000001001ecfb6, 0x00000000abac34cc }, -+ /* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */ -+ { 0x000000016d7c2d64, 0x000000005f35ef3e }, -+ /* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */ -+ { 0x00000001d0ce46c0, 0x0000000047d6608c }, -+ /* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */ -+ { 0x0000000124c907b4, 0x000000002d01470e }, -+ /* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */ -+ { 0x0000000018a555ca, 0x0000000158bbc7b0 }, -+ /* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */ -+ { 0x000000006b0980bc, 0x00000000c0a23e8e }, -+ /* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */ -+ { 0x000000008bbba964, 0x00000001ebd85c88 }, -+ /* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */ -+ { 0x00000001070a5a1e, 0x000000019ee20bb2 }, -+ /* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */ -+ { 0x000000002204322a, 0x00000001acabf2d6 }, -+ /* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */ -+ { 0x00000000a27524d0, 0x00000001b7963d56 }, -+ /* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */ -+ { 0x0000000020b1e4ba, 0x000000017bffa1fe }, -+ /* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */ -+ { 0x0000000032cc27fc, 0x000000001f15333e }, -+ /* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */ -+ { 0x0000000044dd22b8, 0x000000018593129e }, -+ /* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */ -+ { 0x00000000dffc9e0a, 0x000000019cb32602 }, -+ /* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */ -+ { 0x00000001b7a0ed14, 0x0000000142b05cc8 }, -+ /* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */ -+ { 0x00000000c7842488, 0x00000001be49e7a4 }, -+ /* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */ -+ { 0x00000001c02a4fee, 0x0000000108f69d6c }, -+ /* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */ -+ { 0x000000003c273778, 0x000000006c0971f0 }, -+ /* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */ -+ { 0x00000001d63f8894, 0x000000005b16467a }, -+ /* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */ -+ { 0x000000006be557d6, 0x00000001551a628e }, -+ /* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */ -+ { 0x000000006a7806ea, 0x000000019e42ea92 }, -+ /* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */ -+ { 0x000000016155aa0c, 0x000000012fa83ff2 }, -+ /* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */ -+ { 0x00000000908650ac, 0x000000011ca9cde0 }, -+ /* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */ -+ { 0x00000000aa5a8084, 0x00000000c8e5cd74 }, -+ /* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */ -+ { 0x0000000191bb500a, 0x0000000096c27f0c }, -+ /* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */ -+ { 0x0000000064e9bed0, 0x000000002baed926 }, -+ /* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */ -+ { 0x000000009444f302, 0x000000017c8de8d2 }, -+ /* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */ -+ { 0x000000019db07d3c, 0x00000000d43d6068 }, -+ /* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */ -+ { 0x00000001359e3e6e, 0x00000000cb2c4b26 }, -+ /* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */ -+ { 0x00000001e4f10dd2, 0x0000000145b8da26 }, -+ /* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */ -+ { 0x0000000124f5735e, 0x000000018fff4b08 }, -+ /* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */ -+ { 0x0000000124760a4c, 0x0000000150b58ed0 }, -+ /* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */ -+ { 0x000000000f1fc186, 0x00000001549f39bc }, -+ /* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */ -+ { 0x00000000150e4cc4, 0x00000000ef4d2f42 }, -+ /* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */ -+ { 0x000000002a6204e8, 0x00000001b1468572 }, -+ /* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */ -+ { 0x00000000beb1d432, 0x000000013d7403b2 }, -+ /* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */ -+ { 0x0000000135f3f1f0, 0x00000001a4681842 }, -+ /* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */ -+ { 0x0000000074fe2232, 0x0000000167714492 }, -+ /* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */ -+ { 0x000000001ac6e2ba, 0x00000001e599099a }, -+ /* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */ -+ { 0x0000000013fca91e, 0x00000000fe128194 }, -+ /* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */ -+ { 0x0000000183f4931e, 0x0000000077e8b990 }, -+ /* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */ -+ { 0x00000000b6d9b4e4, 0x00000001a267f63a }, -+ /* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */ -+ { 0x00000000b5188656, 0x00000001945c245a }, -+ /* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */ -+ { 0x0000000027a81a84, 0x0000000149002e76 }, -+ /* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */ -+ { 0x0000000125699258, 0x00000001bb8310a4 }, -+ /* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */ -+ { 0x00000001b23de796, 0x000000019ec60bcc }, -+ /* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */ -+ { 0x00000000fe4365dc, 0x000000012d8590ae }, -+ /* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */ -+ { 0x00000000c68f497a, 0x0000000065b00684 }, -+ /* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */ -+ { 0x00000000fbf521ee, 0x000000015e5aeadc }, -+ /* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */ -+ { 0x000000015eac3378, 0x00000000b77ff2b0 }, -+ /* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */ -+ { 0x0000000134914b90, 0x0000000188da2ff6 }, -+ /* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */ -+ { 0x0000000016335cfe, 0x0000000063da929a }, -+ /* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */ -+ { 0x000000010372d10c, 0x00000001389caa80 }, -+ /* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */ -+ { 0x000000015097b908, 0x000000013db599d2 }, -+ /* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */ -+ { 0x00000001227a7572, 0x0000000122505a86 }, -+ /* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */ -+ { 0x000000009a8f75c0, 0x000000016bd72746 }, -+ /* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */ -+ { 0x00000000682c77a2, 0x00000001c3faf1d4 }, -+ /* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */ -+ { 0x00000000231f091c, 0x00000001111c826c }, -+ /* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */ -+ { 0x000000007d4439f2, 0x00000000153e9fb2 }, -+ /* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */ -+ { 0x000000017e221efc, 0x000000002b1f7b60 }, -+ /* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */ -+ { 0x0000000167457c38, 0x00000000b1dba570 }, -+ /* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */ -+ { 0x00000000bdf081c4, 0x00000001f6397b76 }, -+ /* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */ -+ { 0x000000016286d6b0, 0x0000000156335214 }, -+ /* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */ -+ { 0x00000000c84f001c, 0x00000001d70e3986 }, -+ /* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */ -+ { 0x0000000064efe7c0, 0x000000003701a774 }, -+ /* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */ -+ { 0x000000000ac2d904, 0x00000000ac81ef72 }, -+ /* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */ -+ { 0x00000000fd226d14, 0x0000000133212464 }, -+ /* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */ -+ { 0x000000011cfd42e0, 0x00000000e4e45610 }, -+ /* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */ -+ { 0x000000016e5a5678, 0x000000000c1bd370 }, -+ /* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */ -+ { 0x00000001d888fe22, 0x00000001a7b9e7a6 }, -+ /* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */ -+ { 0x00000001af77fcd4, 0x000000007d657a10 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+ -+/* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */ -+ -+static const __vector unsigned long long vcrc_short_const[16] -+ __attribute__((aligned (16))) = { -+#ifdef __LITTLE_ENDIAN__ -+ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ -+ { 0x99168a18ec447f11, 0xed837b2613e8221e }, -+ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ -+ { 0xe23e954e8fd2cd3c, 0xc8acdd8147b9ce5a }, -+ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ -+ { 0x92f8befe6b1d2b53, 0xd9ad6d87d4277e25 }, -+ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ -+ { 0xf38a3556291ea462, 0xc10ec5e033fbca3b }, -+ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ -+ { 0x974ac56262b6ca4b, 0xc0b55b0e82e02e2f }, -+ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ -+ { 0x855712b3784d2a56, 0x71aa1df0e172334d }, -+ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ -+ { 0xa5abe9f80eaee722, 0xfee3053e3969324d }, -+ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ -+ { 0x1fa0943ddb54814c, 0xf44779b93eb2bd08 }, -+ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ -+ { 0xa53ff440d7bbfe6a, 0xf5449b3f00cc3374 }, -+ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ -+ { 0xebe7e3566325605c, 0x6f8346e1d777606e }, -+ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ -+ { 0xc65a272ce5b592b8, 0xe3ab4f2ac0b95347 }, -+ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ -+ { 0x5705a9ca4721589f, 0xaa2215ea329ecc11 }, -+ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ -+ { 0xe3720acb88d14467, 0x1ed8f66ed95efd26 }, -+ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ -+ { 0xba1aca0315141c31, 0x78ed02d5a700e96a }, -+ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ -+ { 0xad2a31b3ed627dae, 0xba8ccbe832b39da3 }, -+ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ -+ { 0x6655004fa06a2517, 0xedb88320b1e6b092 } -+#else /* __LITTLE_ENDIAN__ */ -+ /* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */ -+ { 0xed837b2613e8221e, 0x99168a18ec447f11 }, -+ /* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */ -+ { 0xc8acdd8147b9ce5a, 0xe23e954e8fd2cd3c }, -+ /* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */ -+ { 0xd9ad6d87d4277e25, 0x92f8befe6b1d2b53 }, -+ /* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */ -+ { 0xc10ec5e033fbca3b, 0xf38a3556291ea462 }, -+ /* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */ -+ { 0xc0b55b0e82e02e2f, 0x974ac56262b6ca4b }, -+ /* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */ -+ { 0x71aa1df0e172334d, 0x855712b3784d2a56 }, -+ /* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */ -+ { 0xfee3053e3969324d, 0xa5abe9f80eaee722 }, -+ /* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */ -+ { 0xf44779b93eb2bd08, 0x1fa0943ddb54814c }, -+ /* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */ -+ { 0xf5449b3f00cc3374, 0xa53ff440d7bbfe6a }, -+ /* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */ -+ { 0x6f8346e1d777606e, 0xebe7e3566325605c }, -+ /* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */ -+ { 0xe3ab4f2ac0b95347, 0xc65a272ce5b592b8 }, -+ /* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */ -+ { 0xaa2215ea329ecc11, 0x5705a9ca4721589f }, -+ /* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */ -+ { 0x1ed8f66ed95efd26, 0xe3720acb88d14467 }, -+ /* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */ -+ { 0x78ed02d5a700e96a, 0xba1aca0315141c31 }, -+ /* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */ -+ { 0xba8ccbe832b39da3, 0xad2a31b3ed627dae }, -+ /* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */ -+ { 0xedb88320b1e6b092, 0x6655004fa06a2517 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+ -+/* Barrett constants */ -+/* 33 bit reflected Barrett constant m - (4^32)/n */ -+ -+static const __vector unsigned long long v_Barrett_const[2] -+ __attribute__((aligned (16))) = { -+ /* x^64 div p(x) */ -+#ifdef __LITTLE_ENDIAN__ -+ { 0x00000001f7011641, 0x0000000000000000 }, -+ { 0x00000001db710641, 0x0000000000000000 } -+#else /* __LITTLE_ENDIAN__ */ -+ { 0x0000000000000000, 0x00000001f7011641 }, -+ { 0x0000000000000000, 0x00000001db710641 } -+#endif /* __LITTLE_ENDIAN__ */ -+ }; -+#endif /* POWER8_INTRINSICS */ -+ -+#endif /* __ASSEMBLER__ */ -diff --git a/contrib/power/crc32_z_power8.c b/contrib/power/crc32_z_power8.c -new file mode 100644 -index 0000000..7858cfe ---- /dev/null -+++ b/contrib/power/crc32_z_power8.c -@@ -0,0 +1,679 @@ -+/* -+ * Calculate the checksum of data that is 16 byte aligned and a multiple of -+ * 16 bytes. -+ * -+ * The first step is to reduce it to 1024 bits. We do this in 8 parallel -+ * chunks in order to mask the latency of the vpmsum instructions. If we -+ * have more than 32 kB of data to checksum we repeat this step multiple -+ * times, passing in the previous 1024 bits. -+ * -+ * The next step is to reduce the 1024 bits to 64 bits. This step adds -+ * 32 bits of 0s to the end - this matches what a CRC does. We just -+ * calculate constants that land the data in this 32 bits. -+ * -+ * We then use fixed point Barrett reduction to compute a mod n over GF(2) -+ * for n = CRC using POWER8 instructions. We use x = 32. -+ * -+ * http://en.wikipedia.org/wiki/Barrett_reduction -+ * -+ * This code uses gcc vector builtins instead using assembly directly. -+ * -+ * Copyright (C) 2017 Rogerio Alves , IBM -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of either: -+ * -+ * a) the GNU General Public License as published by the Free Software -+ * Foundation; either version 2 of the License, or (at your option) -+ * any later version, or -+ * b) the Apache License, Version 2.0 -+ */ -+ -+#include -+#include "../../zutil.h" -+#include "power.h" -+ -+#define POWER8_INTRINSICS -+#define CRC_TABLE -+ -+#ifdef CRC32_CONSTANTS_HEADER -+#include CRC32_CONSTANTS_HEADER -+#else -+#include "crc32_constants.h" -+#endif -+ -+#define VMX_ALIGN 16 -+#define VMX_ALIGN_MASK (VMX_ALIGN-1) -+ -+#ifdef REFLECT -+static unsigned int crc32_align(unsigned int crc, const unsigned char *p, -+ unsigned long len) -+{ -+ while (len--) -+ crc = crc_table[(crc ^ *p++) & 0xff] ^ (crc >> 8); -+ return crc; -+} -+#else -+static unsigned int crc32_align(unsigned int crc, const unsigned char *p, -+ unsigned long len) -+{ -+ while (len--) -+ crc = crc_table[((crc >> 24) ^ *p++) & 0xff] ^ (crc << 8); -+ return crc; -+} -+#endif -+ -+static unsigned int __attribute__ ((aligned (32))) -+__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len); -+ -+unsigned long ZLIB_INTERNAL _crc32_z_power8(uLong _crc, const Bytef *_p, -+ z_size_t _len) -+{ -+ unsigned int prealign; -+ unsigned int tail; -+ -+ /* Map zlib API to crc32_vpmsum API */ -+ unsigned int crc = (unsigned int) (0xffffffff & _crc); -+ const unsigned char *p = _p; -+ unsigned long len = (unsigned long) _len; -+ -+ if (p == (const unsigned char *) 0x0) return 0; -+#ifdef CRC_XOR -+ crc ^= 0xffffffff; -+#endif -+ -+ if (len < VMX_ALIGN + VMX_ALIGN_MASK) { -+ crc = crc32_align(crc, p, len); -+ goto out; -+ } -+ -+ if ((unsigned long)p & VMX_ALIGN_MASK) { -+ prealign = VMX_ALIGN - ((unsigned long)p & VMX_ALIGN_MASK); -+ crc = crc32_align(crc, p, prealign); -+ len -= prealign; -+ p += prealign; -+ } -+ -+ crc = __crc32_vpmsum(crc, p, len & ~VMX_ALIGN_MASK); -+ -+ tail = len & VMX_ALIGN_MASK; -+ if (tail) { -+ p += len & ~VMX_ALIGN_MASK; -+ crc = crc32_align(crc, p, tail); -+ } -+ -+out: -+#ifdef CRC_XOR -+ crc ^= 0xffffffff; -+#endif -+ -+ /* Convert to zlib API */ -+ return (unsigned long) crc; -+} -+ -+#if defined (__clang__) -+#include "clang_workaround.h" -+#else -+#define __builtin_pack_vector(a, b) __builtin_pack_vector_int128 ((a), (b)) -+#define __builtin_unpack_vector_0(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 0) -+#define __builtin_unpack_vector_1(a) __builtin_unpack_vector_int128 ((vector __int128_t)(a), 1) -+#endif -+ -+/* When we have a load-store in a single-dispatch group and address overlap -+ * such that foward is not allowed (load-hit-store) the group must be flushed. -+ * A group ending NOP prevents the flush. -+ */ -+#define GROUP_ENDING_NOP asm("ori 2,2,0" ::: "memory") -+ -+#if defined(__BIG_ENDIAN__) && defined (REFLECT) -+#define BYTESWAP_DATA -+#elif defined(__LITTLE_ENDIAN__) && !defined(REFLECT) -+#define BYTESWAP_DATA -+#endif -+ -+#ifdef BYTESWAP_DATA -+#define VEC_PERM(vr, va, vb, vc) vr = vec_perm(va, vb,\ -+ (__vector unsigned char) vc) -+#if defined(__LITTLE_ENDIAN__) -+/* Byte reverse permute constant LE. */ -+static const __vector unsigned long long vperm_const -+ __attribute__ ((aligned(16))) = { 0x08090A0B0C0D0E0FUL, -+ 0x0001020304050607UL }; -+#else -+static const __vector unsigned long long vperm_const -+ __attribute__ ((aligned(16))) = { 0x0F0E0D0C0B0A0908UL, -+ 0X0706050403020100UL }; -+#endif -+#else -+#define VEC_PERM(vr, va, vb, vc) -+#endif -+ -+static unsigned int __attribute__ ((aligned (32))) -+__crc32_vpmsum(unsigned int crc, const void* p, unsigned long len) { -+ -+ const __vector unsigned long long vzero = {0,0}; -+ const __vector unsigned long long vones = {0xffffffffffffffffUL, -+ 0xffffffffffffffffUL}; -+ -+#ifdef REFLECT -+ const __vector unsigned long long vmask_32bit = -+ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, -+ (__vector unsigned char)vones, 4); -+#endif -+ -+ const __vector unsigned long long vmask_64bit = -+ (__vector unsigned long long)vec_sld((__vector unsigned char)vzero, -+ (__vector unsigned char)vones, 8); -+ -+ __vector unsigned long long vcrc; -+ -+ __vector unsigned long long vconst1, vconst2; -+ -+ /* vdata0-vdata7 will contain our data (p). */ -+ __vector unsigned long long vdata0, vdata1, vdata2, vdata3, vdata4, -+ vdata5, vdata6, vdata7; -+ -+ /* v0-v7 will contain our checksums */ -+ __vector unsigned long long v0 = {0,0}; -+ __vector unsigned long long v1 = {0,0}; -+ __vector unsigned long long v2 = {0,0}; -+ __vector unsigned long long v3 = {0,0}; -+ __vector unsigned long long v4 = {0,0}; -+ __vector unsigned long long v5 = {0,0}; -+ __vector unsigned long long v6 = {0,0}; -+ __vector unsigned long long v7 = {0,0}; -+ -+ -+ /* Vector auxiliary variables. */ -+ __vector unsigned long long va0, va1, va2, va3, va4, va5, va6, va7; -+ -+ unsigned int result = 0; -+ unsigned int offset; /* Constant table offset. */ -+ -+ unsigned long i; /* Counter. */ -+ unsigned long chunks; -+ -+ unsigned long block_size; -+ int next_block = 0; -+ -+ /* Align by 128 bits. The last 128 bit block will be processed at end. */ -+ unsigned long length = len & 0xFFFFFFFFFFFFFF80UL; -+ -+#ifdef REFLECT -+ vcrc = (__vector unsigned long long)__builtin_pack_vector(0UL, crc); -+#else -+ vcrc = (__vector unsigned long long)__builtin_pack_vector(crc, 0UL); -+ -+ /* Shift into top 32 bits */ -+ vcrc = (__vector unsigned long long)vec_sld((__vector unsigned char)vcrc, -+ (__vector unsigned char)vzero, 4); -+#endif -+ -+ /* Short version. */ -+ if (len < 256) { -+ /* Calculate where in the constant table we need to start. */ -+ offset = 256 - len; -+ -+ vconst1 = vec_ld(offset, vcrc_short_const); -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); -+ -+ /* xor initial value*/ -+ vdata0 = vec_xor(vdata0, vcrc); -+ -+ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw -+ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); -+ v0 = vec_xor(v0, vdata0); -+ -+ for (i = 16; i < len; i += 16) { -+ vconst1 = vec_ld(offset + i, vcrc_short_const); -+ vdata0 = vec_ld(i, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vconst1, vperm_const); -+ vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw -+ ((__vector unsigned int)vdata0, (__vector unsigned int)vconst1); -+ v0 = vec_xor(v0, vdata0); -+ } -+ } else { -+ -+ /* Load initial values. */ -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ /* xor in initial value */ -+ vdata0 = vec_xor(vdata0, vcrc); -+ -+ p = (char *)p + 128; -+ -+ do { -+ /* Checksum in blocks of MAX_SIZE. */ -+ block_size = length; -+ if (block_size > MAX_SIZE) { -+ block_size = MAX_SIZE; -+ } -+ -+ length = length - block_size; -+ -+ /* -+ * Work out the offset into the constants table to start at. Each -+ * constant is 16 bytes, and it is used against 128 bytes of input -+ * data - 128 / 16 = 8 -+ */ -+ offset = (MAX_SIZE/8) - (block_size/8); -+ /* We reduce our final 128 bytes in a separate step */ -+ chunks = (block_size/128)-1; -+ -+ vconst1 = vec_ld(offset, vcrc_const); -+ -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata0, -+ (__vector unsigned long long)vconst1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata1, -+ (__vector unsigned long long)vconst1); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata2, -+ (__vector unsigned long long)vconst1); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata3, -+ (__vector unsigned long long)vconst1); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata4, -+ (__vector unsigned long long)vconst1); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata5, -+ (__vector unsigned long long)vconst1); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata6, -+ (__vector unsigned long long)vconst1); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long long)vdata7, -+ (__vector unsigned long long)vconst1); -+ -+ if (chunks > 1) { -+ offset += 16; -+ vconst2 = vec_ld(offset, vcrc_const); -+ GROUP_ENDING_NOP; -+ -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ p = (char *)p + 128; -+ -+ /* -+ * main loop. We modulo schedule it such that it takes three -+ * iterations to complete - first iteration load, second -+ * iteration vpmsum, third iteration xor. -+ */ -+ for (i = 0; i < chunks-2; i++) { -+ vconst1 = vec_ld(offset, vcrc_const); -+ offset += 16; -+ GROUP_ENDING_NOP; -+ -+ v0 = vec_xor(v0, va0); -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata0, (__vector unsigned long long)vconst2); -+ vdata0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v1 = vec_xor(v1, va1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata1, (__vector unsigned long long)vconst2); -+ vdata1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(vdata1, vdata1, vdata1, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v2 = vec_xor(v2, va2); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata2, (__vector unsigned long long)vconst2); -+ vdata2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(vdata2, vdata2, vdata2, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v3 = vec_xor(v3, va3); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata3, (__vector unsigned long long)vconst2); -+ vdata3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(vdata3, vdata3, vdata3, vperm_const); -+ -+ vconst2 = vec_ld(offset, vcrc_const); -+ GROUP_ENDING_NOP; -+ -+ v4 = vec_xor(v4, va4); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata4, (__vector unsigned long long)vconst1); -+ vdata4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(vdata4, vdata4, vdata4, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v5 = vec_xor(v5, va5); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata5, (__vector unsigned long long)vconst1); -+ vdata5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(vdata5, vdata5, vdata5, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v6 = vec_xor(v6, va6); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata6, (__vector unsigned long long)vconst1); -+ vdata6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(vdata6, vdata6, vdata6, vperm_const); -+ GROUP_ENDING_NOP; -+ -+ v7 = vec_xor(v7, va7); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata7, (__vector unsigned long long)vconst1); -+ vdata7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(vdata7, vdata7, vdata7, vperm_const); -+ -+ p = (char *)p + 128; -+ } -+ -+ /* First cool down*/ -+ vconst1 = vec_ld(offset, vcrc_const); -+ offset += 16; -+ -+ v0 = vec_xor(v0, va0); -+ va0 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata0, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v1 = vec_xor(v1, va1); -+ va1 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata1, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v2 = vec_xor(v2, va2); -+ va2 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata2, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v3 = vec_xor(v3, va3); -+ va3 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata3, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v4 = vec_xor(v4, va4); -+ va4 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata4, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v5 = vec_xor(v5, va5); -+ va5 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata5, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v6 = vec_xor(v6, va6); -+ va6 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata6, (__vector unsigned long long)vconst1); -+ GROUP_ENDING_NOP; -+ -+ v7 = vec_xor(v7, va7); -+ va7 = __builtin_crypto_vpmsumd ((__vector unsigned long -+ long)vdata7, (__vector unsigned long long)vconst1); -+ }/* else */ -+ -+ /* Second cool down. */ -+ v0 = vec_xor(v0, va0); -+ v1 = vec_xor(v1, va1); -+ v2 = vec_xor(v2, va2); -+ v3 = vec_xor(v3, va3); -+ v4 = vec_xor(v4, va4); -+ v5 = vec_xor(v5, va5); -+ v6 = vec_xor(v6, va6); -+ v7 = vec_xor(v7, va7); -+ -+#ifdef REFLECT -+ /* -+ * vpmsumd produces a 96 bit result in the least significant bits -+ * of the register. Since we are bit reflected we have to shift it -+ * left 32 bits so it occupies the least significant bits in the -+ * bit reflected domain. -+ */ -+ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)vzero, 4); -+ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v1, -+ (__vector unsigned char)vzero, 4); -+ v2 = (__vector unsigned long long)vec_sld((__vector unsigned char)v2, -+ (__vector unsigned char)vzero, 4); -+ v3 = (__vector unsigned long long)vec_sld((__vector unsigned char)v3, -+ (__vector unsigned char)vzero, 4); -+ v4 = (__vector unsigned long long)vec_sld((__vector unsigned char)v4, -+ (__vector unsigned char)vzero, 4); -+ v5 = (__vector unsigned long long)vec_sld((__vector unsigned char)v5, -+ (__vector unsigned char)vzero, 4); -+ v6 = (__vector unsigned long long)vec_sld((__vector unsigned char)v6, -+ (__vector unsigned char)vzero, 4); -+ v7 = (__vector unsigned long long)vec_sld((__vector unsigned char)v7, -+ (__vector unsigned char)vzero, 4); -+#endif -+ -+ /* xor with the last 1024 bits. */ -+ va0 = vec_ld(0, (__vector unsigned long long*) p); -+ VEC_PERM(va0, va0, va0, vperm_const); -+ -+ va1 = vec_ld(16, (__vector unsigned long long*) p); -+ VEC_PERM(va1, va1, va1, vperm_const); -+ -+ va2 = vec_ld(32, (__vector unsigned long long*) p); -+ VEC_PERM(va2, va2, va2, vperm_const); -+ -+ va3 = vec_ld(48, (__vector unsigned long long*) p); -+ VEC_PERM(va3, va3, va3, vperm_const); -+ -+ va4 = vec_ld(64, (__vector unsigned long long*) p); -+ VEC_PERM(va4, va4, va4, vperm_const); -+ -+ va5 = vec_ld(80, (__vector unsigned long long*) p); -+ VEC_PERM(va5, va5, va5, vperm_const); -+ -+ va6 = vec_ld(96, (__vector unsigned long long*) p); -+ VEC_PERM(va6, va6, va6, vperm_const); -+ -+ va7 = vec_ld(112, (__vector unsigned long long*) p); -+ VEC_PERM(va7, va7, va7, vperm_const); -+ -+ p = (char *)p + 128; -+ -+ vdata0 = vec_xor(v0, va0); -+ vdata1 = vec_xor(v1, va1); -+ vdata2 = vec_xor(v2, va2); -+ vdata3 = vec_xor(v3, va3); -+ vdata4 = vec_xor(v4, va4); -+ vdata5 = vec_xor(v5, va5); -+ vdata6 = vec_xor(v6, va6); -+ vdata7 = vec_xor(v7, va7); -+ -+ /* Check if we have more blocks to process */ -+ next_block = 0; -+ if (length != 0) { -+ next_block = 1; -+ -+ /* zero v0-v7 */ -+ v0 = vec_xor(v0, v0); -+ v1 = vec_xor(v1, v1); -+ v2 = vec_xor(v2, v2); -+ v3 = vec_xor(v3, v3); -+ v4 = vec_xor(v4, v4); -+ v5 = vec_xor(v5, v5); -+ v6 = vec_xor(v6, v6); -+ v7 = vec_xor(v7, v7); -+ } -+ length = length + 128; -+ -+ } while (next_block); -+ -+ /* Calculate how many bytes we have left. */ -+ length = (len & 127); -+ -+ /* Calculate where in (short) constant table we need to start. */ -+ offset = 128 - length; -+ -+ v0 = vec_ld(offset, vcrc_short_const); -+ v1 = vec_ld(offset + 16, vcrc_short_const); -+ v2 = vec_ld(offset + 32, vcrc_short_const); -+ v3 = vec_ld(offset + 48, vcrc_short_const); -+ v4 = vec_ld(offset + 64, vcrc_short_const); -+ v5 = vec_ld(offset + 80, vcrc_short_const); -+ v6 = vec_ld(offset + 96, vcrc_short_const); -+ v7 = vec_ld(offset + 112, vcrc_short_const); -+ -+ offset += 128; -+ -+ v0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata0,(__vector unsigned int)v0); -+ v1 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata1,(__vector unsigned int)v1); -+ v2 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata2,(__vector unsigned int)v2); -+ v3 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata3,(__vector unsigned int)v3); -+ v4 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata4,(__vector unsigned int)v4); -+ v5 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata5,(__vector unsigned int)v5); -+ v6 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata6,(__vector unsigned int)v6); -+ v7 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata7,(__vector unsigned int)v7); -+ -+ /* Now reduce the tail (0-112 bytes). */ -+ for (i = 0; i < length; i+=16) { -+ vdata0 = vec_ld(i,(__vector unsigned long long*)p); -+ VEC_PERM(vdata0, vdata0, vdata0, vperm_const); -+ va0 = vec_ld(offset + i,vcrc_short_const); -+ va0 = (__vector unsigned long long)__builtin_crypto_vpmsumw ( -+ (__vector unsigned int)vdata0,(__vector unsigned int)va0); -+ v0 = vec_xor(v0, va0); -+ } -+ -+ /* xor all parallel chunks together. */ -+ v0 = vec_xor(v0, v1); -+ v2 = vec_xor(v2, v3); -+ v4 = vec_xor(v4, v5); -+ v6 = vec_xor(v6, v7); -+ -+ v0 = vec_xor(v0, v2); -+ v4 = vec_xor(v4, v6); -+ -+ v0 = vec_xor(v0, v4); -+ } -+ -+ /* Barrett Reduction */ -+ vconst1 = vec_ld(0, v_Barrett_const); -+ vconst2 = vec_ld(16, v_Barrett_const); -+ -+ v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)v0, 8); -+ v0 = vec_xor(v1,v0); -+ -+#ifdef REFLECT -+ /* shift left one bit */ -+ __vector unsigned char vsht_splat = vec_splat_u8 (1); -+ v0 = (__vector unsigned long long)vec_sll ((__vector unsigned char)v0, -+ vsht_splat); -+#endif -+ -+ v0 = vec_and(v0, vmask_64bit); -+ -+#ifndef REFLECT -+ -+ /* -+ * Now for the actual algorithm. The idea is to calculate q, -+ * the multiple of our polynomial that we need to subtract. By -+ * doing the computation 2x bits higher (ie 64 bits) and shifting the -+ * result back down 2x bits, we round down to the nearest multiple. -+ */ -+ -+ /* ma */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v0, -+ (__vector unsigned long long)vconst1); -+ /* q = floor(ma/(2^64)) */ -+ v1 = (__vector unsigned long long)vec_sld ((__vector unsigned char)vzero, -+ (__vector unsigned char)v1, 8); -+ /* qn */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst2); -+ /* a - qn, subtraction is xor in GF(2) */ -+ v0 = vec_xor (v0, v1); -+ /* -+ * Get the result into r3. We need to shift it left 8 bytes: -+ * V0 [ 0 1 2 X ] -+ * V0 [ 0 X 2 3 ] -+ */ -+ result = __builtin_unpack_vector_1 (v0); -+#else -+ -+ /* -+ * The reflected version of Barrett reduction. Instead of bit -+ * reflecting our data (which is expensive to do), we bit reflect our -+ * constants and our algorithm, which means the intermediate data in -+ * our vector registers goes from 0-63 instead of 63-0. We can reflect -+ * the algorithm because we don't carry in mod 2 arithmetic. -+ */ -+ -+ /* bottom 32 bits of a */ -+ v1 = vec_and(v0, vmask_32bit); -+ -+ /* ma */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst1); -+ -+ /* bottom 32bits of ma */ -+ v1 = vec_and(v1, vmask_32bit); -+ /* qn */ -+ v1 = __builtin_crypto_vpmsumd ((__vector unsigned long long)v1, -+ (__vector unsigned long long)vconst2); -+ /* a - qn, subtraction is xor in GF(2) */ -+ v0 = vec_xor (v0, v1); -+ -+ /* -+ * Since we are bit reflected, the result (ie the low 32 bits) is in -+ * the high 32 bits. We just need to shift it left 4 bytes -+ * V0 [ 0 1 X 3 ] -+ * V0 [ 0 X 2 3 ] -+ */ -+ -+ /* shift result into top 64 bits of */ -+ v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0, -+ (__vector unsigned char)vzero, 4); -+ -+ result = __builtin_unpack_vector_0 (v0); -+#endif -+ -+ return result; -+} -diff --git a/contrib/power/crc32_z_resolver.c b/contrib/power/crc32_z_resolver.c -new file mode 100644 -index 0000000..f4e9aa4 ---- /dev/null -+++ b/contrib/power/crc32_z_resolver.c -@@ -0,0 +1,15 @@ -+/* Copyright (C) 2019 Matheus Castanho , IBM -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "../gcc/zifunc.h" -+#include "power.h" -+ -+Z_IFUNC(crc32_z) { -+#ifdef Z_POWER8 -+ if (__builtin_cpu_supports("arch_2_07")) -+ return _crc32_z_power8; -+#endif -+ -+ return crc32_z_default; -+} -diff --git a/contrib/power/power.h b/contrib/power/power.h -index b42c7d6..79123aa 100644 ---- a/contrib/power/power.h -+++ b/contrib/power/power.h -@@ -2,3 +2,7 @@ - * 2019 Rogerio Alves , IBM - * For conditions of distribution and use, see copyright notice in zlib.h - */ -+ -+#include "../../zconf.h" -+ -+unsigned long _crc32_z_power8(unsigned long, const Bytef *, z_size_t); -diff --git a/crc32.c b/crc32.c -index f8357b0..4e5830b 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -745,6 +745,13 @@ local z_word_t crc_word_big(data) - #endif - - /* ========================================================================= */ -+#ifdef Z_POWER_OPT -+/* Rename function so resolver can use its symbol. The default version will be -+ * returned by the resolver if the host has no support for an optimized version. -+ */ -+#define crc32_z crc32_z_default -+#endif /* Z_POWER_OPT */ -+ - unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; -@@ -1066,6 +1073,11 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - return crc ^ 0xffffffff; - } - -+#ifdef Z_POWER_OPT -+#undef crc32_z -+#include "contrib/power/crc32_z_resolver.c" -+#endif /* Z_POWER_OPT */ -+ - #endif - - /* ========================================================================= */ -diff --git a/test/crc32_test.c b/test/crc32_test.c -new file mode 100644 -index 0000000..3155553 ---- /dev/null -+++ b/test/crc32_test.c -@@ -0,0 +1,205 @@ -+/* crc32_tes.c -- unit test for crc32 in the zlib compression library -+ * Copyright (C) 1995-2006, 2010, 2011, 2016, 2019 Rogerio Alves -+ * For conditions of distribution and use, see copyright notice in zlib.h -+ */ -+ -+#include "zlib.h" -+#include -+ -+#ifdef STDC -+# include -+# include -+#endif -+ -+void test_crc32 OF((uLong crc, Byte* buf, z_size_t len, uLong chk, int line)); -+int main OF((void)); -+ -+typedef struct { -+ int line; -+ uLong crc; -+ char* buf; -+ int len; -+ uLong expect; -+} crc32_test; -+ -+void test_crc32(crc, buf, len, chk, line) -+ uLong crc; -+ Byte *buf; -+ z_size_t len; -+ uLong chk; -+ int line; -+{ -+ uLong res = crc32(crc, buf, len); -+ if (res != chk) { -+ fprintf(stderr, "FAIL [%d]: crc32 returned 0x%08X expected 0x%08X\n", -+ line, (unsigned int)res, (unsigned int)chk); -+ exit(1); -+ } -+} -+ -+static const crc32_test tests[] = { -+ {__LINE__, 0x0, 0x0, 0, 0x0}, -+ {__LINE__, 0xffffffff, 0x0, 0, 0x0}, -+ {__LINE__, 0x0, 0x0, 255, 0x0}, /* BZ 174799. */ -+ {__LINE__, 0x0, 0x0, 256, 0x0}, -+ {__LINE__, 0x0, 0x0, 257, 0x0}, -+ {__LINE__, 0x0, 0x0, 32767, 0x0}, -+ {__LINE__, 0x0, 0x0, 32768, 0x0}, -+ {__LINE__, 0x0, 0x0, 32769, 0x0}, -+ {__LINE__, 0x0, "", 0, 0x0}, -+ {__LINE__, 0xffffffff, "", 0, 0xffffffff}, -+ {__LINE__, 0x0, "abacus", 6, 0xc3d7115b}, -+ {__LINE__, 0x0, "backlog", 7, 0x269205}, -+ {__LINE__, 0x0, "campfire", 8, 0x22a515f8}, -+ {__LINE__, 0x0, "delta", 5, 0x9643fed9}, -+ {__LINE__, 0x0, "executable", 10, 0xd68eda01}, -+ {__LINE__, 0x0, "file", 4, 0x8c9f3610}, -+ {__LINE__, 0x0, "greatest", 8, 0xc1abd6cd}, -+ {__LINE__, 0x0, "hello", 5, 0x3610a686}, -+ {__LINE__, 0x0, "inverter", 8, 0xc9e962c9}, -+ {__LINE__, 0x0, "jigsaw", 6, 0xce4e3f69}, -+ {__LINE__, 0x0, "karate", 6, 0x890be0e2}, -+ {__LINE__, 0x0, "landscape", 9, 0xc4e0330b}, -+ {__LINE__, 0x0, "machine", 7, 0x1505df84}, -+ {__LINE__, 0x0, "nanometer", 9, 0xd4e19f39}, -+ {__LINE__, 0x0, "oblivion", 8, 0xdae9de77}, -+ {__LINE__, 0x0, "panama", 6, 0x66b8979c}, -+ {__LINE__, 0x0, "quest", 5, 0x4317f817}, -+ {__LINE__, 0x0, "resource", 8, 0xbc91f416}, -+ {__LINE__, 0x0, "secret", 6, 0x5ca2e8e5}, -+ {__LINE__, 0x0, "test", 4, 0xd87f7e0c}, -+ {__LINE__, 0x0, "ultimate", 8, 0x3fc79b0b}, -+ {__LINE__, 0x0, "vector", 6, 0x1b6e485b}, -+ {__LINE__, 0x0, "walrus", 6, 0xbe769b97}, -+ {__LINE__, 0x0, "xeno", 4, 0xe7a06444}, -+ {__LINE__, 0x0, "yelling", 7, 0xfe3944e5}, -+ {__LINE__, 0x0, "zlib", 4, 0x73887d3a}, -+ {__LINE__, 0x0, "4BJD7PocN1VqX0jXVpWB", 20, 0xd487a5a1}, -+ {__LINE__, 0x0, "F1rPWI7XvDs6nAIRx41l", 20, 0x61a0132e}, -+ {__LINE__, 0x0, "ldhKlsVkPFOveXgkGtC2", 20, 0xdf02f76}, -+ {__LINE__, 0x0, "5KKnGOOrs8BvJ35iKTOS", 20, 0x579b2b0a}, -+ {__LINE__, 0x0, "0l1tw7GOcem06Ddu7yn4", 20, 0xf7d16e2d}, -+ {__LINE__, 0x0, "MCr47CjPIn9R1IvE1Tm5", 20, 0x731788f5}, -+ {__LINE__, 0x0, "UcixbzPKTIv0SvILHVdO", 20, 0x7112bb11}, -+ {__LINE__, 0x0, "dGnAyAhRQDsWw0ESou24", 20, 0xf32a0dac}, -+ {__LINE__, 0x0, "di0nvmY9UYMYDh0r45XT", 20, 0x625437bb}, -+ {__LINE__, 0x0, "2XKDwHfAhFsV0RhbqtvH", 20, 0x896930f9}, -+ {__LINE__, 0x0, "ZhrANFIiIvRnqClIVyeD", 20, 0x8579a37}, -+ {__LINE__, 0x0, "v7Q9ehzioTOVeDIZioT1", 20, 0x632aa8e0}, -+ {__LINE__, 0x0, "Yod5hEeKcYqyhfXbhxj2", 20, 0xc829af29}, -+ {__LINE__, 0x0, "GehSWY2ay4uUKhehXYb0", 20, 0x1b08b7e8}, -+ {__LINE__, 0x0, "kwytJmq6UqpflV8Y8GoE", 20, 0x4e33b192}, -+ {__LINE__, 0x0, "70684206568419061514", 20, 0x59a179f0}, -+ {__LINE__, 0x0, "42015093765128581010", 20, 0xcd1013d7}, -+ {__LINE__, 0x0, "88214814356148806939", 20, 0xab927546}, -+ {__LINE__, 0x0, "43472694284527343838", 20, 0x11f3b20c}, -+ {__LINE__, 0x0, "49769333513942933689", 20, 0xd562d4ca}, -+ {__LINE__, 0x0, "54979784887993251199", 20, 0x233395f7}, -+ {__LINE__, 0x0, "58360544869206793220", 20, 0x2d167fd5}, -+ {__LINE__, 0x0, "27347953487840714234", 20, 0x8b5108ba}, -+ {__LINE__, 0x0, "07650690295365319082", 20, 0xc46b3cd8}, -+ {__LINE__, 0x0, "42655507906821911703", 20, 0xc10b2662}, -+ {__LINE__, 0x0, "29977409200786225655", 20, 0xc9a0f9d2}, -+ {__LINE__, 0x0, "85181542907229116674", 20, 0x9341357b}, -+ {__LINE__, 0x0, "87963594337989416799", 20, 0xf0424937}, -+ {__LINE__, 0x0, "21395988329504168551", 20, 0xd7c4c31f}, -+ {__LINE__, 0x0, "51991013580943379423", 20, 0xf11edcc4}, -+ {__LINE__, 0x0, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x40795df4}, -+ {__LINE__, 0x0, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xdd61a631}, -+ {__LINE__, 0x0, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xca907a99}, -+ {__LINE__, 0x0, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0xf652deac}, -+ {__LINE__, 0x0, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0xaf39a5a9}, -+ {__LINE__, 0x0, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x6bebb4cf}, -+ {__LINE__, 0x0, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x76430bac}, -+ {__LINE__, 0x0, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x6c80c388}, -+ {__LINE__, 0x0, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xd54d977d}, -+ {__LINE__, 0x0, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0xe3966ad5}, -+ {__LINE__, 0x0, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xe7c71db9}, -+ {__LINE__, 0x0, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xeaa52777}, -+ {__LINE__, 0x0, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xcd472048}, -+ {__LINE__, 0x7a30360d, "abacus", 6, 0xf8655a84}, -+ {__LINE__, 0x6fd767ee, "backlog", 7, 0x1ed834b1}, -+ {__LINE__, 0xefeb7589, "campfire", 8, 0x686cfca}, -+ {__LINE__, 0x61cf7e6b, "delta", 5, 0x1554e4b1}, -+ {__LINE__, 0xdc712e2, "executable", 10, 0x761b4254}, -+ {__LINE__, 0xad23c7fd, "file", 4, 0x7abdd09b}, -+ {__LINE__, 0x85cb2317, "greatest", 8, 0x4ba91c6b}, -+ {__LINE__, 0x9eed31b0, "inverter", 8, 0xd5e78ba5}, -+ {__LINE__, 0xb94f34ca, "jigsaw", 6, 0x23649109}, -+ {__LINE__, 0xab058a2, "karate", 6, 0xc5591f41}, -+ {__LINE__, 0x5bff2b7a, "landscape", 9, 0xf10eb644}, -+ {__LINE__, 0x605c9a5f, "machine", 7, 0xbaa0a636}, -+ {__LINE__, 0x51bdeea5, "nanometer", 9, 0x6af89afb}, -+ {__LINE__, 0x85c21c79, "oblivion", 8, 0xecae222b}, -+ {__LINE__, 0x97216f56, "panama", 6, 0x47dffac4}, -+ {__LINE__, 0x18444af2, "quest", 5, 0x70c2fe36}, -+ {__LINE__, 0xbe6ce359, "resource", 8, 0x1471d925}, -+ {__LINE__, 0x843071f1, "secret", 6, 0x50c9a0db}, -+ {__LINE__, 0xf2480c60, "ultimate", 8, 0xf973daf8}, -+ {__LINE__, 0x2d2feb3d, "vector", 6, 0x344ac03d}, -+ {__LINE__, 0x7490310a, "walrus", 6, 0x6d1408ef}, -+ {__LINE__, 0x97d247d4, "xeno", 4, 0xe62670b5}, -+ {__LINE__, 0x93cf7599, "yelling", 7, 0x1b36da38}, -+ {__LINE__, 0x73c84278, "zlib", 4, 0x6432d127}, -+ {__LINE__, 0x228a87d1, "4BJD7PocN1VqX0jXVpWB", 20, 0x997107d0}, -+ {__LINE__, 0xa7a048d0, "F1rPWI7XvDs6nAIRx41l", 20, 0xdc567274}, -+ {__LINE__, 0x1f0ded40, "ldhKlsVkPFOveXgkGtC2", 20, 0xdcc63870}, -+ {__LINE__, 0xa804a62f, "5KKnGOOrs8BvJ35iKTOS", 20, 0x6926cffd}, -+ {__LINE__, 0x508fae6a, "0l1tw7GOcem06Ddu7yn4", 20, 0xb52b38bc}, -+ {__LINE__, 0xe5adaf4f, "MCr47CjPIn9R1IvE1Tm5", 20, 0xf83b8178}, -+ {__LINE__, 0x67136a40, "UcixbzPKTIv0SvILHVdO", 20, 0xc5213070}, -+ {__LINE__, 0xb00c4a10, "dGnAyAhRQDsWw0ESou24", 20, 0xbc7648b0}, -+ {__LINE__, 0x2e0c84b5, "di0nvmY9UYMYDh0r45XT", 20, 0xd8123a72}, -+ {__LINE__, 0x81238d44, "2XKDwHfAhFsV0RhbqtvH", 20, 0xd5ac5620}, -+ {__LINE__, 0xf853aa92, "ZhrANFIiIvRnqClIVyeD", 20, 0xceae099d}, -+ {__LINE__, 0x5a692325, "v7Q9ehzioTOVeDIZioT1", 20, 0xb07d2b24}, -+ {__LINE__, 0x3275b9f, "Yod5hEeKcYqyhfXbhxj2", 20, 0x24ce91df}, -+ {__LINE__, 0x38371feb, "GehSWY2ay4uUKhehXYb0", 20, 0x707b3b30}, -+ {__LINE__, 0xafc8bf62, "kwytJmq6UqpflV8Y8GoE", 20, 0x16abc6a9}, -+ {__LINE__, 0x9b07db73, "70684206568419061514", 20, 0xae1fb7b7}, -+ {__LINE__, 0xe75b214, "42015093765128581010", 20, 0xd4eecd2d}, -+ {__LINE__, 0x72d0fe6f, "88214814356148806939", 20, 0x4660ec7}, -+ {__LINE__, 0xf857a4b1, "43472694284527343838", 20, 0xfd8afdf7}, -+ {__LINE__, 0x54b8e14, "49769333513942933689", 20, 0xc6d1b5f2}, -+ {__LINE__, 0xd6aa5616, "54979784887993251199", 20, 0x32476461}, -+ {__LINE__, 0x11e63098, "58360544869206793220", 20, 0xd917cf1a}, -+ {__LINE__, 0xbe92385, "27347953487840714234", 20, 0x4ad14a12}, -+ {__LINE__, 0x49511de0, "07650690295365319082", 20, 0xe37b5c6c}, -+ {__LINE__, 0x3db13bc1, "42655507906821911703", 20, 0x7cc497f1}, -+ {__LINE__, 0xbb899bea, "29977409200786225655", 20, 0x99781bb2}, -+ {__LINE__, 0xf6cd9436, "85181542907229116674", 20, 0x132256a1}, -+ {__LINE__, 0x9109e6c3, "87963594337989416799", 20, 0xbfdb2c83}, -+ {__LINE__, 0x75770fc, "21395988329504168551", 20, 0x8d9d1e81}, -+ {__LINE__, 0x69b1d19b, "51991013580943379423", 20, 0x7b6d4404}, -+ {__LINE__, 0xc6132975, "*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x8619f010}, -+ {__LINE__, 0xd58cb00c, "_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x15746ac3}, -+ {__LINE__, 0xb63b8caa, "&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0xaccf812f}, -+ {__LINE__, 0x8a45a2b8, "]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x78af45de}, -+ {__LINE__, 0xcbe95b78, "-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x25b06b59}, -+ {__LINE__, 0x4ef8a54b, "+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x4ba0d08f}, -+ {__LINE__, 0x76ad267a, ")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0xe26b6aac}, -+ {__LINE__, 0x569e613c, ":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x7e2b0a66}, -+ {__LINE__, 0x36aa61da, "{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xb3430dc7}, -+ {__LINE__, 0xf67222df, "_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x626c17a}, -+ {__LINE__, 0x74b34fd3, "e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0xccf98060}, -+ {__LINE__, 0x351fd770, "r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xd8b95312}, -+ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xbb1c9912}, -+ {__LINE__, 0xc45aef77, "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&" -+ "h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 600, 0x888AFA5B} -+}; -+ -+static const int test_size = sizeof(tests) / sizeof(tests[0]); -+ -+int main(void) -+{ -+ int i; -+ for (i = 0; i < test_size; i++) { -+ test_crc32(tests[i].crc, (Byte*) tests[i].buf, tests[i].len, -+ tests[i].expect, tests[i].line); -+ } -+ return 0; -+} --- -2.37.3 - -From e8c61767464de8d063366117f508359e5ca40a50 Mon Sep 17 00:00:00 2001 -From: Tulio Magno Quites Machado Filho -Date: Wed, 25 Mar 2020 12:16:41 -0300 -Subject: [PATCH 3/3] Fix clang's behavior on versions >= 7 - -Clang 7 changed the behavior of vec_xxpermdi in order to match GCC's -behavior. After this change, code that used to work on Clang 6 stopped -to work on Clang >= 7. - -Tested on Clang 6, 7, 8 and 9. - -Reference: https://bugs.llvm.org/show_bug.cgi?id=38192 - -Signed-off-by: Tulio Magno Quites Machado Filho ---- - contrib/power/clang_workaround.h | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - -diff --git a/contrib/power/clang_workaround.h b/contrib/power/clang_workaround.h -index b5e7dae..915f7e5 100644 ---- a/contrib/power/clang_workaround.h -+++ b/contrib/power/clang_workaround.h -@@ -39,7 +39,12 @@ __vector unsigned long long __builtin_pack_vector (unsigned long __a, - return __v; - } - --#ifndef vec_xxpermdi -+/* -+ * Clang 7 changed the behavior of vec_xxpermdi in order to provide the same -+ * behavior of GCC. That means code adapted to Clang >= 7 does not work on -+ * Clang <= 6. So, fallback to __builtin_unpack_vector() on Clang <= 6. -+ */ -+#if !defined vec_xxpermdi || __clang_major__ <= 6 - - static inline - unsigned long __builtin_unpack_vector (__vector unsigned long long __v, -@@ -62,9 +67,9 @@ static inline - unsigned long __builtin_unpack_vector_0 (__vector unsigned long long __v) - { - #if defined(__BIG_ENDIAN__) -- return vec_xxpermdi(__v, __v, 0x0)[1]; -- #else - return vec_xxpermdi(__v, __v, 0x0)[0]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x3)[0]; - #endif - } - -@@ -72,9 +77,9 @@ static inline - unsigned long __builtin_unpack_vector_1 (__vector unsigned long long __v) - { - #if defined(__BIG_ENDIAN__) -- return vec_xxpermdi(__v, __v, 0x3)[1]; -- #else - return vec_xxpermdi(__v, __v, 0x3)[0]; -+ #else -+ return vec_xxpermdi(__v, __v, 0x0)[0]; - #endif - } - #endif /* vec_xxpermdi */ --- -2.37.3 - diff --git a/zlib-1.2.13-s390x-vectorize-crc32.patch b/zlib-1.2.13-s390x-vectorize-crc32.patch deleted file mode 100644 index a102523..0000000 --- a/zlib-1.2.13-s390x-vectorize-crc32.patch +++ /dev/null @@ -1,428 +0,0 @@ -From 6ae549062cb4b766c5cc726406f8612310cc12b5 Mon Sep 17 00:00:00 2001 -From: Ilya Leoshkevich -Date: Thu, 19 Mar 2020 11:52:03 +0100 -Subject: [PATCH] s390x: vectorize crc32 - -Use vector extensions when compiling for s390x and binutils knows -about them. At runtime, check whether kernel supports vector -extensions (it has to be not just the CPU, but also the kernel) and -choose between the regular and the vectorized implementations. ---- - Makefile.in | 9 ++ - configure | 28 +++++ - contrib/gcc/zifunc.h | 21 +++- - contrib/s390/crc32-vx.c | 195 ++++++++++++++++++++++++++++++++ - contrib/s390/crc32_z_resolver.c | 41 +++++++ - crc32.c | 11 +- - 6 files changed, 301 insertions(+), 4 deletions(-) - create mode 100644 contrib/s390/crc32-vx.c - create mode 100644 contrib/s390/crc32_z_resolver.c - -diff --git a/Makefile.in b/Makefile.in -index a811c10..af62c22 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -25,6 +25,7 @@ LDFLAGS= - TEST_LDFLAGS=$(LDFLAGS) -L. libz.a - LDSHARED=$(CC) - CPP=$(CC) -E -+VGFMAFLAG= - - STATICLIB=libz.a - SHAREDLIB=libz.so -@@ -175,6 +176,9 @@ crc32.o: $(SRCDIR)crc32.c - crc32_z_power8.o: $(SRCDIR)contrib/power/crc32_z_power8.c - $(CC) $(CFLAGS) -mcpu=power8 $(ZINC) -c -o $@ $(SRCDIR)contrib/power/crc32_z_power8.c - -+crc32-vx.o: $(SRCDIR)contrib/s390/crc32-vx.c -+ $(CC) $(CFLAGS) $(VGFMAFLAG) $(ZINC) -c -o $@ $(SRCDIR)contrib/s390/crc32-vx.c -+ - deflate.o: $(SRCDIR)deflate.c - $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c - -@@ -225,6 +229,11 @@ crc32.lo: $(SRCDIR)crc32.c - $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c - -@mv objs/crc32.o $@ - -+crc32-vx.lo: $(SRCDIR)contrib/s390/crc32-vx.c -+ -@mkdir objs 2>/dev/null || test -d objs -+ $(CC) $(SFLAGS) $(VGFMAFLAG) $(ZINC) -DPIC -c -o objs/crc32-vx.o $(SRCDIR)contrib/s390/crc32-vx.c -+ -@mv objs/crc32-vx.o $@ -+ - crc32_z_power8.lo: $(SRCDIR)contrib/power/crc32_z_power8.c - -@mkdir objs 2>/dev/null || test -d objs - $(CC) $(SFLAGS) -mcpu=power8 $(ZINC) -DPIC -c -o objs/crc32_z_power8.o $(SRCDIR)contrib/power/crc32_z_power8.c -diff --git a/configure b/configure -index ab3204a..04ee943 100755 ---- a/configure -+++ b/configure -@@ -921,6 +921,32 @@ else - echo "Checking for Power optimizations support... No." | tee -a configure.log - fi - -+# check if we are compiling for s390 and binutils support vector extensions -+VGFMAFLAG=-march=z13 -+cat > $test.c <> configure.log - echo ALL = $ALL >> configure.log -@@ -952,6 +978,7 @@ echo mandir = $mandir >> configure.log - echo prefix = $prefix >> configure.log - echo sharedlibdir = $sharedlibdir >> configure.log - echo uname = $uname >> configure.log -+echo VGFMAFLAG = $VGFMAFLAG >> configure.log - - # udpate Makefile with the configure results - sed < ${SRCDIR}Makefile.in " -@@ -961,6 +988,7 @@ sed < ${SRCDIR}Makefile.in " - /^LDFLAGS *=/s#=.*#=$LDFLAGS# - /^LDSHARED *=/s#=.*#=$LDSHARED# - /^CPP *=/s#=.*#=$CPP# -+/^VGFMAFLAG *=/s#=.*#=$VGFMAFLAG# - /^STATICLIB *=/s#=.*#=$STATICLIB# - /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# - /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# -diff --git a/contrib/gcc/zifunc.h b/contrib/gcc/zifunc.h -index daf4fe4..b62379e 100644 ---- a/contrib/gcc/zifunc.h -+++ b/contrib/gcc/zifunc.h -@@ -8,9 +8,28 @@ - - /* Helpers for arch optimizations */ - -+#if defined(__clang__) -+#if __has_feature(coverage_sanitizer) -+#define Z_IFUNC_NO_SANCOV __attribute__((no_sanitize("coverage"))) -+#else /* __has_feature(coverage_sanitizer) */ -+#define Z_IFUNC_NO_SANCOV -+#endif /* __has_feature(coverage_sanitizer) */ -+#else /* __clang__ */ -+#define Z_IFUNC_NO_SANCOV -+#endif /* __clang__ */ -+ -+#ifdef __s390__ -+#define Z_IFUNC_PARAMS unsigned long hwcap -+#define Z_IFUNC_ATTRS Z_IFUNC_NO_SANCOV -+#else /* __s390__ */ -+#define Z_IFUNC_PARAMS void -+#define Z_IFUNC_ATTRS -+#endif /* __s390__ */ -+ - #define Z_IFUNC(fname) \ - typeof(fname) fname __attribute__ ((ifunc (#fname "_resolver"))); \ -- local typeof(fname) *fname##_resolver(void) -+ Z_IFUNC_ATTRS \ -+ local typeof(fname) *fname##_resolver(Z_IFUNC_PARAMS) - /* This is a helper macro to declare a resolver for an indirect function - * (ifunc). Let's say you have function - * -diff --git a/contrib/s390/crc32-vx.c b/contrib/s390/crc32-vx.c -new file mode 100644 -index 0000000..fa5387c ---- /dev/null -+++ b/contrib/s390/crc32-vx.c -@@ -0,0 +1,195 @@ -+/* -+ * Hardware-accelerated CRC-32 variants for Linux on z Systems -+ * -+ * Use the z/Architecture Vector Extension Facility to accelerate the -+ * computing of bitreflected CRC-32 checksums. -+ * -+ * This CRC-32 implementation algorithm is bitreflected and processes -+ * the least-significant bit first (Little-Endian). -+ * -+ * This code was originally written by Hendrik Brueckner -+ * for use in the Linux kernel and has been -+ * relicensed under the zlib license. -+ */ -+ -+#include "../../zutil.h" -+ -+#include -+#include -+ -+typedef unsigned char uv16qi __attribute__((vector_size(16))); -+typedef unsigned int uv4si __attribute__((vector_size(16))); -+typedef unsigned long long uv2di __attribute__((vector_size(16))); -+ -+uint32_t crc32_le_vgfm_16(uint32_t crc, const unsigned char *buf, size_t len) { -+ /* -+ * The CRC-32 constant block contains reduction constants to fold and -+ * process particular chunks of the input data stream in parallel. -+ * -+ * For the CRC-32 variants, the constants are precomputed according to -+ * these definitions: -+ * -+ * R1 = [(x4*128+32 mod P'(x) << 32)]' << 1 -+ * R2 = [(x4*128-32 mod P'(x) << 32)]' << 1 -+ * R3 = [(x128+32 mod P'(x) << 32)]' << 1 -+ * R4 = [(x128-32 mod P'(x) << 32)]' << 1 -+ * R5 = [(x64 mod P'(x) << 32)]' << 1 -+ * R6 = [(x32 mod P'(x) << 32)]' << 1 -+ * -+ * The bitreflected Barret reduction constant, u', is defined as -+ * the bit reversal of floor(x**64 / P(x)). -+ * -+ * where P(x) is the polynomial in the normal domain and the P'(x) is the -+ * polynomial in the reversed (bitreflected) domain. -+ * -+ * CRC-32 (IEEE 802.3 Ethernet, ...) polynomials: -+ * -+ * P(x) = 0x04C11DB7 -+ * P'(x) = 0xEDB88320 -+ */ -+ const uv16qi perm_le2be = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; /* BE->LE mask */ -+ const uv2di r2r1 = {0x1C6E41596, 0x154442BD4}; /* R2, R1 */ -+ const uv2di r4r3 = {0x0CCAA009E, 0x1751997D0}; /* R4, R3 */ -+ const uv2di r5 = {0, 0x163CD6124}; /* R5 */ -+ const uv2di ru_poly = {0, 0x1F7011641}; /* u' */ -+ const uv2di crc_poly = {0, 0x1DB710641}; /* P'(x) << 1 */ -+ -+ /* -+ * Load the initial CRC value. -+ * -+ * The CRC value is loaded into the rightmost word of the -+ * vector register and is later XORed with the LSB portion -+ * of the loaded input data. -+ */ -+ uv2di v0 = {0, 0}; -+ v0 = (uv2di)vec_insert(crc, (uv4si)v0, 3); -+ -+ /* Load a 64-byte data chunk and XOR with CRC */ -+ uv2di v1 = vec_perm(((uv2di *)buf)[0], ((uv2di *)buf)[0], perm_le2be); -+ uv2di v2 = vec_perm(((uv2di *)buf)[1], ((uv2di *)buf)[1], perm_le2be); -+ uv2di v3 = vec_perm(((uv2di *)buf)[2], ((uv2di *)buf)[2], perm_le2be); -+ uv2di v4 = vec_perm(((uv2di *)buf)[3], ((uv2di *)buf)[3], perm_le2be); -+ -+ v1 ^= v0; -+ buf += 64; -+ len -= 64; -+ -+ while (len >= 64) { -+ /* Load the next 64-byte data chunk */ -+ uv16qi part1 = vec_perm(((uv16qi *)buf)[0], ((uv16qi *)buf)[0], perm_le2be); -+ uv16qi part2 = vec_perm(((uv16qi *)buf)[1], ((uv16qi *)buf)[1], perm_le2be); -+ uv16qi part3 = vec_perm(((uv16qi *)buf)[2], ((uv16qi *)buf)[2], perm_le2be); -+ uv16qi part4 = vec_perm(((uv16qi *)buf)[3], ((uv16qi *)buf)[3], perm_le2be); -+ -+ /* -+ * Perform a GF(2) multiplication of the doublewords in V1 with -+ * the R1 and R2 reduction constants in V0. The intermediate result -+ * is then folded (accumulated) with the next data chunk in PART1 and -+ * stored in V1. Repeat this step for the register contents -+ * in V2, V3, and V4 respectively. -+ */ -+ v1 = (uv2di)vec_gfmsum_accum_128(r2r1, v1, part1); -+ v2 = (uv2di)vec_gfmsum_accum_128(r2r1, v2, part2); -+ v3 = (uv2di)vec_gfmsum_accum_128(r2r1, v3, part3); -+ v4 = (uv2di)vec_gfmsum_accum_128(r2r1, v4, part4); -+ -+ buf += 64; -+ len -= 64; -+ } -+ -+ /* -+ * Fold V1 to V4 into a single 128-bit value in V1. Multiply V1 with R3 -+ * and R4 and accumulating the next 128-bit chunk until a single 128-bit -+ * value remains. -+ */ -+ v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2); -+ v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v3); -+ v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v4); -+ -+ while (len >= 16) { -+ /* Load next data chunk */ -+ v2 = vec_perm(*(uv2di *)buf, *(uv2di *)buf, perm_le2be); -+ -+ /* Fold next data chunk */ -+ v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2); -+ -+ buf += 16; -+ len -= 16; -+ } -+ -+ /* -+ * Set up a vector register for byte shifts. The shift value must -+ * be loaded in bits 1-4 in byte element 7 of a vector register. -+ * Shift by 8 bytes: 0x40 -+ * Shift by 4 bytes: 0x20 -+ */ -+ uv16qi v9 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -+ v9 = vec_insert((unsigned char)0x40, v9, 7); -+ -+ /* -+ * Prepare V0 for the next GF(2) multiplication: shift V0 by 8 bytes -+ * to move R4 into the rightmost doubleword and set the leftmost -+ * doubleword to 0x1. -+ */ -+ v0 = vec_srb(r4r3, (uv2di)v9); -+ v0[0] = 1; -+ -+ /* -+ * Compute GF(2) product of V1 and V0. The rightmost doubleword -+ * of V1 is multiplied with R4. The leftmost doubleword of V1 is -+ * multiplied by 0x1 and is then XORed with rightmost product. -+ * Implicitly, the intermediate leftmost product becomes padded -+ */ -+ v1 = (uv2di)vec_gfmsum_128(v0, v1); -+ -+ /* -+ * Now do the final 32-bit fold by multiplying the rightmost word -+ * in V1 with R5 and XOR the result with the remaining bits in V1. -+ * -+ * To achieve this by a single VGFMAG, right shift V1 by a word -+ * and store the result in V2 which is then accumulated. Use the -+ * vector unpack instruction to load the rightmost half of the -+ * doubleword into the rightmost doubleword element of V1; the other -+ * half is loaded in the leftmost doubleword. -+ * The vector register with CONST_R5 contains the R5 constant in the -+ * rightmost doubleword and the leftmost doubleword is zero to ignore -+ * the leftmost product of V1. -+ */ -+ v9 = vec_insert((unsigned char)0x20, v9, 7); -+ v2 = vec_srb(v1, (uv2di)v9); -+ v1 = vec_unpackl((uv4si)v1); /* Split rightmost doubleword */ -+ v1 = (uv2di)vec_gfmsum_accum_128(r5, v1, (uv16qi)v2); -+ -+ /* -+ * Apply a Barret reduction to compute the final 32-bit CRC value. -+ * -+ * The input values to the Barret reduction are the degree-63 polynomial -+ * in V1 (R(x)), degree-32 generator polynomial, and the reduction -+ * constant u. The Barret reduction result is the CRC value of R(x) mod -+ * P(x). -+ * -+ * The Barret reduction algorithm is defined as: -+ * -+ * 1. T1(x) = floor( R(x) / x^32 ) GF2MUL u -+ * 2. T2(x) = floor( T1(x) / x^32 ) GF2MUL P(x) -+ * 3. C(x) = R(x) XOR T2(x) mod x^32 -+ * -+ * Note: The leftmost doubleword of vector register containing -+ * CONST_RU_POLY is zero and, thus, the intermediate GF(2) product -+ * is zero and does not contribute to the final result. -+ */ -+ -+ /* T1(x) = floor( R(x) / x^32 ) GF2MUL u */ -+ v2 = vec_unpackl((uv4si)v1); -+ v2 = (uv2di)vec_gfmsum_128(ru_poly, v2); -+ -+ /* -+ * Compute the GF(2) product of the CRC polynomial with T1(x) in -+ * V2 and XOR the intermediate result, T2(x), with the value in V1. -+ * The final result is stored in word element 2 of V2. -+ */ -+ v2 = vec_unpackl((uv4si)v2); -+ v2 = (uv2di)vec_gfmsum_accum_128(crc_poly, v2, (uv16qi)v1); -+ -+ return ((uv4si)v2)[2]; -+} -diff --git a/contrib/s390/crc32_z_resolver.c b/contrib/s390/crc32_z_resolver.c -new file mode 100644 -index 0000000..9749cab ---- /dev/null -+++ b/contrib/s390/crc32_z_resolver.c -@@ -0,0 +1,41 @@ -+#include -+#include "../gcc/zifunc.h" -+ -+#define VX_MIN_LEN 64 -+#define VX_ALIGNMENT 16L -+#define VX_ALIGN_MASK (VX_ALIGNMENT - 1) -+ -+unsigned int crc32_le_vgfm_16(unsigned int crc, const unsigned char FAR *buf, z_size_t len); -+ -+local unsigned long s390_crc32_vx(unsigned long crc, const unsigned char FAR *buf, z_size_t len) -+{ -+ uintptr_t prealign, aligned, remaining; -+ -+ if (buf == Z_NULL) return 0UL; -+ -+ if (len < VX_MIN_LEN + VX_ALIGN_MASK) -+ return crc32_z_default(crc, buf, len); -+ -+ if ((uintptr_t)buf & VX_ALIGN_MASK) { -+ prealign = VX_ALIGNMENT - ((uintptr_t)buf & VX_ALIGN_MASK); -+ len -= prealign; -+ crc = crc32_z_default(crc, buf, prealign); -+ buf += prealign; -+ } -+ aligned = len & ~VX_ALIGN_MASK; -+ remaining = len & VX_ALIGN_MASK; -+ -+ crc = crc32_le_vgfm_16(crc ^ 0xffffffff, buf, (size_t)aligned) ^ 0xffffffff; -+ -+ if (remaining) -+ crc = crc32_z_default(crc, buf + aligned, remaining); -+ -+ return crc; -+} -+ -+Z_IFUNC(crc32_z) -+{ -+ if (hwcap & HWCAP_S390_VX) -+ return s390_crc32_vx; -+ return crc32_z_default; -+} -diff --git a/crc32.c b/crc32.c -index 4e5830b..0b458ce 100644 ---- a/crc32.c -+++ b/crc32.c -@@ -745,12 +745,12 @@ local z_word_t crc_word_big(data) - #endif - - /* ========================================================================= */ --#ifdef Z_POWER_OPT -+#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) - /* Rename function so resolver can use its symbol. The default version will be - * returned by the resolver if the host has no support for an optimized version. - */ - #define crc32_z crc32_z_default --#endif /* Z_POWER_OPT */ -+#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ - - unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; -@@ -1073,10 +1073,15 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) - return crc ^ 0xffffffff; - } - --#ifdef Z_POWER_OPT -+#if defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) - #undef crc32_z -+#ifdef Z_POWER_OPT - #include "contrib/power/crc32_z_resolver.c" - #endif /* Z_POWER_OPT */ -+#ifdef HAVE_S390X_VX -+#include "contrib/s390/crc32_z_resolver.c" -+#endif /* HAVE_S390X_VX */ -+#endif /* defined(Z_POWER_OPT) || defined(HAVE_S390X_VX) */ - - #endif - --- -2.37.3 - diff --git a/zlib-1.2.5-minizip-fixuncrypt.patch b/zlib-1.2.5-minizip-fixuncrypt.patch deleted file mode 100644 index d113879..0000000 --- a/zlib-1.2.5-minizip-fixuncrypt.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up zlib-1.2.5/contrib/minizip/unzip.c.fixuncrypt zlib-1.2.5/contrib/minizip/unzip.c ---- zlib-1.2.5/contrib/minizip/unzip.c.fixuncrypt 2011-11-11 12:13:56.335867758 -0500 -+++ zlib-1.2.5/contrib/minizip/unzip.c 2011-11-11 12:14:01.747799372 -0500 -@@ -68,10 +68,6 @@ - #include - #include - --#ifndef NOUNCRYPT -- #define NOUNCRYPT --#endif -- - #include "zlib.h" - #include "unzip.h" - diff --git a/zlib.spec b/zlib.spec deleted file mode 100644 index b39ba8f..0000000 --- a/zlib.spec +++ /dev/null @@ -1,656 +0,0 @@ -%bcond_without minizip - -Name: zlib -Version: 1.2.13 -Release: 5%{?dist} -Summary: Compression and decompression library -# /contrib/dotzlib/ have Boost license -License: Zlib AND BSL-1.0 -URL: https://www.zlib.net/ - -Source: https://www.zlib.net/zlib-%{version}.tar.xz -# https://github.com/madler/zlib/pull/210 -Patch0: zlib-1.2.5-minizip-fixuncrypt.patch -# resolves: #805113 -Patch1: zlib-1.2.13-optimized-s390.patch -# Upstream commit: https://github.com/madler/zlib/commit/e554695638228b846d49657f31eeff0ca4680e8a -# This patch is needed for a clean apply of the Patch19 -Patch2: zlib-1.2.13-Fix-bug-in-deflateBound.patch -# IBM optimized crc32 for Power 8+ processors -# ref: https://github.com/madler/zlib/pull/750 -Patch18: zlib-1.2.13-power-optimizations.patch -# IBM Z hardware-accelerated deflate -# ref: https://github.com/madler/zlib/pull/410 -Patch19: zlib-1.2.13-IBM-Z-hw-accelerated-deflate.patch -# Patch for s390x crc32vx -# ref: https://github.com/iii-i/zlib/releases/tag/crc32vx-v3 -Patch20: zlib-1.2.13-s390x-vectorize-crc32.patch -# fixed covscan issues -Patch22: zlib-1.2.11-covscan-issues.patch -# fixed issues found by covscan for rhel-9 -# ref: https://github.com/madler/zlib/pull/554 -Patch23: zlib-1.2.11-covscan-issues-rhel9.patch -# Upstream patch: https://github.com/madler/zlib/commit/73331a6a0481067628f065ffe87bb1d8f787d10c -Patch24: zlib-1.2.13-Reject-overflows-of-zip-header-fields-in-minizip.patch - -BuildRequires: make -BuildRequires: automake, autoconf, libtool - -%global __provides_exclude_from ^%{_libdir}/pkgconfig/minizip\\.pc$ - -%description -Zlib is a general-purpose, patent-free, lossless data compression -library which is used by many different programs. - - -%package devel -Summary: Header files and libraries for Zlib development -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description devel -The zlib-devel package contains the header files and libraries needed -to develop programs that use the zlib compression and decompression -library. - - -%package static -Summary: Static libraries for Zlib development -Requires: %{name}-devel%{?_isa} = %{version}-%{release} - -%description static -The zlib-static package includes static libraries needed -to develop programs that use the zlib compression and -decompression library. - - -%if %{with minizip} -%package -n minizip-compat -Summary: Library for manipulation with .zip archives -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description -n minizip-compat -Minizip is a library for manipulation with files from .zip archives. - - -%package -n minizip-compat-devel -Summary: Development files for the minizip library -Requires: minizip-compat%{?_isa} = %{version}-%{release} -Requires: %{name}-devel%{?_isa} = %{version}-%{release} -Conflicts: minizip-devel - -%description -n minizip-compat-devel -This package contains the libraries and header files needed for -developing applications which use minizip. -%endif - - -%prep -%setup -q -%patch -P0 -p1 -b .fixuncrypt -%patch -P2 -p1 -%patch -P18 -p1 -%patch -P19 -p1 -%patch -P20 -p1 -%patch -P22 -p1 -%patch -P23 -p1 -%patch -P24 -p1 -# Patch19 conflicts with Patch1, so the Patch1 has to be applied after, -# because it is arch specific -%ifarch s390 s390x -%patch -P1 -p1 -b .optimized-deflate -%endif - - -iconv -f iso-8859-2 -t utf-8 < ChangeLog > ChangeLog.tmp -mv ChangeLog.tmp ChangeLog - - -%build -export CFLAGS="$RPM_OPT_FLAGS" - -export LDFLAGS="$LDFLAGS -Wl,-z,relro -Wl,-z,now" -# no-autotools, %%configure is not compatible -%ifarch s390 s390x - ./configure --libdir=%{_libdir} --includedir=%{_includedir} --prefix=%{_prefix} --dfltcc -%else - ./configure --libdir=%{_libdir} --includedir=%{_includedir} --prefix=%{_prefix} -%endif -%make_build - -%if %{with minizip} -cd contrib/minizip -autoreconf --install -%configure --enable-static=no -%make_build -%endif - - -%check -make test - - -%install -%make_install - -%if %{with minizip} -%make_install -C contrib/minizip -# https://github.com/madler/zlib/pull/229 -rm $RPM_BUILD_ROOT%_includedir/minizip/crypt.h -%endif - -find $RPM_BUILD_ROOT -name '*.la' -delete - - -%files -%license README -%doc ChangeLog FAQ -%{_libdir}/libz.so.* - - -%files devel -%doc doc/algorithm.txt test/example.c -%{_libdir}/libz.so -%{_libdir}/pkgconfig/zlib.pc -%{_includedir}/zlib.h -%{_includedir}/zconf.h -%{_mandir}/man3/zlib.3* - - -%files static -%license README -%{_libdir}/libz.a - - -%if %{with minizip} -%files -n minizip-compat -%doc contrib/minizip/MiniZip64_info.txt contrib/minizip/MiniZip64_Changes.txt -%{_libdir}/libminizip.so.* - - -%files -n minizip-compat-devel -%dir %{_includedir}/minizip -%{_includedir}/minizip/*.h -%{_libdir}/libminizip.so -%{_libdir}/pkgconfig/minizip.pc -%endif - - -%changelog -* Tue Oct 17 2023 Lukas Javorsky - 1.2.13-5 -- Applied upstream commit 73331a6a0481067628f065ffe87bb1d8f787d10c -- Resolves: CVE-2023-45853 - -* Sat Jul 22 2023 Fedora Release Engineering - 1.2.13-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Sat Jan 21 2023 Fedora Release Engineering - 1.2.13-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Tue Jan 10 2023 Lukas Javorsky - 1.2.13-2 -- Fix for the libxml2 and lxml on s390x -- Resolves #2155328 - -* Mon Oct 17 2022 Lukas Javorsky - 1.2.13-1 -- Rebase to version 1.2.13 -- Patches 21,24,25 has been upstreamed - -* Tue Aug 09 2022 Lukas Javorsky - 1.2.12-5 -- Fix heap-based buffer over-read or buffer overflow in inflate in inflate.c -- Resolves: CVE-2022-37434 - -* Sat Jul 23 2022 Fedora Release Engineering - 1.2.12-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Jul 04 2022 Lukas Javorsky - 1.2.12-3 -- Upstream patch: Correct incorrect inputs provided to the CRC functions - -* Tue Jun 28 2022 Lukas Javorsky - 1.2.12-2 -- Fix covscan patch that caused compiler warnings - -* Tue Apr 05 2022 Lukas Javorsky - 1.2.12-1 -- Rebase to 1.2.12 -- Resolves: CVE-2018-25032 - -* Mon Feb 28 2022 Lukas Javorsky - 1.2.11-32 -- Apply IBM patch for compressBound() function -- Source from https://github.com/madler/zlib/issues/410#issuecomment-947212824 -- Resolves: #2057484 - -* Sat Jan 22 2022 Fedora Release Engineering - 1.2.11-31 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Thu Jul 29 2021 Dan Horák - 1.2.11-30 -- Fix for IBM CRC32 optimalization rhbz#1959423 - -* Fri Jul 23 2021 Fedora Release Engineering - 1.2.11-28 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Thu Jul 01 2021 Ondrej Dubaj - 1.2.11-27 -- Enabled Z hardware-accelerated deflate for compression levels 1 through 6 (#1972057) -- IBM CRC32 optimalization rhbz#1959423 - -* Wed Mar 31 2021 Ondrej Dubaj - 1.2.11-26 -- fixed covscan issues for rhel-9 - -* Fri Feb 12 2021 Michal Schorm - 1.2.11-25 -- Remove ancient PPC64 hack -- Remove aarch64 optimalizations (#1936823) - -* Thu Jan 28 2021 Fedora Release Engineering - 1.2.11-24 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Nov 18 2020 Ondrej Dubaj - 1.2.11-23 -- backport IBM Z updates to fedora - -* Wed Jul 29 2020 Fedora Release Engineering - 1.2.11-22 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Fri Jan 31 2020 Fedora Release Engineering - 1.2.11-21 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Tue Oct 29 2019 Ondrej Dubaj - 1.2.11-20 -- Added -DDFLTCC parameter to configure to enable -- Z hardware-accelerated deflate for s390x architectures (#1659433) - -* Thu Sep 05 2019 Ondrej Dubaj - 1.2.11-19 -- IBM CRC32 optimalization for POWER 8+ architectures re-add -- fixed firefox crash duer to zlib (#1741266) -- added test for crc32 - -* Thu Aug 15 2019 Ondrej Dubaj - 1.2.11-18 -- IBM CRC32 optimalization for POWER 8+ architectures revert - -* Thu Aug 01 2019 Ondrej Dubaj - 1.2.11-17 -- IBM Z hardware-accelerated deflate for s390x architectures -- IBM CRC32 optimalization for POWER 8+ architectures - -* Sat Jul 27 2019 Fedora Release Engineering - 1.2.11-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sun Feb 03 2019 Fedora Release Engineering - 1.2.11-15 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Tue Oct 2 2018 Peter Robinson 1.2.11-14 -- Bump build - -* Tue Sep 18 2018 Peter Robinson 1.2.11-13 -- Revert aarch64 neon inflate optimisation - -* Wed Aug 29 2018 Patrik Novotný - 1.2.11-12 -- Rename minizip and minizip-devel to minizip-compat and minizip-compat-devel respectively - -* Thu Aug 23 2018 Patrik Novotný - 1.2.11-11 -- Provides minizip-compat and minizip-compat-devel - -* Fri Aug 03 2018 Pavel Raiskup - 1.2.11-10 -- add %%bcond for minizip -- use %%make_* macros - -* Sat Jul 14 2018 Fedora Release Engineering - 1.2.11-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Mon Apr 30 2018 Peter Robinson 1.2.11-8 -- Optimisations for aarch64 -- Minor spec cleanups - -* Thu Mar 15 2018 Pavel Raiskup - 1.2.11-7 -- don't install crypt.h (rhbz#1424609) - -* Fri Feb 09 2018 Fedora Release Engineering - 1.2.11-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Fri Feb 02 2018 Igor Gnatenko - 1.2.11-5 -- Switch to %%ldconfig_scriptlets - -* Thu Aug 03 2017 Fedora Release Engineering - 1.2.11-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 1.2.11-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Thu Feb 09 2017 Pavel Raiskup - 1.2.11-2 -- fix s390(x) optimizing patch (FTBFS on s390(x)) -- simplify ppc64 hack with -O3 - -* Mon Jan 30 2017 Pavel Raiskup - 1.2.11-1 -- latest upstream release (rhbz#1409372) -- cleanup rpmlint -- revert fix for rhbz#985344 -- requires with %%_isa tag -- drop zlib Z_BLOCK flush patch (rhbz#1417355) - -* Fri Feb 05 2016 Fedora Release Engineering - 1.2.8-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Aug 14 2015 Adam Jackson 1.2.8-9 -- Link with -z now for full RELRO - -* Fri Jun 19 2015 Fedora Release Engineering - 1.2.8-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Mon Aug 18 2014 Fedora Release Engineering - 1.2.8-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Wed Aug 6 2014 Tom Callaway - 1.2.8-6 -- fix license handling - -* Sat Jun 07 2014 Fedora Release Engineering - 1.2.8-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Wed Feb 12 2014 jchaloup - 1.2.8-4 -- resolves: #1064213 - recompiled with -O3 flag for ppc64 arch - -* Sat Aug 10 2013 Kalev Lember - 1.2.8-3 -- resolves: #985344 - add a patch to fix missing minizip include - -* Sun Aug 04 2013 Fedora Release Engineering - 1.2.8-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Fri Jun 7 2013 Peter Schiffer - 1.2.8-1 -- resolves: #957680 - updated to 1.2.8 - -* Fri Feb 15 2013 Fedora Release Engineering - 1.2.7-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Thu Oct 4 2012 Peter Schiffer - 1.2.7-9 -- updated patch optimizing deflate on s390(x) architectures - -* Wed Aug 29 2012 Peter Schiffer - 1.2.7-8 -- related: #832545 - reverted changes for this bug, static libraries shouldn't be compiled with - -fPIC flag - -* Mon Aug 27 2012 Peter Schiffer - 1.2.7-7 -- resolves: #844791 - rank Z_BLOCK flush below Z_PARTIAL_FLUSH only when last flush was Z_BLOCK -- done some minor .spec file cleanup - -* Mon Aug 13 2012 Peter Schiffer - 1.2.7-6 -- added patch from IBM which optimizes deflate on s390(x) architectures - -* Thu Aug 02 2012 Peter Schiffer - 1.2.7-5 -- resolves: #832545 - recompiled with -fPIC flag - -* Sun Jul 22 2012 Fedora Release Engineering - 1.2.7-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Mon Jun 11 2012 Peter Schiffer - 1.2.7-3 -- moved /lib* to /usr/lib* - -* Mon Jun 11 2012 Peter Schiffer - 1.2.7-2 -- recompiled with -Wl,-z,relro flags - -* Thu May 10 2012 Peter Schiffer - 1.2.7-1 -- resolves: #785726 -- resolves: #805874 - update to 1.2.7 - -* Tue Jan 10 2012 Peter Schiffer - 1.2.5-6 -- resolves: #719139 - Zlib fails to read zip64 files on 64-bit system - -* Fri Nov 11 2011 Tom Callaway - 1.2.5-5 -- fix minizip to permit uncrypt when NOUNCRYPT is not defined - -* Wed Apr 6 2011 Ivana Hutarova Varekova - 1.2.5-4 -- Resolves: #678603 - zlib from minizip allowed NULL pointer parameter of function unzGetCurrentFileInfo - -* Tue Feb 08 2011 Fedora Release Engineering - 1.2.5-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Wed Jun 16 2010 Ivana Hutarova Varekova - 1.2.5-2 -- Resolves: #591317 - pdfedit fails to compile on i686 with zlib.h errors - -* Thu Apr 22 2010 Ivana Hutarova Varekova - 1.2.5-1 -- update to 1.2.5 - -* Mon Mar 29 2010 Ivana Hutarova Varekova - 1.2.4-1 -- update to 1.2.4 - use the upstream make/configure files for zlib, - change additional makefile/configure file to be used only to minizip - add pkgconfig to zlib - -* Mon Mar 8 2010 Ivana Hutarova Varekova - 1.2.3-25 -- add Boost license - -* Tue Aug 11 2009 Ville Skyttä - 1.2.3-24 -- Use bzipped upstream tarball. - -* Mon Jul 27 2009 Fedora Release Engineering - 1.2.3-23 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Mar 18 2009 Stepan Kasal - 1.2.3-22 -- fix the libz.so symlink - -* Tue Mar 17 2009 Stepan Kasal - 1.2.3-21 -- consolidate the autoconfiscation patches into one and clean it up -- consequently, clean up the %%build and %%install sections -- zconf.h includes unistd.h again (#479133) - -* Wed Feb 25 2009 Fedora Release Engineering - 1.2.3-20 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - -* Mon Dec 1 2008 Ivana Varekova - 1.2.3-19 -- fix 473490 - unchecked malloc - -* Wed Feb 13 2008 Ivana Varekova - 1.2.3-18 -- change license tag (226671#c29) - -* Mon Feb 11 2008 Ivana Varekova - 1.2.3-17 -- spec file changes - -* Fri Nov 23 2007 Ivana Varekova - 1.2.3-16 -- remove minizip headers to minizip-devel -- spec file cleanup -- fix minizip.pc file - -* Wed Nov 14 2007 Ivana Varekova - 1.2.3-15 -- separate static subpackage - -* Wed Aug 15 2007 Ivana Varekova - 1.2.3-14 -- create minizip subpackage - -* Mon May 21 2007 Ivana Varekova - 1.2.3-13 -- remove .so,.a - -* Mon May 21 2007 Ivana Varekova - 1.2.3-12 -- Resolves #240277 - Move libz to /lib(64) - -* Mon Apr 23 2007 Ivana Varekova - 1.2.3-11 -- Resolves: 237295 - fix Summary tag - -* Fri Mar 23 2007 Ivana Varekova - 1.2.3-10 -- remove zlib .so.* packages to /lib - -* Fri Mar 9 2007 Ivana Varekova - 1.2.3-9 -- incorporate package review feedback - -* Wed Feb 21 2007 Adam Tkac - 1.2.3-8 -- fixed broken version of libz - -* Tue Feb 20 2007 Adam Tkac - 1.2.3-7 -- building is now automatized -- specfile cleanup - -* Tue Feb 20 2007 Ivana Varekova - 1.2.3-6 -- remove the compilation part to build section - some minor changes - -* Mon Feb 19 2007 Ivana Varekova - 1.2.3-5 -- incorporate package review feedback - -* Mon Oct 23 2006 Ivana Varekova - 1.2.3-4 -- fix #209424 - fix libz.a permissions - -* Wed Jul 19 2006 Ivana Varekova - 1.2.3-3 -- add cflags (#199379) - -* Wed Jul 12 2006 Jesse Keating - 1.2.3-2 -- rebuild - -* Fri Feb 10 2006 Jesse Keating - 1.2.3-1.2.1 -- bump again for double-long bug on ppc(64) - -* Tue Feb 07 2006 Jesse Keating - 1.2.3-1.2 -- rebuilt for new gcc4.1 snapshot and glibc changes - -* Fri Dec 09 2005 Jesse Keating -- rebuilt - -* Wed Aug 24 2005 Florian La Roche -- update to 1.2.3 - -* Fri Jul 22 2005 Ivana Varekova 1.2.2.2-5 -- fix bug 163038 - CAN-2005-1849 - zlib buffer overflow - -* Thu Jul 7 2005 Ivana Varekova 1.2.2.2-4 -- fix bug 162392 - CAN-2005-2096 - -* Wed Mar 30 2005 Ivana Varekova 1.2.2.2-3 -- fix bug 122408 - zlib build process runs configure twice - -* Fri Mar 4 2005 Jeff Johnson 1.2.2.2-2 -- rebuild with gcc4. - -* Sat Jan 1 2005 Jeff Johnson 1.2.2.2-1 -- upgrade to 1.2.2.2. - -* Fri Nov 12 2004 Jeff Johnson 1.2.2.1-1 -- upgrade to 1.2.2.1. - -* Sun Sep 12 2004 Jeff Johnson 1.2.1.2-1 -- update to 1.2.1.2 to fix 2 DoS problems (#131385). - -* Tue Jun 15 2004 Elliot Lee -- rebuilt - -* Tue Mar 02 2004 Elliot Lee -- rebuilt - -* Fri Feb 13 2004 Elliot Lee -- rebuilt - -* Sun Jan 18 2004 Jeff Johnson 1.2.1.1-1 -- upgrade to zlib-1.2.1.1. - -* Sun Nov 30 2003 Florian La Roche -- update to 1.2.1 release - -* Mon Oct 13 2003 Jeff Johnson 1.2.0.7-3 -- unrevert zlib.h include constants (#106291), rejected upstream. - -* Wed Oct 8 2003 Jeff Johnson 1.2.0.7-2 -- fix: gzeof not set when reading compressed file (#106424). -- fix: revert zlib.h include constants for now (#106291). - -* Tue Sep 23 2003 Jeff Johnson 1.2.0.7-1 -- update to 1.2.0.7, penultimate 1.2.1 release candidate. - -* Tue Jul 22 2003 Jeff Johnson 1.2.0.3-0.1 -- update to release candidate. - -* Wed Jun 04 2003 Elliot Lee -- rebuilt - -* Mon May 19 2003 Jeff Johnson 1.1.4-9 -- rebuild, revert from 1.2.0.1. - -* Mon Feb 24 2003 Jeff Johnson 1.1.4-8 -- fix gzprintf buffer overrun (#84961). - -* Wed Jan 22 2003 Tim Powers 1.1.4-7 -- rebuilt - -* Thu Nov 21 2002 Elliot Lee 1.1.4-6 -- Make ./configure use $CC to ease cross-compilation - -* Tue Nov 12 2002 Jeff Johnson 1.1.4-5 -- rebuild from cvs. - -* Fri Jun 21 2002 Tim Powers -- automated rebuild - -* Thu May 23 2002 Tim Powers -- automated rebuild - -* Fri Apr 26 2002 Jakub Jelinek 1.1.4-2 -- remove glibc patch, it is no longer needed (zlib uses gcc -shared - as it should) -- run tests and only build the package if they succeed - -* Thu Apr 25 2002 Trond Eivind Glomsrød 1.1.4-1 -- 1.1.4 - -* Wed Jan 30 2002 Trond Eivind Glomsrød 1.1.3-25.7 -- Fix double free - -* Sun Aug 26 2001 Trond Eivind Glomsrød 1.1.3-24 -- Add example.c and minigzip.c to the doc files, as - they are listed as examples in the README (#52574) - -* Mon Jun 18 2001 Trond Eivind Glomsrød -- Updated URL -- Add version dependency for zlib-devel -- s/Copyright/License/ - -* Wed Feb 14 2001 Trond Eivind Glomsrød -- bumped version number - this is the old version without the performance enhancements - -* Fri Sep 15 2000 Florian La Roche -- add -fPIC for shared libs (patch by Fritz Elfert) - -* Thu Sep 7 2000 Jeff Johnson -- on 64bit systems, make sure libraries are located correctly. - -* Thu Aug 17 2000 Jeff Johnson -- summaries from specspo. - -* Thu Jul 13 2000 Prospector -- automatic rebuild - -* Sun Jul 02 2000 Trond Eivind Glomsrød -- rebuild - -* Tue Jun 13 2000 Jeff Johnson -- FHS packaging to build on solaris2.5.1. - -* Wed Jun 07 2000 Trond Eivind Glomsrød -- use %%{_mandir} and %%{_tmppath} - -* Fri May 12 2000 Trond Eivind Glomsrød -- updated URL and source location -- moved README to main package - -* Mon Feb 7 2000 Jeff Johnson -- compress man page. - -* Sun Mar 21 1999 Cristian Gafton -- auto rebuild in the new build environment (release 5) - -* Wed Sep 09 1998 Cristian Gafton -- link against glibc - -* Mon Jul 27 1998 Jeff Johnson -- upgrade to 1.1.3 - -* Fri May 08 1998 Prospector System -- translations modified for de, fr, tr - -* Wed Apr 08 1998 Cristian Gafton -- upgraded to 1.1.2 -- buildroot - -* Tue Oct 07 1997 Donnie Barnes -- added URL tag (down at the moment so it may not be correct) -- made zlib-devel require zlib - -* Thu Jun 19 1997 Erik Troan -- built against glibc