|
0
|
1 /* internal crc32 definitions */
|
|
|
2
|
|
|
3 #include "crc32.h"
|
|
|
4
|
|
|
5 #define CRC32_API __attribute__((__visibility__("default")))
|
|
|
6
|
|
|
7 /* all LUTs etc. are generated at compile time.
|
|
|
8 * eventually, I'd like to have all internal info
|
|
|
9 * stored in one opaque pointer. this pointer will
|
|
|
10 * contain the LUTs (or maybe a pointer to one).
|
|
|
11 * We could also create these structures at compile
|
|
|
12 * time and have a flag that says whether it needs
|
|
|
13 * to be destroyed or if it can be cached. */
|
|
|
14 #define CRC32_POLYNOMIAL 0xedb88320
|
|
|
15
|
|
|
16 /* crc32b.c */
|
|
|
17 #ifdef __GNUC__
|
|
|
18 # define CRC32_PURE __attribute__((__pure__))
|
|
|
19 #else
|
|
|
20 # define CRC32_PURE
|
|
|
21 #endif
|
|
|
22
|
|
|
23 #define ALIGNOF(type) offsetof(struct { type a; char b; }, b)
|
|
|
24 #define ALIGNED(ptr, alignment) (((uintptr_t)(ptr) % (alignment)) == 0)
|
|
|
25 #define ALIGNED_TYPE(ptr, type) ALIGNED(ptr, ALIGNOF(type))
|
|
|
26
|
|
|
27 typedef uint32_t (*crc32_r_spec)(uint32_t, const unsigned char *, size_t);
|
|
|
28
|
|
|
29 /* shared by crc32c and crc32qw */
|
|
|
30 extern const uint32_t crc32_tab[256];
|
|
|
31
|
|
|
32 /* Calculates crc32 by bytes. Has no alignment requirement */
|
|
|
33 uint32_t crc32c_r(uint32_t crc, const unsigned char *message, size_t sz);
|
|
|
34 /* Calculates crc32 in dwords. Requires 4-byte alignment */
|
|
|
35 uint32_t crc32qw_r(uint32_t crc, const unsigned char *message, size_t sz);
|
|
|
36 /* Calculates crc32 using intel SIMD. Requires 16-byte alignment */
|
|
|
37 uint32_t crc32x86_vpclmulqdq_r(uint32_t crc, const unsigned char *msg, size_t sz);
|
|
|
38
|
|
|
39 /* Maximum alignment value for each impl to work */
|
|
|
40 #define MAX(x, y) ((x)>(y)?(x):(y))
|
|
|
41 #define MIN(x, y) ((x)<(y)?(x):(y))
|
|
|
42 #define CRC32_MAX_ALIGNMENT MAX(16, ALIGNOF(uint32_t))
|
|
|
43
|
|
|
44 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
|
|
45
|