summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2018-11-02 22:55:14 -0700
committerMark Adler <madler@alumni.caltech.edu>2018-11-03 19:45:22 -0700
commit47cb41295751ee1b1b7e0acbfb847ea24324d5aa (patch)
treed827f7a4018914983958ab65281ebf832119a675
parent921d81b2a853233659d50b3c499a5c711a11e998 (diff)
downloadzlib-47cb41295751ee1b1b7e0acbfb847ea24324d5aa.tar.gz
zlib-47cb41295751ee1b1b7e0acbfb847ea24324d5aa.tar.bz2
zlib-47cb41295751ee1b1b7e0acbfb847ea24324d5aa.zip
Add tables for crc32_combine(), to speed it up by a factor of 200.
-rw-r--r--crc32.c194
-rw-r--r--crc32.h294
2 files changed, 396 insertions, 92 deletions
diff --git a/crc32.c b/crc32.c
index e72636a..5ccfe09 100644
--- a/crc32.c
+++ b/crc32.c
@@ -1,5 +1,5 @@
1/* crc32.c -- compute the CRC-32 of a data stream 1/* crc32.c -- compute the CRC-32 of a data stream
2 * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler 2 * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016, 2018 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h 3 * For conditions of distribution and use, see copyright notice in zlib.h
4 * 4 *
5 * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster 5 * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
@@ -18,7 +18,9 @@
18 first call get_crc_table() to initialize the tables before allowing more than 18 first call get_crc_table() to initialize the tables before allowing more than
19 one thread to use crc32(). 19 one thread to use crc32().
20 20
21 DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. 21 DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. A main()
22 routine is also produced, so that this one source file can be compiled to an
23 executable.
22 */ 24 */
23 25
24#ifdef MAKECRCH 26#ifdef MAKECRCH
@@ -45,20 +47,50 @@
45#endif /* BYFOUR */ 47#endif /* BYFOUR */
46 48
47/* Local functions for crc concatenation */ 49/* Local functions for crc concatenation */
48local unsigned long gf2_matrix_times OF((unsigned long *mat, 50#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
49 unsigned long vec)); 51local z_crc_t gf2_matrix_times OF((const z_crc_t *mat, z_crc_t vec));
50local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
51local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); 52local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
52 53
54/* ========================================================================= */
55local z_crc_t gf2_matrix_times(mat, vec)
56 const z_crc_t *mat;
57 z_crc_t vec;
58{
59 z_crc_t sum;
60
61 sum = 0;
62 while (vec) {
63 if (vec & 1)
64 sum ^= *mat;
65 vec >>= 1;
66 mat++;
67 }
68 return sum;
69}
70
53 71
54#ifdef DYNAMIC_CRC_TABLE 72#ifdef DYNAMIC_CRC_TABLE
55 73
56local volatile int crc_table_empty = 1; 74local volatile int crc_table_empty = 1;
57local z_crc_t FAR crc_table[TBLS][256]; 75local z_crc_t FAR crc_table[TBLS][256];
76local z_crc_t FAR crc_comb[GF2_DIM][GF2_DIM];
58local void make_crc_table OF((void)); 77local void make_crc_table OF((void));
78local void gf2_matrix_square OF((z_crc_t *square, const z_crc_t *mat));
59#ifdef MAKECRCH 79#ifdef MAKECRCH
60 local void write_table OF((FILE *, const z_crc_t FAR *)); 80 local void write_table OF((FILE *, const z_crc_t FAR *, int));
61#endif /* MAKECRCH */ 81#endif /* MAKECRCH */
82
83/* ========================================================================= */
84local void gf2_matrix_square(square, mat)
85 z_crc_t *square;
86 const z_crc_t *mat;
87{
88 int n;
89
90 for (n = 0; n < GF2_DIM; n++)
91 square[n] = gf2_matrix_times(mat, mat[n]);
92}
93
62/* 94/*
63 Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: 95 Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
64 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. 96 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.
@@ -127,6 +159,33 @@ local void make_crc_table()
127 } 159 }
128#endif /* BYFOUR */ 160#endif /* BYFOUR */
129 161
162 /* generate zero operators table for crc32_combine() */
163
164 /* generate the operator to apply a single zero bit to a CRC -- the
165 first row adds the polynomial if the low bit is a 1, and the
166 remaining rows shift the CRC right one bit */
167 k = GF2_DIM - 3;
168 crc_comb[k][0] = 0xedb88320UL; /* CRC-32 polynomial */
169 z_crc_t row = 1;
170 for (n = 1; n < GF2_DIM; n++) {
171 crc_comb[k][n] = row;
172 row <<= 1;
173 }
174
175 /* generate operators that apply 2, 4, and 8 zeros to a CRC, putting
176 the last one, the operator for one zero byte, at the 0 position */
177 gf2_matrix_square(crc_comb[k + 1], crc_comb[k]);
178 gf2_matrix_square(crc_comb[k + 2], crc_comb[k + 1]);
179 gf2_matrix_square(crc_comb[0], crc_comb[k + 2]);
180
181 /* generate operators for applying 2^n zero bytes to a CRC, filling out
182 the remainder of the table -- the operators repeat after GF2_DIM
183 values of n, so the table only needs GF2_DIM entries, regardless of
184 the size of the length being processed */
185 for (n = 1; n < k; n++)
186 gf2_matrix_square(crc_comb[n], crc_comb[n - 1]);
187
188 /* mark tables as complete, in case someone else is waiting */
130 crc_table_empty = 0; 189 crc_table_empty = 0;
131 } 190 }
132 else { /* not first */ 191 else { /* not first */
@@ -134,50 +193,68 @@ local void make_crc_table()
134 while (crc_table_empty) 193 while (crc_table_empty)
135 ; 194 ;
136 } 195 }
137
138#ifdef MAKECRCH 196#ifdef MAKECRCH
139 /* write out CRC tables to crc32.h */
140 { 197 {
141 FILE *out; 198 FILE *out;
142 199
143 out = fopen("crc32.h", "w"); 200 out = fopen("crc32.h", "w");
144 if (out == NULL) return; 201 if (out == NULL) return;
202
203 /* write out CRC table to crc32.h */
145 fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); 204 fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
146 fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); 205 fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
147 fprintf(out, "local const z_crc_t FAR "); 206 fprintf(out, "local const z_crc_t FAR ");
148 fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); 207 fprintf(out, "crc_table[%d][256] =\n{\n {\n", TBLS);
149 write_table(out, crc_table[0]); 208 write_table(out, crc_table[0], 256);
150# ifdef BYFOUR 209# ifdef BYFOUR
151 fprintf(out, "#ifdef BYFOUR\n"); 210 fprintf(out, "#ifdef BYFOUR\n");
152 for (k = 1; k < 8; k++) { 211 for (k = 1; k < 8; k++) {
153 fprintf(out, " },\n {\n"); 212 fprintf(out, " },\n {\n");
154 write_table(out, crc_table[k]); 213 write_table(out, crc_table[k], 256);
155 } 214 }
156 fprintf(out, "#endif\n"); 215 fprintf(out, "#endif\n");
157# endif /* BYFOUR */ 216# endif /* BYFOUR */
158 fprintf(out, " }\n};\n"); 217 fprintf(out, " }\n};\n");
218
219 /* write out zero operator table to crc32.h */
220 fprintf(out, "\nlocal const z_crc_t FAR ");
221 fprintf(out, "crc_comb[%d][%d] =\n{\n {\n", GF2_DIM, GF2_DIM);
222 write_table(out, crc_comb[0], GF2_DIM);
223 for (k = 1; k < GF2_DIM; k++) {
224 fprintf(out, " },\n {\n");
225 write_table(out, crc_comb[k], GF2_DIM);
226 }
227 fprintf(out, " }\n};\n");
159 fclose(out); 228 fclose(out);
160 } 229 }
161#endif /* MAKECRCH */ 230#endif /* MAKECRCH */
162} 231}
163 232
164#ifdef MAKECRCH 233#ifdef MAKECRCH
165local void write_table(out, table) 234local void write_table(out, table, k)
166 FILE *out; 235 FILE *out;
167 const z_crc_t FAR *table; 236 const z_crc_t FAR *table;
237 int k;
168{ 238{
169 int n; 239 int n;
170 240
171 for (n = 0; n < 256; n++) 241 for (n = 0; n < k; n++)
172 fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", 242 fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
173 (unsigned long)(table[n]), 243 (unsigned long)(table[n]),
174 n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); 244 n == k - 1 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
245}
246
247int main()
248{
249 make_crc_table();
250 return 0;
175} 251}
176#endif /* MAKECRCH */ 252#endif /* MAKECRCH */
177 253
178#else /* !DYNAMIC_CRC_TABLE */ 254#else /* !DYNAMIC_CRC_TABLE */
179/* ======================================================================== 255/* ========================================================================
180 * Tables of CRC-32s of all single-byte values, made by make_crc_table(). 256 * Tables of CRC-32s of all single-byte values, made by make_crc_table(),
257 * and tables of zero operator matrices for crc32_combine().
181 */ 258 */
182#include "crc32.h" 259#include "crc32.h"
183#endif /* DYNAMIC_CRC_TABLE */ 260#endif /* DYNAMIC_CRC_TABLE */
@@ -338,36 +415,6 @@ local unsigned long crc32_big(crc, buf, len)
338 415
339#endif /* BYFOUR */ 416#endif /* BYFOUR */
340 417
341#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
342
343/* ========================================================================= */
344local unsigned long gf2_matrix_times(mat, vec)
345 unsigned long *mat;
346 unsigned long vec;
347{
348 unsigned long sum;
349
350 sum = 0;
351 while (vec) {
352 if (vec & 1)
353 sum ^= *mat;
354 vec >>= 1;
355 mat++;
356 }
357 return sum;
358}
359
360/* ========================================================================= */
361local void gf2_matrix_square(square, mat)
362 unsigned long *square;
363 unsigned long *mat;
364{
365 int n;
366
367 for (n = 0; n < GF2_DIM; n++)
368 square[n] = gf2_matrix_times(mat, mat[n]);
369}
370
371/* ========================================================================= */ 418/* ========================================================================= */
372local uLong crc32_combine_(crc1, crc2, len2) 419local uLong crc32_combine_(crc1, crc2, len2)
373 uLong crc1; 420 uLong crc1;
@@ -375,53 +422,18 @@ local uLong crc32_combine_(crc1, crc2, len2)
375 z_off64_t len2; 422 z_off64_t len2;
376{ 423{
377 int n; 424 int n;
378 unsigned long row;
379 unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
380 unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
381
382 /* degenerate case (also disallow negative lengths) */
383 if (len2 <= 0)
384 return crc1;
385
386 /* put operator for one zero bit in odd */
387 odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
388 row = 1;
389 for (n = 1; n < GF2_DIM; n++) {
390 odd[n] = row;
391 row <<= 1;
392 }
393 425
394 /* put operator for two zero bits in even */ 426#ifdef DYNAMIC_CRC_TABLE
395 gf2_matrix_square(even, odd); 427 if (crc_table_empty)
396 428 make_crc_table();
397 /* put operator for four zero bits in odd */ 429#endif /* DYNAMIC_CRC_TABLE */
398 gf2_matrix_square(odd, even); 430
399 431 if (len2 > 0)
400 /* apply len2 zeros to crc1 (first square will put the operator for one 432 /* operator for 2^n zeros repeats every GF2_DIM n values */
401 zero byte, eight zero bits, in even) */ 433 for (n = 0; len2; n = (n + 1) % GF2_DIM, len2 >>= 1)
402 do { 434 if (len2 & 1)
403 /* apply zeros operator for this bit of len2 */ 435 crc1 = gf2_matrix_times(crc_comb[n], crc1);
404 gf2_matrix_square(even, odd); 436 return crc1 ^ crc2;
405 if (len2 & 1)
406 crc1 = gf2_matrix_times(even, crc1);
407 len2 >>= 1;
408
409 /* if no more bits set, then done */
410 if (len2 == 0)
411 break;
412
413 /* another iteration of the loop with odd and even swapped */
414 gf2_matrix_square(odd, even);
415 if (len2 & 1)
416 crc1 = gf2_matrix_times(odd, crc1);
417 len2 >>= 1;
418
419 /* if no more bits set, then done */
420 } while (len2 != 0);
421
422 /* return combined crc */
423 crc1 ^= crc2;
424 return crc1;
425} 437}
426 438
427/* ========================================================================= */ 439/* ========================================================================= */
diff --git a/crc32.h b/crc32.h
index 9e0c778..64ee8ea 100644
--- a/crc32.h
+++ b/crc32.h
@@ -2,7 +2,7 @@
2 * Generated automatically by crc32.c 2 * Generated automatically by crc32.c
3 */ 3 */
4 4
5local const z_crc_t FAR crc_table[TBLS][256] = 5local const z_crc_t FAR crc_table[8][256] =
6{ 6{
7 { 7 {
8 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 8 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
@@ -439,3 +439,295 @@ local const z_crc_t FAR crc_table[TBLS][256] =
439#endif 439#endif
440 } 440 }
441}; 441};
442
443local const z_crc_t FAR crc_comb[32][32] =
444{
445 {
446 0x77073096UL, 0xee0e612cUL, 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL,
447 0x3b6e20c8UL, 0x76dc4190UL, 0xedb88320UL, 0x00000001UL, 0x00000002UL,
448 0x00000004UL, 0x00000008UL, 0x00000010UL, 0x00000020UL, 0x00000040UL,
449 0x00000080UL, 0x00000100UL, 0x00000200UL, 0x00000400UL, 0x00000800UL,
450 0x00001000UL, 0x00002000UL, 0x00004000UL, 0x00008000UL, 0x00010000UL,
451 0x00020000UL, 0x00040000UL, 0x00080000UL, 0x00100000UL, 0x00200000UL,
452 0x00400000UL, 0x00800000UL
453 },
454 {
455 0x191b3141UL, 0x32366282UL, 0x646cc504UL, 0xc8d98a08UL, 0x4ac21251UL,
456 0x958424a2UL, 0xf0794f05UL, 0x3b83984bUL, 0x77073096UL, 0xee0e612cUL,
457 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL, 0x3b6e20c8UL, 0x76dc4190UL,
458 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL,
459 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL, 0x00000100UL,
460 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL, 0x00002000UL,
461 0x00004000UL, 0x00008000UL
462 },
463 {
464 0xb8bc6765UL, 0xaa09c88bUL, 0x8f629757UL, 0xc5b428efUL, 0x5019579fUL,
465 0xa032af3eUL, 0x9b14583dUL, 0xed59b63bUL, 0x01c26a37UL, 0x0384d46eUL,
466 0x0709a8dcUL, 0x0e1351b8UL, 0x1c26a370UL, 0x384d46e0UL, 0x709a8dc0UL,
467 0xe1351b80UL, 0x191b3141UL, 0x32366282UL, 0x646cc504UL, 0xc8d98a08UL,
468 0x4ac21251UL, 0x958424a2UL, 0xf0794f05UL, 0x3b83984bUL, 0x77073096UL,
469 0xee0e612cUL, 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL, 0x3b6e20c8UL,
470 0x76dc4190UL, 0xedb88320UL
471 },
472 {
473 0xccaa009eUL, 0x4225077dUL, 0x844a0efaUL, 0xd3e51bb5UL, 0x7cbb312bUL,
474 0xf9766256UL, 0x299dc2edUL, 0x533b85daUL, 0xa6770bb4UL, 0x979f1129UL,
475 0xf44f2413UL, 0x33ef4e67UL, 0x67de9cceUL, 0xcfbd399cUL, 0x440b7579UL,
476 0x8816eaf2UL, 0xcb5cd3a5UL, 0x4dc8a10bUL, 0x9b914216UL, 0xec53826dUL,
477 0x03d6029bUL, 0x07ac0536UL, 0x0f580a6cUL, 0x1eb014d8UL, 0x3d6029b0UL,
478 0x7ac05360UL, 0xf580a6c0UL, 0x30704bc1UL, 0x60e09782UL, 0xc1c12f04UL,
479 0x58f35849UL, 0xb1e6b092UL
480 },
481 {
482 0xae689191UL, 0x87a02563UL, 0xd4314c87UL, 0x73139f4fUL, 0xe6273e9eUL,
483 0x173f7b7dUL, 0x2e7ef6faUL, 0x5cfdedf4UL, 0xb9fbdbe8UL, 0xa886b191UL,
484 0x8a7c6563UL, 0xcf89cc87UL, 0x44629f4fUL, 0x88c53e9eUL, 0xcafb7b7dUL,
485 0x4e87f0bbUL, 0x9d0fe176UL, 0xe16ec4adUL, 0x19ac8f1bUL, 0x33591e36UL,
486 0x66b23c6cUL, 0xcd6478d8UL, 0x41b9f7f1UL, 0x8373efe2UL, 0xdd96d985UL,
487 0x605cb54bUL, 0xc0b96a96UL, 0x5a03d36dUL, 0xb407a6daUL, 0xb37e4bf5UL,
488 0xbd8d91abUL, 0xa06a2517UL
489 },
490 {
491 0xf1da05aaUL, 0x38c50d15UL, 0x718a1a2aUL, 0xe3143454UL, 0x1d596ee9UL,
492 0x3ab2ddd2UL, 0x7565bba4UL, 0xeacb7748UL, 0x0ee7e8d1UL, 0x1dcfd1a2UL,
493 0x3b9fa344UL, 0x773f4688UL, 0xee7e8d10UL, 0x078c1c61UL, 0x0f1838c2UL,
494 0x1e307184UL, 0x3c60e308UL, 0x78c1c610UL, 0xf1838c20UL, 0x38761e01UL,
495 0x70ec3c02UL, 0xe1d87804UL, 0x18c1f649UL, 0x3183ec92UL, 0x6307d924UL,
496 0xc60fb248UL, 0x576e62d1UL, 0xaedcc5a2UL, 0x86c88d05UL, 0xd6e01c4bUL,
497 0x76b13ed7UL, 0xed627daeUL
498 },
499 {
500 0x8f352d95UL, 0xc51b5d6bUL, 0x5147bc97UL, 0xa28f792eUL, 0x9e6ff41dUL,
501 0xe7aeee7bUL, 0x142cdab7UL, 0x2859b56eUL, 0x50b36adcUL, 0xa166d5b8UL,
502 0x99bcad31UL, 0xe8085c23UL, 0x0b61be07UL, 0x16c37c0eUL, 0x2d86f81cUL,
503 0x5b0df038UL, 0xb61be070UL, 0xb746c6a1UL, 0xb5fc8b03UL, 0xb0881047UL,
504 0xba6126cfUL, 0xafb34bdfUL, 0x841791ffUL, 0xd35e25bfUL, 0x7dcd4d3fUL,
505 0xfb9a9a7eUL, 0x2c4432bdUL, 0x5888657aUL, 0xb110caf4UL, 0xb95093a9UL,
506 0xa9d02113UL, 0x88d14467UL
507 },
508 {
509 0x33fff533UL, 0x67ffea66UL, 0xcfffd4ccUL, 0x448eafd9UL, 0x891d5fb2UL,
510 0xc94bb925UL, 0x49e6740bUL, 0x93cce816UL, 0xfce8d66dUL, 0x22a0aa9bUL,
511 0x45415536UL, 0x8a82aa6cUL, 0xce745299UL, 0x4799a373UL, 0x8f3346e6UL,
512 0xc5178b8dUL, 0x515e115bUL, 0xa2bc22b6UL, 0x9e09432dUL, 0xe763801bUL,
513 0x15b60677UL, 0x2b6c0ceeUL, 0x56d819dcUL, 0xadb033b8UL, 0x80116131UL,
514 0xdb53c423UL, 0x6dd68e07UL, 0xdbad1c0eUL, 0x6c2b3e5dUL, 0xd8567cbaUL,
515 0x6bddff35UL, 0xd7bbfe6aUL
516 },
517 {
518 0xce3371cbUL, 0x4717e5d7UL, 0x8e2fcbaeUL, 0xc72e911dUL, 0x552c247bUL,
519 0xaa5848f6UL, 0x8fc197adUL, 0xc4f2291bUL, 0x52955477UL, 0xa52aa8eeUL,
520 0x9124579dUL, 0xf939a97bUL, 0x290254b7UL, 0x5204a96eUL, 0xa40952dcUL,
521 0x9363a3f9UL, 0xfdb641b3UL, 0x201d8527UL, 0x403b0a4eUL, 0x8076149cUL,
522 0xdb9d2f79UL, 0x6c4b58b3UL, 0xd896b166UL, 0x6a5c648dUL, 0xd4b8c91aUL,
523 0x72009475UL, 0xe40128eaUL, 0x13735795UL, 0x26e6af2aUL, 0x4dcd5e54UL,
524 0x9b9abca8UL, 0xec447f11UL
525 },
526 {
527 0x1072db28UL, 0x20e5b650UL, 0x41cb6ca0UL, 0x8396d940UL, 0xdc5cb4c1UL,
528 0x63c86fc3UL, 0xc790df86UL, 0x5450b94dUL, 0xa8a1729aUL, 0x8a33e375UL,
529 0xcf16c0abUL, 0x455c8717UL, 0x8ab90e2eUL, 0xce031a1dUL, 0x4777327bUL,
530 0x8eee64f6UL, 0xc6adcfadUL, 0x562a991bUL, 0xac553236UL, 0x83db622dUL,
531 0xdcc7c21bUL, 0x62fe8277UL, 0xc5fd04eeUL, 0x508b0f9dUL, 0xa1161f3aUL,
532 0x995d3835UL, 0xe9cb762bUL, 0x08e7ea17UL, 0x11cfd42eUL, 0x239fa85cUL,
533 0x473f50b8UL, 0x8e7ea170UL
534 },
535 {
536 0xf891f16fUL, 0x2a52e49fUL, 0x54a5c93eUL, 0xa94b927cUL, 0x89e622b9UL,
537 0xc8bd4333UL, 0x4a0b8027UL, 0x9417004eUL, 0xf35f06ddUL, 0x3dcf0bfbUL,
538 0x7b9e17f6UL, 0xf73c2fecUL, 0x35095999UL, 0x6a12b332UL, 0xd4256664UL,
539 0x733bca89UL, 0xe6779512UL, 0x179e2c65UL, 0x2f3c58caUL, 0x5e78b194UL,
540 0xbcf16328UL, 0xa293c011UL, 0x9e568663UL, 0xe7dc0a87UL, 0x14c9134fUL,
541 0x2992269eUL, 0x53244d3cUL, 0xa6489a78UL, 0x97e032b1UL, 0xf4b16323UL,
542 0x3213c007UL, 0x6427800eUL
543 },
544 {
545 0x88b6ba63UL, 0xca1c7287UL, 0x4f49e34fUL, 0x9e93c69eUL, 0xe6568b7dUL,
546 0x17dc10bbUL, 0x2fb82176UL, 0x5f7042ecUL, 0xbee085d8UL, 0xa6b00df1UL,
547 0x96111da3UL, 0xf7533d07UL, 0x35d77c4fUL, 0x6baef89eUL, 0xd75df13cUL,
548 0x75cae439UL, 0xeb95c872UL, 0x0c5a96a5UL, 0x18b52d4aUL, 0x316a5a94UL,
549 0x62d4b528UL, 0xc5a96a50UL, 0x5023d2e1UL, 0xa047a5c2UL, 0x9bfe4dc5UL,
550 0xec8d9dcbUL, 0x026a3dd7UL, 0x04d47baeUL, 0x09a8f75cUL, 0x1351eeb8UL,
551 0x26a3dd70UL, 0x4d47bae0UL
552 },
553 {
554 0x5ad8a92cUL, 0xb5b15258UL, 0xb013a2f1UL, 0xbb5643a3UL, 0xaddd8107UL,
555 0x80ca044fUL, 0xdae50edfUL, 0x6ebb1bffUL, 0xdd7637feUL, 0x619d69bdUL,
556 0xc33ad37aUL, 0x5d04a0b5UL, 0xba09416aUL, 0xaf638495UL, 0x85b60f6bUL,
557 0xd01d1897UL, 0x7b4b376fUL, 0xf6966edeUL, 0x365ddbfdUL, 0x6cbbb7faUL,
558 0xd9776ff4UL, 0x699fd9a9UL, 0xd33fb352UL, 0x7d0e60e5UL, 0xfa1cc1caUL,
559 0x2f4885d5UL, 0x5e910baaUL, 0xbd221754UL, 0xa13528e9UL, 0x991b5793UL,
560 0xe947a967UL, 0x09fe548fUL
561 },
562 {
563 0xb566f6e2UL, 0xb1bceb85UL, 0xb808d14bUL, 0xab60a4d7UL, 0x8db04fefUL,
564 0xc011999fUL, 0x5b52357fUL, 0xb6a46afeUL, 0xb639d3bdUL, 0xb702a13bUL,
565 0xb5744437UL, 0xb1998e2fUL, 0xb8421a1fUL, 0xabf5327fUL, 0x8c9b62bfUL,
566 0xc247c33fUL, 0x5ffe803fUL, 0xbffd007eUL, 0xa48b06bdUL, 0x92670b3bUL,
567 0xffbf1037UL, 0x240f262fUL, 0x481e4c5eUL, 0x903c98bcUL, 0xfb083739UL,
568 0x2d616833UL, 0x5ac2d066UL, 0xb585a0ccUL, 0xb07a47d9UL, 0xbb8589f3UL,
569 0xac7a15a7UL, 0x83852d0fUL
570 },
571 {
572 0x9d9129bfUL, 0xe053553fUL, 0x1bd7ac3fUL, 0x37af587eUL, 0x6f5eb0fcUL,
573 0xdebd61f8UL, 0x660bc5b1UL, 0xcc178b62UL, 0x435e1085UL, 0x86bc210aUL,
574 0xd6094455UL, 0x77638eebUL, 0xeec71dd6UL, 0x06ff3dedUL, 0x0dfe7bdaUL,
575 0x1bfcf7b4UL, 0x37f9ef68UL, 0x6ff3ded0UL, 0xdfe7bda0UL, 0x64be7d01UL,
576 0xc97cfa02UL, 0x4988f245UL, 0x9311e48aUL, 0xfd52cf55UL, 0x21d498ebUL,
577 0x43a931d6UL, 0x875263acUL, 0xd5d5c119UL, 0x70da8473UL, 0xe1b508e6UL,
578 0x181b178dUL, 0x30362f1aUL
579 },
580 {
581 0x2ee43a2cUL, 0x5dc87458UL, 0xbb90e8b0UL, 0xac50d721UL, 0x83d0a803UL,
582 0xdcd05647UL, 0x62d1aacfUL, 0xc5a3559eUL, 0x5037ad7dUL, 0xa06f5afaUL,
583 0x9bafb3b5UL, 0xec2e612bUL, 0x032dc417UL, 0x065b882eUL, 0x0cb7105cUL,
584 0x196e20b8UL, 0x32dc4170UL, 0x65b882e0UL, 0xcb7105c0UL, 0x4d930dc1UL,
585 0x9b261b82UL, 0xed3d3145UL, 0x010b64cbUL, 0x0216c996UL, 0x042d932cUL,
586 0x085b2658UL, 0x10b64cb0UL, 0x216c9960UL, 0x42d932c0UL, 0x85b26580UL,
587 0xd015cd41UL, 0x7b5a9cc3UL
588 },
589 {
590 0x1b4511eeUL, 0x368a23dcUL, 0x6d1447b8UL, 0xda288f70UL, 0x6f2018a1UL,
591 0xde403142UL, 0x67f164c5UL, 0xcfe2c98aUL, 0x44b49555UL, 0x89692aaaUL,
592 0xc9a35315UL, 0x4837a06bUL, 0x906f40d6UL, 0xfbaf87edUL, 0x2c2e099bUL,
593 0x585c1336UL, 0xb0b8266cUL, 0xba014a99UL, 0xaf739373UL, 0x859620a7UL,
594 0xd05d470fUL, 0x7bcb885fUL, 0xf79710beUL, 0x345f273dUL, 0x68be4e7aUL,
595 0xd17c9cf4UL, 0x79883fa9UL, 0xf3107f52UL, 0x3d51f8e5UL, 0x7aa3f1caUL,
596 0xf547e394UL, 0x31fec169UL
597 },
598 {
599 0xbce15202UL, 0xa2b3a245UL, 0x9e1642cbUL, 0xe75d83d7UL, 0x15ca01efUL,
600 0x2b9403deUL, 0x572807bcUL, 0xae500f78UL, 0x87d118b1UL, 0xd4d33723UL,
601 0x72d76807UL, 0xe5aed00eUL, 0x102ca65dUL, 0x20594cbaUL, 0x40b29974UL,
602 0x816532e8UL, 0xd9bb6391UL, 0x6807c163UL, 0xd00f82c6UL, 0x7b6e03cdUL,
603 0xf6dc079aUL, 0x36c90975UL, 0x6d9212eaUL, 0xdb2425d4UL, 0x6d394de9UL,
604 0xda729bd2UL, 0x6f9431e5UL, 0xdf2863caUL, 0x6521c1d5UL, 0xca4383aaUL,
605 0x4ff60115UL, 0x9fec022aUL
606 },
607 {
608 0xff08e5efUL, 0x2560cd9fUL, 0x4ac19b3eUL, 0x9583367cUL, 0xf0776ab9UL,
609 0x3b9fd333UL, 0x773fa666UL, 0xee7f4cccUL, 0x078f9fd9UL, 0x0f1f3fb2UL,
610 0x1e3e7f64UL, 0x3c7cfec8UL, 0x78f9fd90UL, 0xf1f3fb20UL, 0x3896f001UL,
611 0x712de002UL, 0xe25bc004UL, 0x1fc68649UL, 0x3f8d0c92UL, 0x7f1a1924UL,
612 0xfe343248UL, 0x271962d1UL, 0x4e32c5a2UL, 0x9c658b44UL, 0xe3ba10c9UL,
613 0x1c0527d3UL, 0x380a4fa6UL, 0x70149f4cUL, 0xe0293e98UL, 0x1b237b71UL,
614 0x3646f6e2UL, 0x6c8dedc4UL
615 },
616 {
617 0x6f76172eUL, 0xdeec2e5cUL, 0x66a95af9UL, 0xcd52b5f2UL, 0x41d46da5UL,
618 0x83a8db4aUL, 0xdc20b0d5UL, 0x633067ebUL, 0xc660cfd6UL, 0x57b099edUL,
619 0xaf6133daUL, 0x85b361f5UL, 0xd017c5abUL, 0x7b5e8d17UL, 0xf6bd1a2eUL,
620 0x360b321dUL, 0x6c16643aUL, 0xd82cc874UL, 0x6b2896a9UL, 0xd6512d52UL,
621 0x77d35ce5UL, 0xefa6b9caUL, 0x043c75d5UL, 0x0878ebaaUL, 0x10f1d754UL,
622 0x21e3aea8UL, 0x43c75d50UL, 0x878ebaa0UL, 0xd46c7301UL, 0x73a9e043UL,
623 0xe753c086UL, 0x15d6874dUL
624 },
625 {
626 0x56f5cab9UL, 0xadeb9572UL, 0x80a62ca5UL, 0xda3d5f0bUL, 0x6f0bb857UL,
627 0xde1770aeUL, 0x675fe71dUL, 0xcebfce3aUL, 0x460e9a35UL, 0x8c1d346aUL,
628 0xc34b6e95UL, 0x5de7db6bUL, 0xbbcfb6d6UL, 0xacee6bedUL, 0x82add19bUL,
629 0xde2aa577UL, 0x67244cafUL, 0xce48995eUL, 0x47e034fdUL, 0x8fc069faUL,
630 0xc4f1d5b5UL, 0x5292ad2bUL, 0xa5255a56UL, 0x913bb2edUL, 0xf906639bUL,
631 0x297dc177UL, 0x52fb82eeUL, 0xa5f705dcUL, 0x909f0df9UL, 0xfa4f1db3UL,
632 0x2fef3d27UL, 0x5fde7a4eUL
633 },
634 {
635 0x385993acUL, 0x70b32758UL, 0xe1664eb0UL, 0x19bd9b21UL, 0x337b3642UL,
636 0x66f66c84UL, 0xcdecd908UL, 0x40a8b451UL, 0x815168a2UL, 0xd9d3d705UL,
637 0x68d6a84bUL, 0xd1ad5096UL, 0x782ba76dUL, 0xf0574edaUL, 0x3bdf9bf5UL,
638 0x77bf37eaUL, 0xef7e6fd4UL, 0x058dd9e9UL, 0x0b1bb3d2UL, 0x163767a4UL,
639 0x2c6ecf48UL, 0x58dd9e90UL, 0xb1bb3d20UL, 0xb8077c01UL, 0xab7ffe43UL,
640 0x8d8efac7UL, 0xc06cf3cfUL, 0x5ba8e1dfUL, 0xb751c3beUL, 0xb5d2813dUL,
641 0xb0d4043bUL, 0xbad90e37UL
642 },
643 {
644 0xb4247b20UL, 0xb339f001UL, 0xbd02e643UL, 0xa174cac7UL, 0x999893cfUL,
645 0xe84021dfUL, 0x0bf145ffUL, 0x17e28bfeUL, 0x2fc517fcUL, 0x5f8a2ff8UL,
646 0xbf145ff0UL, 0xa559b9a1UL, 0x91c27503UL, 0xf8f5ec47UL, 0x2a9adecfUL,
647 0x5535bd9eUL, 0xaa6b7b3cUL, 0x8fa7f039UL, 0xc43ee633UL, 0x530cca27UL,
648 0xa619944eUL, 0x97422eddUL, 0xf5f55bfbUL, 0x309bb1b7UL, 0x6137636eUL,
649 0xc26ec6dcUL, 0x5fac8bf9UL, 0xbf5917f2UL, 0xa5c329a5UL, 0x90f7550bUL,
650 0xfa9fac57UL, 0x2e4e5eefUL
651 },
652 {
653 0x695186a7UL, 0xd2a30d4eUL, 0x7e371cddUL, 0xfc6e39baUL, 0x23ad7535UL,
654 0x475aea6aUL, 0x8eb5d4d4UL, 0xc61aafe9UL, 0x57445993UL, 0xae88b326UL,
655 0x8660600dUL, 0xd7b1c65bUL, 0x74128af7UL, 0xe82515eeUL, 0x0b3b2d9dUL,
656 0x16765b3aUL, 0x2cecb674UL, 0x59d96ce8UL, 0xb3b2d9d0UL, 0xbc14b5e1UL,
657 0xa3586d83UL, 0x9dc1dd47UL, 0xe0f2bccfUL, 0x1a947fdfUL, 0x3528ffbeUL,
658 0x6a51ff7cUL, 0xd4a3fef8UL, 0x7236fbb1UL, 0xe46df762UL, 0x13aae885UL,
659 0x2755d10aUL, 0x4eaba214UL
660 },
661 {
662 0x66bc001eUL, 0xcd78003cUL, 0x41810639UL, 0x83020c72UL, 0xdd751ea5UL,
663 0x619b3b0bUL, 0xc3367616UL, 0x5d1dea6dUL, 0xba3bd4daUL, 0xaf06aff5UL,
664 0x857c59abUL, 0xd189b517UL, 0x78626c6fUL, 0xf0c4d8deUL, 0x3af8b7fdUL,
665 0x75f16ffaUL, 0xebe2dff4UL, 0x0cb4b9a9UL, 0x19697352UL, 0x32d2e6a4UL,
666 0x65a5cd48UL, 0xcb4b9a90UL, 0x4de63361UL, 0x9bcc66c2UL, 0xece9cbc5UL,
667 0x02a291cbUL, 0x05452396UL, 0x0a8a472cUL, 0x15148e58UL, 0x2a291cb0UL,
668 0x54523960UL, 0xa8a472c0UL
669 },
670 {
671 0xb58b27b3UL, 0xb0674927UL, 0xbbbf940fUL, 0xac0e2e5fUL, 0x836d5affUL,
672 0xddabb3bfUL, 0x6026613fUL, 0xc04cc27eUL, 0x5be882bdUL, 0xb7d1057aUL,
673 0xb4d30cb5UL, 0xb2d71f2bUL, 0xbedf3817UL, 0xa6cf766fUL, 0x96efea9fUL,
674 0xf6aed37fUL, 0x362ca0bfUL, 0x6c59417eUL, 0xd8b282fcUL, 0x6a1403b9UL,
675 0xd4280772UL, 0x732108a5UL, 0xe642114aUL, 0x17f524d5UL, 0x2fea49aaUL,
676 0x5fd49354UL, 0xbfa926a8UL, 0xa4234b11UL, 0x93379063UL, 0xfd1e2687UL,
677 0x214d4b4fUL, 0x429a969eUL
678 },
679 {
680 0xfe273162UL, 0x273f6485UL, 0x4e7ec90aUL, 0x9cfd9214UL, 0xe28a2269UL,
681 0x1e654293UL, 0x3cca8526UL, 0x79950a4cUL, 0xf32a1498UL, 0x3d252f71UL,
682 0x7a4a5ee2UL, 0xf494bdc4UL, 0x32587dc9UL, 0x64b0fb92UL, 0xc961f724UL,
683 0x49b2e809UL, 0x9365d012UL, 0xfdbaa665UL, 0x20044a8bUL, 0x40089516UL,
684 0x80112a2cUL, 0xdb535219UL, 0x6dd7a273UL, 0xdbaf44e6UL, 0x6c2f8f8dUL,
685 0xd85f1f1aUL, 0x6bcf3875UL, 0xd79e70eaUL, 0x744de795UL, 0xe89bcf2aUL,
686 0x0a469815UL, 0x148d302aUL
687 },
688 {
689 0xd3c98813UL, 0x7ce21667UL, 0xf9c42cceUL, 0x28f95fddUL, 0x51f2bfbaUL,
690 0xa3e57f74UL, 0x9cbbf8a9UL, 0xe206f713UL, 0x1f7ce867UL, 0x3ef9d0ceUL,
691 0x7df3a19cUL, 0xfbe74338UL, 0x2cbf8031UL, 0x597f0062UL, 0xb2fe00c4UL,
692 0xbe8d07c9UL, 0xa66b09d3UL, 0x97a715e7UL, 0xf43f2d8fUL, 0x330f5d5fUL,
693 0x661ebabeUL, 0xcc3d757cUL, 0x430becb9UL, 0x8617d972UL, 0xd75eb4a5UL,
694 0x75cc6f0bUL, 0xeb98de16UL, 0x0c40ba6dUL, 0x188174daUL, 0x3102e9b4UL,
695 0x6205d368UL, 0xc40ba6d0UL
696 },
697 {
698 0xf7d6deb4UL, 0x34dcbb29UL, 0x69b97652UL, 0xd372eca4UL, 0x7d94df09UL,
699 0xfb29be12UL, 0x2d227a65UL, 0x5a44f4caUL, 0xb489e994UL, 0xb262d569UL,
700 0xbfb4ac93UL, 0xa4185f67UL, 0x9341b88fUL, 0xfdf2775fUL, 0x2095e8ffUL,
701 0x412bd1feUL, 0x8257a3fcUL, 0xdfde41b9UL, 0x64cd8533UL, 0xc99b0a66UL,
702 0x4847128dUL, 0x908e251aUL, 0xfa6d4c75UL, 0x2fab9eabUL, 0x5f573d56UL,
703 0xbeae7aacUL, 0xa62df319UL, 0x972ae073UL, 0xf524c6a7UL, 0x31388b0fUL,
704 0x6271161eUL, 0xc4e22c3cUL
705 },
706 {
707 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL,
708 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL, 0x00000100UL,
709 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL, 0x00002000UL,
710 0x00004000UL, 0x00008000UL, 0x00010000UL, 0x00020000UL, 0x00040000UL,
711 0x00080000UL, 0x00100000UL, 0x00200000UL, 0x00400000UL, 0x00800000UL,
712 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL, 0x10000000UL,
713 0x20000000UL, 0x40000000UL
714 },
715 {
716 0x76dc4190UL, 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL,
717 0x00000008UL, 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL,
718 0x00000100UL, 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL,
719 0x00002000UL, 0x00004000UL, 0x00008000UL, 0x00010000UL, 0x00020000UL,
720 0x00040000UL, 0x00080000UL, 0x00100000UL, 0x00200000UL, 0x00400000UL,
721 0x00800000UL, 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
722 0x10000000UL, 0x20000000UL
723 },
724 {
725 0x1db71064UL, 0x3b6e20c8UL, 0x76dc4190UL, 0xedb88320UL, 0x00000001UL,
726 0x00000002UL, 0x00000004UL, 0x00000008UL, 0x00000010UL, 0x00000020UL,
727 0x00000040UL, 0x00000080UL, 0x00000100UL, 0x00000200UL, 0x00000400UL,
728 0x00000800UL, 0x00001000UL, 0x00002000UL, 0x00004000UL, 0x00008000UL,
729 0x00010000UL, 0x00020000UL, 0x00040000UL, 0x00080000UL, 0x00100000UL,
730 0x00200000UL, 0x00400000UL, 0x00800000UL, 0x01000000UL, 0x02000000UL,
731 0x04000000UL, 0x08000000UL
732 }
733};