|
|
|
@ -101,11 +101,41 @@ |
|
|
|
|
/* Local functions. */ |
|
|
|
|
local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); |
|
|
|
|
local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); |
|
|
|
|
#ifdef W |
|
|
|
|
local z_word_t byte_swap OF((z_word_t word)); |
|
|
|
|
local z_crc_t crc_word OF((z_word_t data)); |
|
|
|
|
local z_word_t crc_word_big OF((z_word_t data)); |
|
|
|
|
#endif /* W */ |
|
|
|
|
|
|
|
|
|
/* If available, use the ARM processor CRC32 instruction. */ |
|
|
|
|
#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 |
|
|
|
|
# define ARMCRC32 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) |
|
|
|
|
/*
|
|
|
|
|
Swap the bytes in a z_word_t to convert between little and big endian. Any |
|
|
|
|
self-respecting compiler will optimize this to a single machine byte-swap |
|
|
|
|
instruction, if one is available. This assumes that word_t is either 32 bits |
|
|
|
|
or 64 bits. |
|
|
|
|
*/ |
|
|
|
|
local z_word_t byte_swap(word) |
|
|
|
|
z_word_t word; |
|
|
|
|
{ |
|
|
|
|
# if W == 8 |
|
|
|
|
return |
|
|
|
|
(word & 0xff00000000000000) >> 56 | |
|
|
|
|
(word & 0xff000000000000) >> 40 | |
|
|
|
|
(word & 0xff0000000000) >> 24 | |
|
|
|
|
(word & 0xff00000000) >> 8 | |
|
|
|
|
(word & 0xff000000) << 8 | |
|
|
|
|
(word & 0xff0000) << 24 | |
|
|
|
|
(word & 0xff00) << 40 | |
|
|
|
|
(word & 0xff) << 56; |
|
|
|
|
# else /* W == 4 */ |
|
|
|
|
return |
|
|
|
|
(word & 0xff000000) >> 24 | |
|
|
|
|
(word & 0xff0000) >> 8 | |
|
|
|
|
(word & 0xff00) << 8 | |
|
|
|
|
(word & 0xff) << 24; |
|
|
|
|
# endif |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* CRC polynomial. */ |
|
|
|
|
#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ |
|
|
|
@ -549,62 +579,6 @@ local z_crc_t x2nmodp(n, k) |
|
|
|
|
return p; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef W |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Swap the bytes in a z_word_t to convert between little and big endian. Any |
|
|
|
|
self-respecting compiler will optimize this to a single machine byte-swap |
|
|
|
|
instruction, if one is available. This assumes that word_t is either 32 bits |
|
|
|
|
or 64 bits. |
|
|
|
|
*/ |
|
|
|
|
local z_word_t byte_swap(word) |
|
|
|
|
z_word_t word; |
|
|
|
|
{ |
|
|
|
|
#if W == 8 |
|
|
|
|
return |
|
|
|
|
(word & 0xff00000000000000) >> 56 | |
|
|
|
|
(word & 0xff000000000000) >> 40 | |
|
|
|
|
(word & 0xff0000000000) >> 24 | |
|
|
|
|
(word & 0xff00000000) >> 8 | |
|
|
|
|
(word & 0xff000000) << 8 | |
|
|
|
|
(word & 0xff0000) << 24 | |
|
|
|
|
(word & 0xff00) << 40 | |
|
|
|
|
(word & 0xff) << 56; |
|
|
|
|
#else /* W == 4 */ |
|
|
|
|
return |
|
|
|
|
(word & 0xff000000) >> 24 | |
|
|
|
|
(word & 0xff0000) >> 8 | |
|
|
|
|
(word & 0xff00) << 8 | |
|
|
|
|
(word & 0xff) << 24; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Return the CRC of the W bytes in the word_t data, taking the |
|
|
|
|
least-significant byte of the word as the first byte of data, without any pre |
|
|
|
|
or post conditioning. This is used to combine the CRCs of each braid. |
|
|
|
|
*/ |
|
|
|
|
local z_crc_t crc_word(data) |
|
|
|
|
z_word_t data; |
|
|
|
|
{ |
|
|
|
|
int k; |
|
|
|
|
for (k = 0; k < W; k++) |
|
|
|
|
data = (data >> 8) ^ crc_table[data & 0xff]; |
|
|
|
|
return (z_crc_t)data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
local z_word_t crc_word_big(data) |
|
|
|
|
z_word_t data; |
|
|
|
|
{ |
|
|
|
|
int k; |
|
|
|
|
for (k = 0; k < W; k++) |
|
|
|
|
data = (data << 8) ^ |
|
|
|
|
crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; |
|
|
|
|
return data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* W */ |
|
|
|
|
|
|
|
|
|
/* =========================================================================
|
|
|
|
|
* This function can be used by asm versions of crc32(), and to force the |
|
|
|
|
* generation of the CRC tables in a threaded application. |
|
|
|
@ -626,7 +600,7 @@ const z_crc_t FAR * ZEXPORT get_crc_table() |
|
|
|
|
* -march=armv8-a+crc, or -march=native if the compile machine has the crc32 |
|
|
|
|
* instructions. |
|
|
|
|
*/ |
|
|
|
|
#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 |
|
|
|
|
#ifdef ARMCRC32 |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Constants empirically determined to maximize speed. These values are from |
|
|
|
@ -733,6 +707,34 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
#ifdef W |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Return the CRC of the W bytes in the word_t data, taking the |
|
|
|
|
least-significant byte of the word as the first byte of data, without any pre |
|
|
|
|
or post conditioning. This is used to combine the CRCs of each braid. |
|
|
|
|
*/ |
|
|
|
|
local z_crc_t crc_word(data) |
|
|
|
|
z_word_t data; |
|
|
|
|
{ |
|
|
|
|
int k; |
|
|
|
|
for (k = 0; k < W; k++) |
|
|
|
|
data = (data >> 8) ^ crc_table[data & 0xff]; |
|
|
|
|
return (z_crc_t)data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
local z_word_t crc_word_big(data) |
|
|
|
|
z_word_t data; |
|
|
|
|
{ |
|
|
|
|
int k; |
|
|
|
|
for (k = 0; k < W; k++) |
|
|
|
|
data = (data << 8) ^ |
|
|
|
|
crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; |
|
|
|
|
return data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* ========================================================================= */ |
|
|
|
|
unsigned long ZEXPORT crc32_z(crc, buf, len) |
|
|
|
|
unsigned long crc; |
|
|
|
|