47 #define POLY 0x82f63b78 57 for (
n = 0;
n < 256;
n++) {
59 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
60 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
61 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
62 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
63 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
64 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
65 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
66 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
69 for (
n = 0;
n < 256;
n++) {
71 for (
k = 1;
k < 8;
k++) {
81 static uint32_t
crc32c_sw(uint32_t crci,
const unsigned char *
buf,
size_t len) {
82 const unsigned char *
next =
buf;
86 crc = crci ^ 0xffffffff;
87 while (len && ((
const uintptr_t)
next & 7) != 0) {
103 return (uint32_t)crc ^ 0xffffffff;
106 #if defined(__x86_64__) 111 static inline uint32_t gf2_matrix_times(uint32_t *mat, uint32_t vec) {
126 static inline void gf2_matrix_square(uint32_t *
square, uint32_t *mat) {
129 for (
n = 0;
n < 32;
n++)
130 square[
n] = gf2_matrix_times(mat, mat[
n]);
138 static void crc32c_zeros_op(uint32_t *even,
size_t len) {
146 for (
n = 1;
n < 32;
n++) {
152 gf2_matrix_square(even, odd);
155 gf2_matrix_square(odd, even);
161 gf2_matrix_square(even, odd);
165 gf2_matrix_square(odd, even);
170 for (
n = 0;
n < 32;
n++)
176 static void crc32c_zeros(uint32_t zeros[][256],
size_t len) {
180 crc32c_zeros_op(
op, len);
181 for (
n = 0;
n < 256;
n++) {
182 zeros[0][
n] = gf2_matrix_times(
op,
n);
183 zeros[1][
n] = gf2_matrix_times(
op,
n << 8);
184 zeros[2][
n] = gf2_matrix_times(
op,
n << 16);
185 zeros[3][
n] = gf2_matrix_times(
op,
n << 24);
190 static inline uint32_t crc32c_shift(uint32_t zeros[][256], uint32_t crc) {
191 return zeros[0][crc & 0xff] ^ zeros[1][(crc >> 8) & 0xff] ^ zeros[2][(crc >> 16) & 0xff] ^ zeros[3][crc >> 24];
198 #define LONGx1 "8192" 199 #define LONGx2 "16384" 201 #define SHORTx1 "256" 202 #define SHORTx2 "512" 205 static pthread_once_t crc32c_once_hw = PTHREAD_ONCE_INIT;
206 static uint32_t crc32c_long[4][256];
207 static uint32_t crc32c_short[4][256];
210 static void crc32c_init_hw(
void) {
211 crc32c_zeros(crc32c_long, LONG);
212 crc32c_zeros(crc32c_short, SHORT);
216 static uint32_t crc32c_hw(uint32_t crc,
const unsigned char *
buf,
size_t len) {
217 const unsigned char *
next =
buf;
218 const unsigned char *
end;
222 pthread_once(&crc32c_once_hw, crc32c_init_hw);
225 crc0 = crc ^ 0xffffffff;
229 while (len && ((
const uintptr_t)
next & 7) != 0) {
234 :
"r"(
next),
"0"(crc0));
243 while (len >= LONG * 3) {
253 "crc32q\t" LONGx2
"(%3), %2" 254 :
"=r"(crc0),
"=r"(crc1),
"=r"(crc2)
255 :
"r"(
next),
"0"(crc0),
"1"(crc1),
"2"(crc2));
258 crc0 = crc32c_shift(crc32c_long, crc0) ^ crc1;
259 crc0 = crc32c_shift(crc32c_long, crc0) ^ crc2;
266 while (len >= SHORT * 3) {
276 "crc32q\t" SHORTx2
"(%3), %2" 277 :
"=r"(crc0),
"=r"(crc1),
"=r"(crc2)
278 :
"r"(
next),
"0"(crc0),
"1"(crc1),
"2"(crc2));
281 crc0 = crc32c_shift(crc32c_short, crc0) ^ crc1;
282 crc0 = crc32c_shift(crc32c_short, crc0) ^ crc2;
289 end =
next + (len - (len & 7));
295 :
"r"(
next),
"0"(crc0));
306 :
"r"(
next),
"0"(crc0));
312 return (uint32_t)crc0 ^ 0xffffffff;
320 #define SSE42(have) \ 324 __asm__("cpuid" : "=c"(ecx) : "a"(eax) : "%ebx", "%edx"); \ 325 (have) = (ecx >> 20) & 1; \ 328 #endif //defined(__x86_64__) 332 uint32_t
crc32c(uint32_t crc,
const unsigned char *
buf,
size_t len) {
333 #if defined(__x86_64__) 344 #if defined(__x86_64__) static pthread_once_t crc32c_once_sw
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
static uint32_t crc32c_table[8][256]
unsigned long long uint64_t
static void crc32c_init_sw(void)
static double square(double x)
static uint32_t crc32c_sw(uint32_t crci, const unsigned char *buf, size_t len)