18 #include <boost/crc.hpp> 24 #if FOLLY_SSE_PREREQ(4, 2) 25 #include <emmintrin.h> 26 #include <nmmintrin.h> 35 #if FOLLY_SSE_PREREQ(4, 2) 47 if ((uintptr_t)data & 15) {
48 size_t limit =
std::min(nbytes, -(uintptr_t)data & 15);
55 sum = crc32_hw_aligned(sum, (
const __m128i*)(data + offset), nbytes / 16);
56 offset += nbytes & ~15;
61 return crc32_sw(data + offset, nbytes, sum);
80 throw std::runtime_error(
"crc32_hw is not implemented on this platform");
92 template <u
int32_t CRC_POLYNOMIAL>
98 startingChecksum = ((startingChecksum >> 1) & 0x55555555) |
99 ((startingChecksum & 0x55555555) << 1);
100 startingChecksum = ((startingChecksum >> 2) & 0x33333333) |
101 ((startingChecksum & 0x33333333) << 2);
102 startingChecksum = ((startingChecksum >> 4) & 0x0f0f0f0f) |
103 ((startingChecksum & 0x0f0f0f0f) << 4);
104 startingChecksum = ((startingChecksum >> 8) & 0x00ff00ff) |
105 ((startingChecksum & 0x00ff00ff) << 8);
106 startingChecksum = (startingChecksum >> 16) | (startingChecksum << 16);
108 boost::crc_optimal<32, CRC_POLYNOMIAL, ~0U, 0, true, true>
sum(
110 sum.process_bytes(data, nbytes);
111 return sum.checksum();
116 constexpr
uint32_t CRC32C_POLYNOMIAL = 0x1EDC6F41;
117 return crc_sw<CRC32C_POLYNOMIAL>(
data, nbytes, startingChecksum);
122 constexpr
uint32_t CRC32_POLYNOMIAL = 0x04C11DB7;
123 return crc_sw<CRC32_POLYNOMIAL>(
data, nbytes, startingChecksum);
146 return ~
crc32(data, nbytes, startingChecksum);
151 uint8_t data[4] = {0, 0, 0, 0};
152 auto len = crc2len & 3;
154 crc1 =
crc32(data, len, crc1);
166 uint8_t data[4] = {0, 0, 0, 0};
167 auto len = crc2len & 3;
169 crc1 =
crc32c(data, len, crc1);
uint32_t crc32_type(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
std::atomic< int64_t > sum(0)
uint32_t crc32c(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
uint32_t crc32_combine_hw(uint32_t crc1, uint32_t crc2, size_t crc2len)
uint32_t crc32_sw(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
—— Concurrent Priority Queue Implementation ——
uint32_t crc32c_combine_hw(uint32_t crc1, uint32_t crc2, size_t crc2len)
uint32_t crc32_combine_sw(uint32_t crc1, uint32_t crc2, size_t crc2len)
uint32_t crc32(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
uint32_t crc32c_combine_sw(uint32_t crc1, uint32_t crc2, size_t crc2len)
uint32_t crc32c_hw(const uint8_t *data, size_t nbytes, uint32_t startingChecksum=~0U)
constexpr auto data(C &c) -> decltype(c.data())
bool crc32_hw_supported()
FOLLY_ALWAYS_INLINE bool sse42() const
uint32_t crc32c_sw(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
uint32_t crc32c_combine(uint32_t crc1, uint32_t crc2, size_t crc2len)
uint32_t crc_sw(const uint8_t *data, size_t nbytes, uint32_t startingChecksum)
uint32_t crc32_hw(const uint8_t *, size_t, uint32_t)
uint32_t crc32_combine(uint32_t crc1, uint32_t crc2, size_t crc2len)
bool crc32c_hw_supported()