//===-- scudo_crc32.cpp -----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// CRC32 function leveraging hardware specific instructions. This has to be /// kept separated to restrict the use of compiler specific flags to this file. /// //===----------------------------------------------------------------------===// // Hardware CRC32 is supported at compilation via the following: // - for i386 & x86_64: -msse4.2 // - for ARM & AArch64: -march=armv8-a+crc or -mcrc // An additional check must be performed at runtime as well to make sure the // emitted instructions are valid on the target host. #include "scudo_crc32.h" #include "scudo_utils.h" #if defined(__SSE4_2__) || defined(__ARM_FEATURE_CRC32) # ifdef __SSE4_2__ # include # define CRC32_INTRINSIC FIRST_32_SECOND_64(_mm_crc32_u32, _mm_crc32_u64) # endif # ifdef __ARM_FEATURE_CRC32 # include # define CRC32_INTRINSIC FIRST_32_SECOND_64(__crc32cw, __crc32cd) # endif #endif // defined(__SSE4_2__) || defined(__ARM_FEATURE_CRC32) namespace __scudo { #if defined(__SSE4_2__) || defined(__ARM_FEATURE_CRC32) INLINE u32 computeHardwareCRC32(u32 Crc, uptr Data) { return CRC32_INTRINSIC(Crc, Data); } u32 computeCRC32(u32 Crc, uptr Data, u8 HashType) { if (HashType == CRC32Hardware) { return computeHardwareCRC32(Crc, Data); } return computeSoftwareCRC32(Crc, Data); } #else u32 computeCRC32(u32 Crc, uptr Data, u8 HashType) { return computeSoftwareCRC32(Crc, Data); } #endif // defined(__SSE4_2__) || defined(__ARM_FEATURE_CRC32) } // namespace __scudo