include_guard(GLOBAL) include(CheckCXXSourceCompiles) include(CMakePushCheckState) cmake_push_check_state(RESET) # Check for clmul instructions support. if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(CMAKE_REQUIRED_FLAGS "-mpclmul") endif() check_cxx_source_compiles(" #include #include int main() { __m128i a = _mm_cvtsi64_si128((uint64_t)7); __m128i b = _mm_clmulepi64_si128(a, a, 37); __m128i c = _mm_srli_epi64(b, 41); __m128i d = _mm_xor_si128(b, c); uint64_t e = _mm_cvtsi128_si64(d); return e == 0; } " HAVE_CLMUL ) if(HAVE_CLMUL) set(CLMUL_CXXFLAGS ${CMAKE_REQUIRED_FLAGS}) endif() if(CMAKE_CXX_STANDARD LESS 20) # Check for working clz builtins. check_cxx_source_compiles(" int main() { unsigned a = __builtin_clz(1); unsigned long b = __builtin_clzl(1); unsigned long long c = __builtin_clzll(1); } " HAVE_CLZ ) endif() cmake_pop_check_state()