/ src / minisketch / cmake / SystemIntrospection.cmake
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()