SystemIntrospection.cmake
1 include_guard(GLOBAL) 2 3 include(CheckCXXSourceCompiles) 4 include(CMakePushCheckState) 5 cmake_push_check_state(RESET) 6 7 # Check for clmul instructions support. 8 if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 9 set(CMAKE_REQUIRED_FLAGS "-mpclmul") 10 endif() 11 check_cxx_source_compiles(" 12 #include <immintrin.h> 13 #include <stdint.h> 14 15 int main() 16 { 17 __m128i a = _mm_cvtsi64_si128((uint64_t)7); 18 __m128i b = _mm_clmulepi64_si128(a, a, 37); 19 __m128i c = _mm_srli_epi64(b, 41); 20 __m128i d = _mm_xor_si128(b, c); 21 uint64_t e = _mm_cvtsi128_si64(d); 22 return e == 0; 23 } 24 " HAVE_CLMUL 25 ) 26 if(HAVE_CLMUL) 27 set(CLMUL_CXXFLAGS ${CMAKE_REQUIRED_FLAGS}) 28 endif() 29 30 if(CMAKE_CXX_STANDARD LESS 20) 31 # Check for working clz builtins. 32 check_cxx_source_compiles(" 33 int main() 34 { 35 unsigned a = __builtin_clz(1); 36 unsigned long b = __builtin_clzl(1); 37 unsigned long long c = __builtin_clzll(1); 38 } 39 " HAVE_CLZ 40 ) 41 endif() 42 43 cmake_pop_check_state()