diff --git a/util/crc32c.cc b/util/crc32c.cc index 04312d6f6..50178ae71 100644 --- a/util/crc32c.cc +++ b/util/crc32c.cc @@ -334,19 +334,8 @@ static bool isSSE42() { #endif } -typedef void (*Function)(uint64_t*, uint8_t const**); - -static inline Function Choose_CRC32() { - return isSSE42() ? Fast_CRC32 : Slow_CRC32; -} - -static Function func = Choose_CRC32(); - -static inline void CRC32(uint64_t* l, uint8_t const **p) { - func(l, p); -} - -uint32_t Extend(uint32_t crc, const char* buf, size_t size) { +template +uint32_t ExtendImpl(uint32_t crc, const char* buf, size_t size) { const uint8_t *p = reinterpret_cast(buf); const uint8_t *e = p + size; uint64_t l = crc ^ 0xffffffffu; @@ -388,5 +377,17 @@ uint32_t Extend(uint32_t crc, const char* buf, size_t size) { return l ^ 0xffffffffu; } +typedef uint32_t (*Function)(uint32_t, const char*, size_t); + +static inline Function Choose_Extend() { + return isSSE42() ? ExtendImpl : ExtendImpl; +} + +Function ChosenExtend = Choose_Extend(); + +uint32_t Extend(uint32_t crc, const char* buf, size_t size) { + return ChosenExtend(crc, buf, size); +} + } // namespace crc32c } // namespace rocksdb