Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/zlib/src/crc32.c

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/zlib/src/crc32.c (Version 11.3.0) and /externals/zlib/src/crc32.c (Version 11.0)


  1 /* crc32.c -- compute the CRC-32 of a data str      1 /* crc32.c -- compute the CRC-32 of a data stream
  2  * Copyright (C) 1995-2022 Mark Adler          <<   2  * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
  3  * For conditions of distribution and use, see      3  * For conditions of distribution and use, see copyright notice in zlib.h
  4  *                                                  4  *
  5  * This interleaved implementation of a CRC ma <<   5  * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
  6  * arithmetic-logic units, commonly found in m <<   6  * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
  7  * Kadatch and Jenkins (2010). See doc/crc-doc <<   7  * tables for updating the shift register in one step with three exclusive-ors
                                                   >>   8  * instead of four steps with four exclusive-ors.  This results in about a
                                                   >>   9  * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
  8  */                                                10  */
  9                                                    11 
 10 /* @(#) $Id$ */                                << 
 11                                                    12 
 12 /*                                                 13 /*
 13   Note on the use of DYNAMIC_CRC_TABLE: there      14   Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
 14   protection on the static variables used to c     15   protection on the static variables used to control the first-use generation
 15   of the crc tables. Therefore, if you #define <<  16   of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should
 16   first call get_crc_table() to initialize the     17   first call get_crc_table() to initialize the tables before allowing more than
 17   one thread to use crc32().                       18   one thread to use crc32().
 18                                                    19 
 19   MAKECRCH can be #defined to write out crc32. <<  20   DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
 20   produced, so that this one source file can b << 
 21  */                                                21  */
 22                                                    22 
 23 #ifdef MAKECRCH                                    23 #ifdef MAKECRCH
 24 #  include <stdio.h>                               24 #  include <stdio.h>
 25 #  ifndef DYNAMIC_CRC_TABLE                        25 #  ifndef DYNAMIC_CRC_TABLE
 26 #    define DYNAMIC_CRC_TABLE                      26 #    define DYNAMIC_CRC_TABLE
 27 #  endif /* !DYNAMIC_CRC_TABLE */                  27 #  endif /* !DYNAMIC_CRC_TABLE */
 28 #endif /* MAKECRCH */                              28 #endif /* MAKECRCH */
 29                                                    29 
 30 #include "zutil.h"      /* for Z_U4, Z_U8, z_c <<  30 #include "zutil.h"      /* for STDC and FAR definitions */
 31                                                    31 
 32  /*                                            <<  32 /* Definitions for doing the crc four data bytes at a time. */
 33   A CRC of a message is computed on N braids o <<  33 #if !defined(NOBYFOUR) && defined(Z_U4)
 34   each word consists of W bytes (4 or 8). If N <<  34 #  define BYFOUR
 35   running sparse CRCs are calculated respectiv <<  35 #endif
 36   indices in the array of words: 0, 3, 6, ..., <<  36 #ifdef BYFOUR
 37   This is done starting at a word boundary, an <<  37    local unsigned long crc32_little OF((unsigned long,
 38   of N * W bytes as are available have been pr <<  38                         const unsigned char FAR *, z_size_t));
 39   into a single CRC at the end. For this code, <<  39    local unsigned long crc32_big OF((unsigned long,
 40   W must be 4 or 8. The upper limit on N can b <<  40                         const unsigned char FAR *, z_size_t));
 41   more #if blocks, extending the patterns appa <<  41 #  define TBLS 8
 42   crc32.h would need to be regenerated, if the << 
 43                                                << 
 44   N and W are chosen empirically by benchmarki << 
 45   processor. The choices for N and W below wer << 
 46   Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc6 << 
 47   Octeon II processors. The Intel, AMD, and AR << 
 48   with N=5, W=8. The Sparc, PowerPC, and MIPS6 << 
 49   They were all tested with either gcc or clan << 
 50   level. Your mileage may vary.                << 
 51  */                                            << 
 52                                                << 
 53 /* Define N */                                 << 
 54 #ifdef Z_TESTN                                 << 
 55 #  define N Z_TESTN                            << 
 56 #else                                          << 
 57 #  define N 5                                  << 
 58 #endif                                         << 
 59 #if N < 1 || N > 6                             << 
 60 #  error N must be in 1..6                     << 
 61 #endif                                         << 
 62                                                << 
 63 /*                                             << 
 64   z_crc_t must be at least 32 bits. z_word_t m << 
 65   z_crc_t. It is assumed here that z_word_t is << 
 66   that bytes are eight bits.                   << 
 67  */                                            << 
 68                                                << 
 69 /*                                             << 
 70   Define W and the associated z_word_t type. I << 
 71   braided calculation is not used, and the ass << 
 72   compiled.                                    << 
 73  */                                            << 
 74 #ifdef Z_TESTW                                 << 
 75 #  if Z_TESTW-1 != -1                          << 
 76 #    define W Z_TESTW                          << 
 77 #  endif                                       << 
 78 #else                                              42 #else
 79 #  ifdef MAKECRCH                              <<  43 #  define TBLS 1
 80 #    define W 8         /* required for MAKECR <<  44 #endif /* BYFOUR */
 81 #  else                                        << 
 82 #    if defined(__x86_64__) || defined(__aarch << 
 83 #      define W 8                              << 
 84 #    else                                      << 
 85 #      define W 4                              << 
 86 #    endif                                     << 
 87 #  endif                                       << 
 88 #endif                                         << 
 89 #ifdef W                                       << 
 90 #  if W == 8 && defined(Z_U8)                  << 
 91      typedef Z_U8 z_word_t;                    << 
 92 #  elif defined(Z_U4)                          << 
 93 #    undef W                                   << 
 94 #    define W 4                                << 
 95      typedef Z_U4 z_word_t;                    << 
 96 #  else                                        << 
 97 #    undef W                                   << 
 98 #  endif                                       << 
 99 #endif                                         << 
100                                                << 
101 /* If available, use the ARM processor CRC32 i << 
102 #if defined(__aarch64__) && defined(__ARM_FEAT << 
103 #  define ARMCRC32                             << 
104 #endif                                         << 
105                                                << 
106 /* Local functions. */                         << 
107 local z_crc_t multmodp OF((z_crc_t a, z_crc_t  << 
108 local z_crc_t x2nmodp OF((z_off64_t n, unsigne << 
109                                                << 
110 #if defined(W) && (!defined(ARMCRC32) || defin << 
111     local z_word_t byte_swap OF((z_word_t word << 
112 #endif                                         << 
113                                                    45 
114 #if defined(W) && !defined(ARMCRC32)           <<  46 /* Local functions for crc concatenation */
115     local z_crc_t crc_word OF((z_word_t data)) <<  47 local unsigned long gf2_matrix_times OF((unsigned long *mat,
116     local z_word_t crc_word_big OF((z_word_t d <<  48                                          unsigned long vec));
117 #endif                                         <<  49 local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
                                                   >>  50 local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
118                                                    51 
119 #if defined(W) && (!defined(ARMCRC32) || defin << 
120 /*                                             << 
121   Swap the bytes in a z_word_t to convert betw << 
122   self-respecting compiler will optimize this  << 
123   instruction, if one is available. This assum << 
124   or 64 bits.                                  << 
125  */                                            << 
126 local z_word_t byte_swap(word)                 << 
127     z_word_t word;                             << 
128 {                                              << 
129 #  if W == 8                                   << 
130     return                                     << 
131         (word & 0xff00000000000000) >> 56 |    << 
132         (word & 0xff000000000000) >> 40 |      << 
133         (word & 0xff0000000000) >> 24 |        << 
134         (word & 0xff00000000) >> 8 |           << 
135         (word & 0xff000000) << 8 |             << 
136         (word & 0xff0000) << 24 |              << 
137         (word & 0xff00) << 40 |                << 
138         (word & 0xff) << 56;                   << 
139 #  else   /* W == 4 */                         << 
140     return                                     << 
141         (word & 0xff000000) >> 24 |            << 
142         (word & 0xff0000) >> 8 |               << 
143         (word & 0xff00) << 8 |                 << 
144         (word & 0xff) << 24;                   << 
145 #  endif                                       << 
146 }                                              << 
147 #endif                                         << 
148                                                << 
149 /* CRC polynomial. */                          << 
150 #define POLY 0xedb88320         /* p(x) reflec << 
151                                                    52 
152 #ifdef DYNAMIC_CRC_TABLE                           53 #ifdef DYNAMIC_CRC_TABLE
153                                                    54 
154 local z_crc_t FAR crc_table[256];              <<  55 local volatile int crc_table_empty = 1;
155 local z_crc_t FAR x2n_table[32];               <<  56 local z_crc_t FAR crc_table[TBLS][256];
156 local void make_crc_table OF((void));              57 local void make_crc_table OF((void));
157 #ifdef W                                       << 
158    local z_word_t FAR crc_big_table[256];      << 
159    local z_crc_t FAR crc_braid_table[W][256];  << 
160    local z_word_t FAR crc_braid_big_table[W][2 << 
161    local void braid OF((z_crc_t [][256], z_wor << 
162 #endif                                         << 
163 #ifdef MAKECRCH                                    58 #ifdef MAKECRCH
164    local void write_table OF((FILE *, const z_ <<  59    local void write_table OF((FILE *, const z_crc_t FAR *));
165    local void write_table32hi OF((FILE *, cons << 
166    local void write_table64 OF((FILE *, const  << 
167 #endif /* MAKECRCH */                              60 #endif /* MAKECRCH */
168                                                << 
169 /*                                             << 
170   Define a once() function depending on the av << 
171   compiled with DYNAMIC_CRC_TABLE defined, and << 
172   multiple threads, and if atomics are not ava << 
173   be called to initialize the tables and must  << 
174   allowed to compute or combine CRCs.          << 
175  */                                            << 
176                                                << 
177 /* Definition of once functionality. */        << 
178 typedef struct once_s once_t;                  << 
179 local void once OF((once_t *, void (*)(void))) << 
180                                                << 
181 /* Check for the availability of atomics. */   << 
182 #if defined(__STDC__) && __STDC_VERSION__ >= 2 << 
183     !defined(__STDC_NO_ATOMICS__)              << 
184                                                << 
185 #include <stdatomic.h>                         << 
186                                                << 
187 /* Structure for once(), which must be initial << 
188 struct once_s {                                << 
189     atomic_flag begun;                         << 
190     atomic_int done;                           << 
191 };                                             << 
192 #define ONCE_INIT {ATOMIC_FLAG_INIT, 0}        << 
193                                                << 
194 /*                                             << 
195   Run the provided init() function exactly onc << 
196   invoke once() at the same time. The state mu << 
197   ONCE_INIT.                                   << 
198  */                                            << 
199 local void once(state, init)                   << 
200     once_t *state;                             << 
201     void (*init)(void);                        << 
202 {                                              << 
203     if (!atomic_load(&state->done)) {          << 
204         if (atomic_flag_test_and_set(&state->b << 
205             while (!atomic_load(&state->done)) << 
206                 ;                              << 
207         else {                                 << 
208             init();                            << 
209             atomic_store(&state->done, 1);     << 
210         }                                      << 
211     }                                          << 
212 }                                              << 
213                                                << 
214 #else   /* no atomics */                       << 
215                                                << 
216 /* Structure for once(), which must be initial << 
217 struct once_s {                                << 
218     volatile int begun;                        << 
219     volatile int done;                         << 
220 };                                             << 
221 #define ONCE_INIT {0, 0}                       << 
222                                                << 
223 /* Test and set. Alas, not atomic, but tries t << 
224    vulnerability. */                           << 
225 local int test_and_set OF((int volatile *));   << 
226 local int test_and_set(flag)                   << 
227     int volatile *flag;                        << 
228 {                                              << 
229     int was;                                   << 
230                                                << 
231     was = *flag;                               << 
232     *flag = 1;                                 << 
233     return was;                                << 
234 }                                              << 
235                                                << 
236 /* Run the provided init() function once. This << 
237 local void once(state, init)                   << 
238     once_t *state;                             << 
239     void (*init)(void);                        << 
240 {                                              << 
241     if (!state->done) {                        << 
242         if (test_and_set(&state->begun))       << 
243             while (!state->done)               << 
244                 ;                              << 
245         else {                                 << 
246             init();                            << 
247             state->done = 1;                   << 
248         }                                      << 
249     }                                          << 
250 }                                              << 
251                                                << 
252 #endif                                         << 
253                                                << 
254 /* State for once(). */                        << 
255 local once_t made = ONCE_INIT;                 << 
256                                                << 
257 /*                                                 61 /*
258   Generate tables for a byte-wise 32-bit CRC c     62   Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
259   x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+     63   x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
260                                                    64 
261   Polynomials over GF(2) are represented in bi     65   Polynomials over GF(2) are represented in binary, one bit per coefficient,
262   with the lowest powers in the most significa <<  66   with the lowest powers in the most significant bit.  Then adding polynomials
263   is just exclusive-or, and multiplying a poly     67   is just exclusive-or, and multiplying a polynomial by x is a right shift by
264   one. If we call the above polynomial p, and  <<  68   one.  If we call the above polynomial p, and represent a byte as the
265   polynomial q, also with the lowest power in      69   polynomial q, also with the lowest power in the most significant bit (so the
266   byte 0xb1 is the polynomial x^7+x^3+x^2+1),  <<  70   byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
267   where a mod b means the remainder after divi     71   where a mod b means the remainder after dividing a by b.
268                                                    72 
269   This calculation is done using the shift-reg     73   This calculation is done using the shift-register method of multiplying and
270   taking the remainder. The register is initia <<  74   taking the remainder.  The register is initialized to zero, and for each
271   incoming bit, x^32 is added mod p to the reg     75   incoming bit, x^32 is added mod p to the register if the bit is a one (where
272   x^32 mod p is p+x^32 = x^26+...+1), and the  <<  76   x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
273   (which is shifting right by one and adding x <<  77   x (which is shifting right by one and adding x^32 mod p if the bit shifted
274   is a one). We start with the highest power ( <<  78   out is a one).  We start with the highest power (least significant bit) of
275   repeat for all eight bits of q.              <<  79   q and repeat for all eight bits of q.
276                                                <<  80 
277   The table is simply the CRC of all possible  <<  81   The first table is simply the CRC of all possible eight bit values.  This is
278   information needed to generate CRCs on data  <<  82   all the information needed to generate CRCs on data a byte at a time for all
279   combinations of CRC register values and inco <<  83   combinations of CRC register values and incoming bytes.  The remaining tables
280  */                                            <<  84   allow for word-at-a-time CRC calculation for both big-endian and little-
281                                                <<  85   endian machines, where a word is four bytes.
                                                   >>  86 */
282 local void make_crc_table()                        87 local void make_crc_table()
283 {                                                  88 {
284     unsigned i, j, n;                          <<  89     z_crc_t c;
285     z_crc_t p;                                 <<  90     int n, k;
                                                   >>  91     z_crc_t poly;                       /* polynomial exclusive-or pattern */
                                                   >>  92     /* terms of polynomial defining this crc (except x^32): */
                                                   >>  93     static volatile int first = 1;      /* flag to limit concurrent making */
                                                   >>  94     static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
                                                   >>  95 
                                                   >>  96     /* See if another task is already doing this (not thread-safe, but better
                                                   >>  97        than nothing -- significantly reduces duration of vulnerability in
                                                   >>  98        case the advice about DYNAMIC_CRC_TABLE is ignored) */
                                                   >>  99     if (first) {
                                                   >> 100         first = 0;
                                                   >> 101 
                                                   >> 102         /* make exclusive-or pattern from polynomial (0xedb88320UL) */
                                                   >> 103         poly = 0;
                                                   >> 104         for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
                                                   >> 105             poly |= (z_crc_t)1 << (31 - p[n]);
                                                   >> 106 
                                                   >> 107         /* generate a crc for every 8-bit value */
                                                   >> 108         for (n = 0; n < 256; n++) {
                                                   >> 109             c = (z_crc_t)n;
                                                   >> 110             for (k = 0; k < 8; k++)
                                                   >> 111                 c = c & 1 ? poly ^ (c >> 1) : c >> 1;
                                                   >> 112             crc_table[0][n] = c;
                                                   >> 113         }
286                                                   114 
287     /* initialize the CRC of bytes tables */   << 115 #ifdef BYFOUR
288     for (i = 0; i < 256; i++) {                << 116         /* generate crc for each value followed by one, two, and three zeros,
289         p = i;                                 << 117            and then the byte reversal of those as well as the first table */
290         for (j = 0; j < 8; j++)                << 118         for (n = 0; n < 256; n++) {
291             p = p & 1 ? (p >> 1) ^ POLY : p >> << 119             c = crc_table[0][n];
292         crc_table[i] = p;                      << 120             crc_table[4][n] = ZSWAP32(c);
293 #ifdef W                                       << 121             for (k = 1; k < 4; k++) {
294         crc_big_table[i] = byte_swap(p);       << 122                 c = crc_table[0][c & 0xff] ^ (c >> 8);
295 #endif                                         << 123                 crc_table[k][n] = c;
296     }                                          << 124                 crc_table[k + 4][n] = ZSWAP32(c);
                                                   >> 125             }
                                                   >> 126         }
                                                   >> 127 #endif /* BYFOUR */
297                                                   128 
298     /* initialize the x^2^n mod p(x) table */  << 129         crc_table_empty = 0;
299     p = (z_crc_t)1 << 30;         /* x^1 */    << 130     }
300     x2n_table[0] = p;                          << 131     else {      /* not first */
301     for (n = 1; n < 32; n++)                   << 132         /* wait for the other guy to finish (not efficient, but rare) */
302         x2n_table[n] = p = multmodp(p, p);     << 133         while (crc_table_empty)
303                                                << 134             ;
304 #ifdef W                                       << 135     }
305     /* initialize the braiding tables -- needs << 
306     braid(crc_braid_table, crc_braid_big_table << 
307 #endif                                         << 
308                                                   136 
309 #ifdef MAKECRCH                                   137 #ifdef MAKECRCH
                                                   >> 138     /* write out CRC tables to crc32.h */
310     {                                             139     {
311         /*                                     << 
312           The crc32.h header file contains tab << 
313           z_word_t's, and so requires a 64-bit << 
314           z_word_t must be defined to be 64-bi << 
315           and writes out the tables for the ca << 
316          */                                    << 
317 #if !defined(W) || W != 8                      << 
318 #  error Need a 64-bit integer type in order t << 
319 #endif                                         << 
320         FILE *out;                                140         FILE *out;
321         int k, n;                              << 
322         z_crc_t ltl[8][256];                   << 
323         z_word_t big[8][256];                  << 
324                                                   141 
325         out = fopen("crc32.h", "w");              142         out = fopen("crc32.h", "w");
326         if (out == NULL) return;                  143         if (out == NULL) return;
327                                                << 144         fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
328         /* write out little-endian CRC table t << 145         fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
329         fprintf(out,                           << 146         fprintf(out, "local const z_crc_t FAR ");
330             "/* crc32.h -- tables for rapid CR << 147         fprintf(out, "crc_table[TBLS][256] =\n{\n  {\n");
331             " * Generated automatically by crc << 148         write_table(out, crc_table[0]);
332             "\n"                               << 149 #  ifdef BYFOUR
333             "local const z_crc_t FAR crc_table << 150         fprintf(out, "#ifdef BYFOUR\n");
334             "    ");                           << 151         for (k = 1; k < 8; k++) {
335         write_table(out, crc_table, 256);      << 152             fprintf(out, "  },\n  {\n");
336         fprintf(out,                           << 153             write_table(out, crc_table[k]);
337             "};\n");                           << 
338                                                << 
339         /* write out big-endian CRC table for  << 
340         fprintf(out,                           << 
341             "\n"                               << 
342             "#ifdef W\n"                       << 
343             "\n"                               << 
344             "#if W == 8\n"                     << 
345             "\n"                               << 
346             "local const z_word_t FAR crc_big_ << 
347             "    ");                           << 
348         write_table64(out, crc_big_table, 256) << 
349         fprintf(out,                           << 
350             "};\n");                           << 
351                                                << 
352         /* write out big-endian CRC table for  << 
353         fprintf(out,                           << 
354             "\n"                               << 
355             "#else /* W == 4 */\n"             << 
356             "\n"                               << 
357             "local const z_word_t FAR crc_big_ << 
358             "    ");                           << 
359         write_table32hi(out, crc_big_table, 25 << 
360         fprintf(out,                           << 
361             "};\n"                             << 
362             "\n"                               << 
363             "#endif\n");                       << 
364                                                << 
365         /* write out braid tables for each val << 
366         for (n = 1; n <= 6; n++) {             << 
367             fprintf(out,                       << 
368             "\n"                               << 
369             "#if N == %d\n", n);               << 
370                                                << 
371             /* compute braid tables for this N << 
372             braid(ltl, big, n, 8);             << 
373                                                << 
374             /* write out braid tables for 64-b << 
375             fprintf(out,                       << 
376             "\n"                               << 
377             "#if W == 8\n"                     << 
378             "\n"                               << 
379             "local const z_crc_t FAR crc_braid << 
380             for (k = 0; k < 8; k++) {          << 
381                 fprintf(out, "   {");          << 
382                 write_table(out, ltl[k], 256); << 
383                 fprintf(out, "}%s", k < 7 ? ", << 
384             }                                  << 
385             fprintf(out,                       << 
386             "};\n"                             << 
387             "\n"                               << 
388             "local const z_word_t FAR crc_brai << 
389             for (k = 0; k < 8; k++) {          << 
390                 fprintf(out, "   {");          << 
391                 write_table64(out, big[k], 256 << 
392                 fprintf(out, "}%s", k < 7 ? ", << 
393             }                                  << 
394             fprintf(out,                       << 
395             "};\n");                           << 
396                                                << 
397             /* compute braid tables for this N << 
398             braid(ltl, big, n, 4);             << 
399                                                << 
400             /* write out braid tables for 32-b << 
401             fprintf(out,                       << 
402             "\n"                               << 
403             "#else /* W == 4 */\n"             << 
404             "\n"                               << 
405             "local const z_crc_t FAR crc_braid << 
406             for (k = 0; k < 4; k++) {          << 
407                 fprintf(out, "   {");          << 
408                 write_table(out, ltl[k], 256); << 
409                 fprintf(out, "}%s", k < 3 ? ", << 
410             }                                  << 
411             fprintf(out,                       << 
412             "};\n"                             << 
413             "\n"                               << 
414             "local const z_word_t FAR crc_brai << 
415             for (k = 0; k < 4; k++) {          << 
416                 fprintf(out, "   {");          << 
417                 write_table32hi(out, big[k], 2 << 
418                 fprintf(out, "}%s", k < 3 ? ", << 
419             }                                  << 
420             fprintf(out,                       << 
421             "};\n"                             << 
422             "\n"                               << 
423             "#endif\n"                         << 
424             "\n"                               << 
425             "#endif\n");                       << 
426         }                                         154         }
427         fprintf(out,                           << 155         fprintf(out, "#endif\n");
428             "\n"                               << 156 #  endif /* BYFOUR */
429             "#endif\n");                       << 157         fprintf(out, "  }\n};\n");
430                                                << 
431         /* write out zeros operator table to c << 
432         fprintf(out,                           << 
433             "\n"                               << 
434             "local const z_crc_t FAR x2n_table << 
435             "    ");                           << 
436         write_table(out, x2n_table, 32);       << 
437         fprintf(out,                           << 
438             "};\n");                           << 
439         fclose(out);                              158         fclose(out);
440     }                                             159     }
441 #endif /* MAKECRCH */                             160 #endif /* MAKECRCH */
442 }                                                 161 }
443                                                   162 
444 #ifdef MAKECRCH                                   163 #ifdef MAKECRCH
445                                                << 164 local void write_table(out, table)
446 /*                                             << 
447    Write the 32-bit values in table[0..k-1] to << 
448    hexadecimal separated by commas.            << 
449  */                                            << 
450 local void write_table(out, table, k)          << 
451     FILE *out;                                    165     FILE *out;
452     const z_crc_t FAR *table;                     166     const z_crc_t FAR *table;
453     int k;                                     << 
454 {                                                 167 {
455     int n;                                        168     int n;
456                                                   169 
457     for (n = 0; n < k; n++)                    << 170     for (n = 0; n < 256; n++)
458         fprintf(out, "%s0x%08lx%s", n == 0 ||  << 171         fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : "    ",
459                 (unsigned long)(table[n]),        172                 (unsigned long)(table[n]),
460                 n == k - 1 ? "" : (n % 5 == 4  << 173                 n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
461 }                                              << 
462                                                << 
463 /*                                             << 
464    Write the high 32-bits of each value in tab << 
465    in hexadecimal separated by commas.         << 
466  */                                            << 
467 local void write_table32hi(out, table, k)      << 
468 FILE *out;                                     << 
469 const z_word_t FAR *table;                     << 
470 int k;                                         << 
471 {                                              << 
472     int n;                                     << 
473                                                << 
474     for (n = 0; n < k; n++)                    << 
475         fprintf(out, "%s0x%08lx%s", n == 0 ||  << 
476                 (unsigned long)(table[n] >> 32 << 
477                 n == k - 1 ? "" : (n % 5 == 4  << 
478 }                                              << 
479                                                << 
480 /*                                             << 
481   Write the 64-bit values in table[0..k-1] to  << 
482   hexadecimal separated by commas. This assume << 
483   type, then there is also a long long integer << 
484   bits. If not, then the type cast and format  << 
485   accordingly.                                 << 
486  */                                            << 
487 local void write_table64(out, table, k)        << 
488     FILE *out;                                 << 
489     const z_word_t FAR *table;                 << 
490     int k;                                     << 
491 {                                              << 
492     int n;                                     << 
493                                                << 
494     for (n = 0; n < k; n++)                    << 
495         fprintf(out, "%s0x%016llx%s", n == 0 | << 
496                 (unsigned long long)(table[n]) << 
497                 n == k - 1 ? "" : (n % 3 == 2  << 
498 }                                              << 
499                                                << 
500 /* Actually do the deed. */                    << 
501 int main()                                     << 
502 {                                              << 
503     make_crc_table();                          << 
504     return 0;                                  << 
505 }                                                 174 }
506                                                << 
507 #endif /* MAKECRCH */                             175 #endif /* MAKECRCH */
508                                                   176 
509 #ifdef W                                       << 
510 /*                                             << 
511   Generate the little and big-endian braid tab << 
512   size w. Each array must have room for w bloc << 
513  */                                            << 
514 local void braid(ltl, big, n, w)               << 
515     z_crc_t ltl[][256];                        << 
516     z_word_t big[][256];                       << 
517     int n;                                     << 
518     int w;                                     << 
519 {                                              << 
520     int k;                                     << 
521     z_crc_t i, p, q;                           << 
522     for (k = 0; k < w; k++) {                  << 
523         p = x2nmodp((n * w + 3 - k) << 3, 0);  << 
524         ltl[k][0] = 0;                         << 
525         big[w - 1 - k][0] = 0;                 << 
526         for (i = 1; i < 256; i++) {            << 
527             ltl[k][i] = q = multmodp(i << 24,  << 
528             big[w - 1 - k][i] = byte_swap(q);  << 
529         }                                      << 
530     }                                          << 
531 }                                              << 
532 #endif                                         << 
533                                                << 
534 #else /* !DYNAMIC_CRC_TABLE */                    177 #else /* !DYNAMIC_CRC_TABLE */
535 /* ===========================================    178 /* ========================================================================
536  * Tables for byte-wise and braided CRC-32 cal << 179  * Tables of CRC-32s of all single-byte values, made by make_crc_table().
537  * of x for combining CRC-32s, all made by mak << 
538  */                                               180  */
539 #include "crc32.h"                                181 #include "crc32.h"
540 #endif /* DYNAMIC_CRC_TABLE */                    182 #endif /* DYNAMIC_CRC_TABLE */
541                                                   183 
542 /* =========================================== << 
543  * Routines used for CRC calculation. Some are << 
544  * generation above.                           << 
545  */                                            << 
546                                                << 
547 /*                                             << 
548   Return a(x) multiplied by b(x) modulo p(x),  << 
549   reflected. For speed, this requires that a n << 
550  */                                            << 
551 local z_crc_t multmodp(a, b)                   << 
552     z_crc_t a;                                 << 
553     z_crc_t b;                                 << 
554 {                                              << 
555     z_crc_t m, p;                              << 
556                                                << 
557     m = (z_crc_t)1 << 31;                      << 
558     p = 0;                                     << 
559     for (;;) {                                 << 
560         if (a & m) {                           << 
561             p ^= b;                            << 
562             if ((a & (m - 1)) == 0)            << 
563                 break;                         << 
564         }                                      << 
565         m >>= 1;                               << 
566         b = b & 1 ? (b >> 1) ^ POLY : b >> 1;  << 
567     }                                          << 
568     return p;                                  << 
569 }                                              << 
570                                                << 
571 /*                                             << 
572   Return x^(n * 2^k) modulo p(x). Requires tha << 
573   initialized.                                 << 
574  */                                            << 
575 local z_crc_t x2nmodp(n, k)                    << 
576     z_off64_t n;                               << 
577     unsigned k;                                << 
578 {                                              << 
579     z_crc_t p;                                 << 
580                                                << 
581     p = (z_crc_t)1 << 31;           /* x^0 ==  << 
582     while (n) {                                << 
583         if (n & 1)                             << 
584             p = multmodp(x2n_table[k & 31], p) << 
585         n >>= 1;                               << 
586         k++;                                   << 
587     }                                          << 
588     return p;                                  << 
589 }                                              << 
590                                                << 
591 /* ===========================================    184 /* =========================================================================
592  * This function can be used by asm versions o << 185  * This function can be used by asm versions of crc32()
593  * generation of the CRC tables in a threaded  << 
594  */                                               186  */
595 const z_crc_t FAR * ZEXPORT get_crc_table()       187 const z_crc_t FAR * ZEXPORT get_crc_table()
596 {                                                 188 {
597 #ifdef DYNAMIC_CRC_TABLE                          189 #ifdef DYNAMIC_CRC_TABLE
598     once(&made, make_crc_table);               << 190     if (crc_table_empty)
                                                   >> 191         make_crc_table();
599 #endif /* DYNAMIC_CRC_TABLE */                    192 #endif /* DYNAMIC_CRC_TABLE */
600     return (const z_crc_t FAR *)crc_table;        193     return (const z_crc_t FAR *)crc_table;
601 }                                                 194 }
602                                                   195 
603 /* =========================================== << 196 /* ========================================================================= */
604  * Use ARM machine instructions if available.  << 197 #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
605  * ten times faster than the braided calculati << 198 #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
606  * the presence of the CRC instruction at run  << 
607  * only be defined if the compilation specifie << 
608  * that has the instructions. For example, com << 
609  * -march=armv8-a+crc, or -march=native if the << 
610  * instructions.                               << 
611  */                                            << 
612 #ifdef ARMCRC32                                << 
613                                                << 
614 /*                                             << 
615    Constants empirically determined to maximiz << 
616    measurements on a Cortex-A57. Your mileage  << 
617  */                                            << 
618 #define Z_BATCH 3990                /* number  << 
619 #define Z_BATCH_ZEROS 0xa10d3d0c    /* compute << 
620 #define Z_BATCH_MIN 800             /* fewest  << 
621                                                   199 
                                                   >> 200 /* ========================================================================= */
622 unsigned long ZEXPORT crc32_z(crc, buf, len)      201 unsigned long ZEXPORT crc32_z(crc, buf, len)
623     unsigned long crc;                            202     unsigned long crc;
624     const unsigned char FAR *buf;                 203     const unsigned char FAR *buf;
625     z_size_t len;                                 204     z_size_t len;
626 {                                                 205 {
627     z_crc_t val;                               << 206     if (buf == Z_NULL) return 0UL;
628     z_word_t crc1, crc2;                       << 
629     const z_word_t *word;                      << 
630     z_word_t val0, val1, val2;                 << 
631     z_size_t last, last2, i;                   << 
632     z_size_t num;                              << 
633                                                << 
634     /* Return initial CRC, if requested. */    << 
635     if (buf == Z_NULL) return 0;               << 
636                                                   207 
637 #ifdef DYNAMIC_CRC_TABLE                          208 #ifdef DYNAMIC_CRC_TABLE
638     once(&made, make_crc_table);               << 209     if (crc_table_empty)
                                                   >> 210         make_crc_table();
639 #endif /* DYNAMIC_CRC_TABLE */                    211 #endif /* DYNAMIC_CRC_TABLE */
640                                                   212 
641     /* Pre-condition the CRC */                << 213 #ifdef BYFOUR
642     crc = (~crc) & 0xffffffff;                 << 214     if (sizeof(void *) == sizeof(ptrdiff_t)) {
                                                   >> 215         z_crc_t endian;
643                                                   216 
644     /* Compute the CRC up to a word boundary.  << 217         endian = 1;
645     while (len && ((z_size_t)buf & 7) != 0) {  << 218         if (*((unsigned char *)(&endian)))
646         len--;                                 << 219             return crc32_little(crc, buf, len);
647         val = *buf++;                          << 220         else
648         __asm__ volatile("crc32b %w0, %w0, %w1 << 221             return crc32_big(crc, buf, len);
649     }                                          << 
650                                                << 
651     /* Prepare to compute the CRC on full 64-b << 
652     word = (z_word_t const *)buf;              << 
653     num = len >> 3;                            << 
654     len &= 7;                                  << 
655                                                << 
656     /* Do three interleaved CRCs to realize th << 
657        instruction per cycle. Each CRC is calc << 
658        three CRCs are combined into a single C << 
659     while (num >= 3 * Z_BATCH) {               << 
660         crc1 = 0;                              << 
661         crc2 = 0;                              << 
662         for (i = 0; i < Z_BATCH; i++) {        << 
663             val0 = word[i];                    << 
664             val1 = word[i + Z_BATCH];          << 
665             val2 = word[i + 2 * Z_BATCH];      << 
666             __asm__ volatile("crc32x %w0, %w0, << 
667             __asm__ volatile("crc32x %w0, %w0, << 
668             __asm__ volatile("crc32x %w0, %w0, << 
669         }                                      << 
670         word += 3 * Z_BATCH;                   << 
671         num -= 3 * Z_BATCH;                    << 
672         crc = multmodp(Z_BATCH_ZEROS, crc) ^ c << 
673         crc = multmodp(Z_BATCH_ZEROS, crc) ^ c << 
674     }                                          << 
675                                                << 
676     /* Do one last smaller batch with the rema << 
677        to pay for the combination of CRCs. */  << 
678     last = num / 3;                            << 
679     if (last >= Z_BATCH_MIN) {                 << 
680         last2 = last << 1;                     << 
681         crc1 = 0;                              << 
682         crc2 = 0;                              << 
683         for (i = 0; i < last; i++) {           << 
684             val0 = word[i];                    << 
685             val1 = word[i + last];             << 
686             val2 = word[i + last2];            << 
687             __asm__ volatile("crc32x %w0, %w0, << 
688             __asm__ volatile("crc32x %w0, %w0, << 
689             __asm__ volatile("crc32x %w0, %w0, << 
690         }                                      << 
691         word += 3 * last;                      << 
692         num -= 3 * last;                       << 
693         val = x2nmodp(last, 6);                << 
694         crc = multmodp(val, crc) ^ crc1;       << 
695         crc = multmodp(val, crc) ^ crc2;       << 
696     }                                          << 
697                                                << 
698     /* Compute the CRC on any remaining words. << 
699     for (i = 0; i < num; i++) {                << 
700         val0 = word[i];                        << 
701         __asm__ volatile("crc32x %w0, %w0, %x1 << 
702     }                                             222     }
703     word += num;                               << 223 #endif /* BYFOUR */
704                                                << 224     crc = crc ^ 0xffffffffUL;
705     /* Complete the CRC on any remaining bytes << 225     while (len >= 8) {
706     buf = (const unsigned char FAR *)word;     << 226         DO8;
707     while (len) {                              << 227         len -= 8;
708         len--;                                 << 
709         val = *buf++;                          << 
710         __asm__ volatile("crc32b %w0, %w0, %w1 << 
711     }                                             228     }
712                                                << 229     if (len) do {
713     /* Return the CRC, post-conditioned. */    << 230         DO1;
714     return crc ^ 0xffffffff;                   << 231     } while (--len);
                                                   >> 232     return crc ^ 0xffffffffUL;
715 }                                                 233 }
716                                                   234 
717 #else                                          << 235 /* ========================================================================= */
                                                   >> 236 unsigned long ZEXPORT crc32(crc, buf, len)
                                                   >> 237     unsigned long crc;
                                                   >> 238     const unsigned char FAR *buf;
                                                   >> 239     uInt len;
                                                   >> 240 {
                                                   >> 241     return crc32_z(crc, buf, len);
                                                   >> 242 }
718                                                   243 
719 #ifdef W                                       << 244 #ifdef BYFOUR
720                                                   245 
721 /*                                                246 /*
722   Return the CRC of the W bytes in the word_t  << 247    This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit
723   least-significant byte of the word as the fi << 248    integer pointer type. This violates the strict aliasing rule, where a
724   or post conditioning. This is used to combin << 249    compiler can assume, for optimization purposes, that two pointers to
                                                   >> 250    fundamentally different types won't ever point to the same memory. This can
                                                   >> 251    manifest as a problem only if one of the pointers is written to. This code
                                                   >> 252    only reads from those pointers. So long as this code remains isolated in
                                                   >> 253    this compilation unit, there won't be a problem. For this reason, this code
                                                   >> 254    should not be copied and pasted into a compilation unit in which other code
                                                   >> 255    writes to the buffer that is passed to these routines.
725  */                                               256  */
726 local z_crc_t crc_word(data)                   << 
727     z_word_t data;                             << 
728 {                                              << 
729     int k;                                     << 
730     for (k = 0; k < W; k++)                    << 
731         data = (data >> 8) ^ crc_table[data &  << 
732     return (z_crc_t)data;                      << 
733 }                                              << 
734                                                   257 
735 local z_word_t crc_word_big(data)              << 258 /* ========================================================================= */
736     z_word_t data;                             << 259 #define DOLIT4 c ^= *buf4++; \
737 {                                              << 260         c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
738     int k;                                     << 261             crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
739     for (k = 0; k < W; k++)                    << 262 #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
740         data = (data << 8) ^                   << 
741             crc_big_table[(data >> ((W - 1) << << 
742     return data;                               << 
743 }                                              << 
744                                                << 
745 #endif                                         << 
746                                                   263 
747 /* ===========================================    264 /* ========================================================================= */
748 unsigned long ZEXPORT crc32_z(crc, buf, len)   << 265 local unsigned long crc32_little(crc, buf, len)
749     unsigned long crc;                            266     unsigned long crc;
750     const unsigned char FAR *buf;                 267     const unsigned char FAR *buf;
751     z_size_t len;                                 268     z_size_t len;
752 {                                                 269 {
753     /* Return initial CRC, if requested. */    << 270     register z_crc_t c;
754     if (buf == Z_NULL) return 0;               << 271     register const z_crc_t FAR *buf4;
755                                                << 
756 #ifdef DYNAMIC_CRC_TABLE                       << 
757     once(&made, make_crc_table);               << 
758 #endif /* DYNAMIC_CRC_TABLE */                 << 
759                                                << 
760     /* Pre-condition the CRC */                << 
761     crc = (~crc) & 0xffffffff;                 << 
762                                                << 
763 #ifdef W                                       << 
764                                                << 
765     /* If provided enough bytes, do a braided  << 
766     if (len >= N * W + W - 1) {                << 
767         z_size_t blks;                         << 
768         z_word_t const *words;                 << 
769         unsigned endian;                       << 
770         int k;                                 << 
771                                                << 
772         /* Compute the CRC up to a z_word_t bo << 
773         while (len && ((z_size_t)buf & (W - 1) << 
774             len--;                             << 
775             crc = (crc >> 8) ^ crc_table[(crc  << 
776         }                                      << 
777                                                << 
778         /* Compute the CRC on as many N z_word << 
779         blks = len / (N * W);                  << 
780         len -= blks * N * W;                   << 
781         words = (z_word_t const *)buf;         << 
782                                                << 
783         /* Do endian check at execution time i << 
784            processors can change the endianess << 
785            compiler knows what the endianess w << 
786            check and the unused branch. */     << 
787         endian = 1;                            << 
788         if (*(unsigned char *)&endian) {       << 
789             /* Little endian. */               << 
790                                                << 
791             z_crc_t crc0;                      << 
792             z_word_t word0;                    << 
793 #if N > 1                                      << 
794             z_crc_t crc1;                      << 
795             z_word_t word1;                    << 
796 #if N > 2                                      << 
797             z_crc_t crc2;                      << 
798             z_word_t word2;                    << 
799 #if N > 3                                      << 
800             z_crc_t crc3;                      << 
801             z_word_t word3;                    << 
802 #if N > 4                                      << 
803             z_crc_t crc4;                      << 
804             z_word_t word4;                    << 
805 #if N > 5                                      << 
806             z_crc_t crc5;                      << 
807             z_word_t word5;                    << 
808 #endif                                         << 
809 #endif                                         << 
810 #endif                                         << 
811 #endif                                         << 
812 #endif                                         << 
813                                                   272 
814             /* Initialize the CRC for each bra << 273     c = (z_crc_t)crc;
815             crc0 = crc;                        << 274     c = ~c;
816 #if N > 1                                      << 275     while (len && ((ptrdiff_t)buf & 3)) {
817             crc1 = 0;                          << 276         c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
818 #if N > 2                                      << 277         len--;
819             crc2 = 0;                          << 278     }
820 #if N > 3                                      << 
821             crc3 = 0;                          << 
822 #if N > 4                                      << 
823             crc4 = 0;                          << 
824 #if N > 5                                      << 
825             crc5 = 0;                          << 
826 #endif                                         << 
827 #endif                                         << 
828 #endif                                         << 
829 #endif                                         << 
830 #endif                                         << 
831                                                << 
832             /*                                 << 
833               Process the first blks-1 blocks, << 
834               independently.                   << 
835              */                                << 
836             while (--blks) {                   << 
837                 /* Load the word for each brai << 
838                 word0 = crc0 ^ words[0];       << 
839 #if N > 1                                      << 
840                 word1 = crc1 ^ words[1];       << 
841 #if N > 2                                      << 
842                 word2 = crc2 ^ words[2];       << 
843 #if N > 3                                      << 
844                 word3 = crc3 ^ words[3];       << 
845 #if N > 4                                      << 
846                 word4 = crc4 ^ words[4];       << 
847 #if N > 5                                      << 
848                 word5 = crc5 ^ words[5];       << 
849 #endif                                         << 
850 #endif                                         << 
851 #endif                                         << 
852 #endif                                         << 
853 #endif                                         << 
854                 words += N;                    << 
855                                                << 
856                 /* Compute and update the CRC  << 
857                    get unrolled. */            << 
858                 crc0 = crc_braid_table[0][word << 
859 #if N > 1                                      << 
860                 crc1 = crc_braid_table[0][word << 
861 #if N > 2                                      << 
862                 crc2 = crc_braid_table[0][word << 
863 #if N > 3                                      << 
864                 crc3 = crc_braid_table[0][word << 
865 #if N > 4                                      << 
866                 crc4 = crc_braid_table[0][word << 
867 #if N > 5                                      << 
868                 crc5 = crc_braid_table[0][word << 
869 #endif                                         << 
870 #endif                                         << 
871 #endif                                         << 
872 #endif                                         << 
873 #endif                                         << 
874                 for (k = 1; k < W; k++) {      << 
875                     crc0 ^= crc_braid_table[k] << 
876 #if N > 1                                      << 
877                     crc1 ^= crc_braid_table[k] << 
878 #if N > 2                                      << 
879                     crc2 ^= crc_braid_table[k] << 
880 #if N > 3                                      << 
881                     crc3 ^= crc_braid_table[k] << 
882 #if N > 4                                      << 
883                     crc4 ^= crc_braid_table[k] << 
884 #if N > 5                                      << 
885                     crc5 ^= crc_braid_table[k] << 
886 #endif                                         << 
887 #endif                                         << 
888 #endif                                         << 
889 #endif                                         << 
890 #endif                                         << 
891                 }                              << 
892             }                                  << 
893                                                << 
894             /*                                 << 
895               Process the last block, combinin << 
896               same time.                       << 
897              */                                << 
898             crc = crc_word(crc0 ^ words[0]);   << 
899 #if N > 1                                      << 
900             crc = crc_word(crc1 ^ words[1] ^ c << 
901 #if N > 2                                      << 
902             crc = crc_word(crc2 ^ words[2] ^ c << 
903 #if N > 3                                      << 
904             crc = crc_word(crc3 ^ words[3] ^ c << 
905 #if N > 4                                      << 
906             crc = crc_word(crc4 ^ words[4] ^ c << 
907 #if N > 5                                      << 
908             crc = crc_word(crc5 ^ words[5] ^ c << 
909 #endif                                         << 
910 #endif                                         << 
911 #endif                                         << 
912 #endif                                         << 
913 #endif                                         << 
914             words += N;                        << 
915         }                                      << 
916         else {                                 << 
917             /* Big endian. */                  << 
918                                                << 
919             z_word_t crc0, word0, comb;        << 
920 #if N > 1                                      << 
921             z_word_t crc1, word1;              << 
922 #if N > 2                                      << 
923             z_word_t crc2, word2;              << 
924 #if N > 3                                      << 
925             z_word_t crc3, word3;              << 
926 #if N > 4                                      << 
927             z_word_t crc4, word4;              << 
928 #if N > 5                                      << 
929             z_word_t crc5, word5;              << 
930 #endif                                         << 
931 #endif                                         << 
932 #endif                                         << 
933 #endif                                         << 
934 #endif                                         << 
935                                                << 
936             /* Initialize the CRC for each bra << 
937             crc0 = byte_swap(crc);             << 
938 #if N > 1                                      << 
939             crc1 = 0;                          << 
940 #if N > 2                                      << 
941             crc2 = 0;                          << 
942 #if N > 3                                      << 
943             crc3 = 0;                          << 
944 #if N > 4                                      << 
945             crc4 = 0;                          << 
946 #if N > 5                                      << 
947             crc5 = 0;                          << 
948 #endif                                         << 
949 #endif                                         << 
950 #endif                                         << 
951 #endif                                         << 
952 #endif                                         << 
953                                                   279 
954             /*                                 << 280     buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
955               Process the first blks-1 blocks, << 281     while (len >= 32) {
956               independently.                   << 282         DOLIT32;
957              */                                << 283         len -= 32;
958             while (--blks) {                   << 284     }
959                 /* Load the word for each brai << 285     while (len >= 4) {
960                 word0 = crc0 ^ words[0];       << 286         DOLIT4;
961 #if N > 1                                      << 287         len -= 4;
962                 word1 = crc1 ^ words[1];       << 288     }
963 #if N > 2                                      << 289     buf = (const unsigned char FAR *)buf4;
964                 word2 = crc2 ^ words[2];       << 290 
965 #if N > 3                                      << 291     if (len) do {
966                 word3 = crc3 ^ words[3];       << 292         c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
967 #if N > 4                                      << 293     } while (--len);
968                 word4 = crc4 ^ words[4];       << 294     c = ~c;
969 #if N > 5                                      << 295     return (unsigned long)c;
970                 word5 = crc5 ^ words[5];       << 296 }
971 #endif                                         << 
972 #endif                                         << 
973 #endif                                         << 
974 #endif                                         << 
975 #endif                                         << 
976                 words += N;                    << 
977                                                   297 
978                 /* Compute and update the CRC  << 298 /* ========================================================================= */
979                    get unrolled. */            << 299 #define DOBIG4 c ^= *buf4++; \
980                 crc0 = crc_braid_big_table[0][ << 300         c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
981 #if N > 1                                      << 301             crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
982                 crc1 = crc_braid_big_table[0][ << 302 #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
983 #if N > 2                                      << 
984                 crc2 = crc_braid_big_table[0][ << 
985 #if N > 3                                      << 
986                 crc3 = crc_braid_big_table[0][ << 
987 #if N > 4                                      << 
988                 crc4 = crc_braid_big_table[0][ << 
989 #if N > 5                                      << 
990                 crc5 = crc_braid_big_table[0][ << 
991 #endif                                         << 
992 #endif                                         << 
993 #endif                                         << 
994 #endif                                         << 
995 #endif                                         << 
996                 for (k = 1; k < W; k++) {      << 
997                     crc0 ^= crc_braid_big_tabl << 
998 #if N > 1                                      << 
999                     crc1 ^= crc_braid_big_tabl << 
1000 #if N > 2                                     << 
1001                     crc2 ^= crc_braid_big_tab << 
1002 #if N > 3                                     << 
1003                     crc3 ^= crc_braid_big_tab << 
1004 #if N > 4                                     << 
1005                     crc4 ^= crc_braid_big_tab << 
1006 #if N > 5                                     << 
1007                     crc5 ^= crc_braid_big_tab << 
1008 #endif                                        << 
1009 #endif                                        << 
1010 #endif                                        << 
1011 #endif                                        << 
1012 #endif                                        << 
1013                 }                             << 
1014             }                                 << 
1015                                                  303 
1016             /*                                << 304 /* ========================================================================= */
1017               Process the last block, combini << 305 local unsigned long crc32_big(crc, buf, len)
1018               same time.                      << 306     unsigned long crc;
1019              */                               << 307     const unsigned char FAR *buf;
1020             comb = crc_word_big(crc0 ^ words[ << 308     z_size_t len;
1021 #if N > 1                                     << 309 {
1022             comb = crc_word_big(crc1 ^ words[ << 310     register z_crc_t c;
1023 #if N > 2                                     << 311     register const z_crc_t FAR *buf4;
1024             comb = crc_word_big(crc2 ^ words[ << 
1025 #if N > 3                                     << 
1026             comb = crc_word_big(crc3 ^ words[ << 
1027 #if N > 4                                     << 
1028             comb = crc_word_big(crc4 ^ words[ << 
1029 #if N > 5                                     << 
1030             comb = crc_word_big(crc5 ^ words[ << 
1031 #endif                                        << 
1032 #endif                                        << 
1033 #endif                                        << 
1034 #endif                                        << 
1035 #endif                                        << 
1036             words += N;                       << 
1037             crc = byte_swap(comb);            << 
1038         }                                     << 
1039                                                  312 
1040         /*                                    << 313     c = ZSWAP32((z_crc_t)crc);
1041           Update the pointer to the remaining << 314     c = ~c;
1042          */                                   << 315     while (len && ((ptrdiff_t)buf & 3)) {
1043         buf = (unsigned char const *)words;   << 316         c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
                                                   >> 317         len--;
1044     }                                            318     }
1045                                                  319 
1046 #endif /* W */                                << 320     buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
1047                                               << 321     while (len >= 32) {
1048     /* Complete the computation of the CRC on << 322         DOBIG32;
1049     while (len >= 8) {                        << 323         len -= 32;
1050         len -= 8;                             << 
1051         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1052         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1053         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1054         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1055         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1056         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1057         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1058         crc = (crc >> 8) ^ crc_table[(crc ^ * << 
1059     }                                            324     }
1060     while (len) {                             << 325     while (len >= 4) {
1061         len--;                                << 326         DOBIG4;
1062         crc = (crc >> 8) ^ crc_table[(crc ^ * << 327         len -= 4;
1063     }                                            328     }
                                                   >> 329     buf = (const unsigned char FAR *)buf4;
1064                                                  330 
1065     /* Return the CRC, post-conditioned. */   << 331     if (len) do {
1066     return crc ^ 0xffffffff;                  << 332         c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
                                                   >> 333     } while (--len);
                                                   >> 334     c = ~c;
                                                   >> 335     return (unsigned long)(ZSWAP32(c));
1067 }                                                336 }
1068                                                  337 
1069 #endif                                        << 338 #endif /* BYFOUR */
                                                   >> 339 
                                                   >> 340 #define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */
1070                                                  341 
1071 /* ==========================================    342 /* ========================================================================= */
1072 unsigned long ZEXPORT crc32(crc, buf, len)    << 343 local unsigned long gf2_matrix_times(mat, vec)
1073     unsigned long crc;                        << 344     unsigned long *mat;
1074     const unsigned char FAR *buf;             << 345     unsigned long vec;
1075     uInt len;                                 << 346 {
1076 {                                             << 347     unsigned long sum;
1077     return crc32_z(crc, buf, len);            << 348 
                                                   >> 349     sum = 0;
                                                   >> 350     while (vec) {
                                                   >> 351         if (vec & 1)
                                                   >> 352             sum ^= *mat;
                                                   >> 353         vec >>= 1;
                                                   >> 354         mat++;
                                                   >> 355     }
                                                   >> 356     return sum;
1078 }                                                357 }
1079                                                  358 
1080 /* ==========================================    359 /* ========================================================================= */
1081 uLong ZEXPORT crc32_combine64(crc1, crc2, len << 360 local void gf2_matrix_square(square, mat)
1082     uLong crc1;                               << 361     unsigned long *square;
1083     uLong crc2;                               << 362     unsigned long *mat;
1084     z_off64_t len2;                           << 
1085 {                                                363 {
1086 #ifdef DYNAMIC_CRC_TABLE                      << 364     int n;
1087     once(&made, make_crc_table);              << 365 
1088 #endif /* DYNAMIC_CRC_TABLE */                << 366     for (n = 0; n < GF2_DIM; n++)
1089     return multmodp(x2nmodp(len2, 3), crc1) ^ << 367         square[n] = gf2_matrix_times(mat, mat[n]);
1090 }                                                368 }
1091                                                  369 
1092 /* ==========================================    370 /* ========================================================================= */
1093 uLong ZEXPORT crc32_combine(crc1, crc2, len2) << 371 local uLong crc32_combine_(crc1, crc2, len2)
1094     uLong crc1;                                  372     uLong crc1;
1095     uLong crc2;                                  373     uLong crc2;
1096     z_off_t len2;                             << 
1097 {                                             << 
1098     return crc32_combine64(crc1, crc2, (z_off << 
1099 }                                             << 
1100                                               << 
1101 /* ========================================== << 
1102 uLong ZEXPORT crc32_combine_gen64(len2)       << 
1103     z_off64_t len2;                              374     z_off64_t len2;
1104 {                                                375 {
1105 #ifdef DYNAMIC_CRC_TABLE                      << 376     int n;
1106     once(&made, make_crc_table);              << 377     unsigned long row;
1107 #endif /* DYNAMIC_CRC_TABLE */                << 378     unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */
1108     return x2nmodp(len2, 3);                  << 379     unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */
                                                   >> 380 
                                                   >> 381     /* degenerate case (also disallow negative lengths) */
                                                   >> 382     if (len2 <= 0)
                                                   >> 383         return crc1;
                                                   >> 384 
                                                   >> 385     /* put operator for one zero bit in odd */
                                                   >> 386     odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */
                                                   >> 387     row = 1;
                                                   >> 388     for (n = 1; n < GF2_DIM; n++) {
                                                   >> 389         odd[n] = row;
                                                   >> 390         row <<= 1;
                                                   >> 391     }
                                                   >> 392 
                                                   >> 393     /* put operator for two zero bits in even */
                                                   >> 394     gf2_matrix_square(even, odd);
                                                   >> 395 
                                                   >> 396     /* put operator for four zero bits in odd */
                                                   >> 397     gf2_matrix_square(odd, even);
                                                   >> 398 
                                                   >> 399     /* apply len2 zeros to crc1 (first square will put the operator for one
                                                   >> 400        zero byte, eight zero bits, in even) */
                                                   >> 401     do {
                                                   >> 402         /* apply zeros operator for this bit of len2 */
                                                   >> 403         gf2_matrix_square(even, odd);
                                                   >> 404         if (len2 & 1)
                                                   >> 405             crc1 = gf2_matrix_times(even, crc1);
                                                   >> 406         len2 >>= 1;
                                                   >> 407 
                                                   >> 408         /* if no more bits set, then done */
                                                   >> 409         if (len2 == 0)
                                                   >> 410             break;
                                                   >> 411 
                                                   >> 412         /* another iteration of the loop with odd and even swapped */
                                                   >> 413         gf2_matrix_square(odd, even);
                                                   >> 414         if (len2 & 1)
                                                   >> 415             crc1 = gf2_matrix_times(odd, crc1);
                                                   >> 416         len2 >>= 1;
                                                   >> 417 
                                                   >> 418         /* if no more bits set, then done */
                                                   >> 419     } while (len2 != 0);
                                                   >> 420 
                                                   >> 421     /* return combined crc */
                                                   >> 422     crc1 ^= crc2;
                                                   >> 423     return crc1;
1109 }                                                424 }
1110                                                  425 
1111 /* ==========================================    426 /* ========================================================================= */
1112 uLong ZEXPORT crc32_combine_gen(len2)         << 427 uLong ZEXPORT crc32_combine(crc1, crc2, len2)
                                                   >> 428     uLong crc1;
                                                   >> 429     uLong crc2;
1113     z_off_t len2;                                430     z_off_t len2;
1114 {                                                431 {
1115     return crc32_combine_gen64((z_off64_t)len << 432     return crc32_combine_(crc1, crc2, len2);
1116 }                                                433 }
1117                                                  434 
1118 /* ========================================== << 435 uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
1119 uLong ZEXPORT crc32_combine_op(crc1, crc2, op << 
1120     uLong crc1;                                  436     uLong crc1;
1121     uLong crc2;                                  437     uLong crc2;
1122     uLong op;                                 << 438     z_off64_t len2;
1123 {                                                439 {
1124     return multmodp(op, crc1) ^ (crc2 & 0xfff << 440     return crc32_combine_(crc1, crc2, len2);
1125 }                                                441 }
1126                                                  442