#include "crc32c.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>
Go to the source code of this file.
◆ LONG
◆ LONGx1
◆ LONGx2
◆ POLY
◆ SHORT
◆ SHORTx1
◆ SHORTx2
◆ crc32c()
| uint32_t crc32c |
( |
uint32_t |
crc, |
|
|
const void * |
buf, |
|
|
size_t |
len |
|
) |
| |
Definition at line 399 of file crc32c.cxx.
400{
401#if defined(HAVE_AMD64_CRC32C)
402 int sse42;
403 SSE42(sse42);
404 return sse42 ? crc32c_hw_amd64(crc, buf, len) :
crc32c_sw(crc, buf, len);
405#elif defined(HAVE_ARM64_CRC32C)
406 return crc32c_hw_arm64(crc, buf, len);
407#else
408#warning Hardware accelerated CRC32C is not available.
410#endif
411}
uint32_t crc32c_sw(uint32_t crci, const void *buf, size_t len)
◆ crc32c_hw()
| uint32_t crc32c_hw |
( |
uint32_t |
crc, |
|
|
const void * |
buf, |
|
|
size_t |
len |
|
) |
| |
Definition at line 413 of file crc32c.cxx.
414{
415#if defined(HAVE_AMD64_CRC32C)
416 return crc32c_hw_amd64(crc, buf, len);
417#elif defined(HAVE_ARM64_CRC32C)
418 return crc32c_hw_arm64(crc, buf, len);
419#else
420#warning Hardware accelerated CRC32C is not available.
421 abort();
422#endif
423}
◆ crc32c_init_sw()
| static void crc32c_init_sw |
( |
void |
| ) |
|
|
static |
Definition at line 73 of file crc32c.cxx.
74{
76
77 for (
n = 0;
n < 256;
n++) {
79 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
80 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
81 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
82 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
83 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
84 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
85 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
86 crc = crc & 1 ? (crc >> 1) ^
POLY : crc >> 1;
88 }
89 for (
n = 0;
n < 256;
n++) {
91 for (
k = 1;
k < 8;
k++) {
94 }
95 }
96}
static uint32_t crc32c_table[8][256]
◆ crc32c_shift()
| static uint32_t crc32c_shift |
( |
uint32_t |
zeros[][256], |
|
|
uint32_t |
crc |
|
) |
| |
|
inlinestatic |
Definition at line 225 of file crc32c.cxx.
226{
227 return zeros[0][crc & 0xff] ^ zeros[1][(crc >> 8) & 0xff] ^
228 zeros[2][(crc >> 16) & 0xff] ^ zeros[3][crc >> 24];
229}
◆ crc32c_sw()
| uint32_t crc32c_sw |
( |
uint32_t |
crci, |
|
|
const void * |
buf, |
|
|
size_t |
len |
|
) |
| |
Definition at line 101 of file crc32c.cxx.
102{
103 const unsigned char *next = (const unsigned char*)buf;
104 uint64_t crc;
105
106
107
109 crc = crci ^ 0xffffffff;
110 while (len && ((uintptr_t)next & 7) != 0) {
111 crc =
crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
112 len--;
113 }
114 while (len >= 8) {
115 crc ^= *(uint64_t *)next;
124 next += 8;
125 len -= 8;
126 }
127 while (len) {
128 crc =
crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
129 len--;
130 }
131 return (uint32_t)crc ^ 0xffffffff;
132}
static pthread_once_t crc32c_once_sw
static void crc32c_init_sw(void)
◆ gf2_matrix_square()
| static void gf2_matrix_square |
( |
uint32_t * |
square, |
|
|
uint32_t * |
mat |
|
) |
| |
|
inlinestatic |
Definition at line 154 of file crc32c.cxx.
155{
157
158 for (
n = 0;
n < 32;
n++)
160}
static uint32_t gf2_matrix_times(uint32_t *mat, uint32_t vec)
◆ gf2_matrix_times()
| static uint32_t gf2_matrix_times |
( |
uint32_t * |
mat, |
|
|
uint32_t |
vec |
|
) |
| |
|
inlinestatic |
Definition at line 138 of file crc32c.cxx.
139{
140 uint32_t sum;
141
142 sum = 0;
145 sum ^= *mat;
147 mat++;
148 }
149 return sum;
150}
◆ crc32c_once_sw
| pthread_once_t crc32c_once_sw = PTHREAD_ONCE_INIT |
|
static |
◆ crc32c_table
| uint32_t crc32c_table[8][256] |
|
static |