blob: 64ce9f04adc89af73db86a37cb47dc266b1ec170 [file] [log] [blame]
Johannes2ffb2362022-08-01 23:52:48 +00001INCLUDE(CheckCSourceRuns)
2INCLUDE(CheckCXXSourceRuns)
Christian Puhrschf5641632018-10-09 10:46:50 -07003
4SET(AVX_CODE "
5 #include <immintrin.h>
6
7 int main()
8 {
9 __m256 a;
10 a = _mm256_set1_ps(0);
11 return 0;
12 }
13")
14
imaginary-person9e53c822021-07-22 08:49:55 -070015SET(AVX512_CODE "
16 #include <immintrin.h>
17
18 int main()
19 {
20 __m512i a = _mm512_set_epi8(0, 0, 0, 0, 0, 0, 0, 0,
21 0, 0, 0, 0, 0, 0, 0, 0,
22 0, 0, 0, 0, 0, 0, 0, 0,
23 0, 0, 0, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0, 0, 0,
27 0, 0, 0, 0, 0, 0, 0, 0);
28 __m512i b = a;
29 __mmask64 equality_mask = _mm512_cmp_epi8_mask(a, b, _MM_CMPINT_EQ);
30 return 0;
31 }
32")
33
Christian Puhrschf5641632018-10-09 10:46:50 -070034SET(AVX2_CODE "
35 #include <immintrin.h>
36
37 int main()
38 {
39 __m256i a = {0};
40 a = _mm256_abs_epi16(a);
Balint Cristian67fdb4a2019-04-07 08:23:10 -070041 __m256i x;
Thomas Viehmann13bc0022019-03-13 03:44:16 -070042 _mm256_extract_epi64(x, 0); // we rely on this in our AVX2 code
Christian Puhrschf5641632018-10-09 10:46:50 -070043 return 0;
44 }
45")
46
47MACRO(CHECK_SSE lang type flags)
48 SET(__FLAG_I 1)
49 SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
50 FOREACH(__FLAG ${flags})
51 IF(NOT ${lang}_${type}_FOUND)
52 SET(CMAKE_REQUIRED_FLAGS ${__FLAG})
53 IF(lang STREQUAL "CXX")
Johannes2ffb2362022-08-01 23:52:48 +000054 CHECK_CXX_SOURCE_RUNS("${${type}_CODE}" ${lang}_HAS_${type}_${__FLAG_I})
Christian Puhrschf5641632018-10-09 10:46:50 -070055 ELSE()
Johannes2ffb2362022-08-01 23:52:48 +000056 CHECK_C_SOURCE_RUNS("${${type}_CODE}" ${lang}_HAS_${type}_${__FLAG_I})
Christian Puhrschf5641632018-10-09 10:46:50 -070057 ENDIF()
58 IF(${lang}_HAS_${type}_${__FLAG_I})
59 SET(${lang}_${type}_FOUND TRUE CACHE BOOL "${lang} ${type} support")
60 SET(${lang}_${type}_FLAGS "${__FLAG}" CACHE STRING "${lang} ${type} flags")
61 ENDIF()
62 MATH(EXPR __FLAG_I "${__FLAG_I}+1")
63 ENDIF()
64 ENDFOREACH()
65 SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
66
67 IF(NOT ${lang}_${type}_FOUND)
68 SET(${lang}_${type}_FOUND FALSE CACHE BOOL "${lang} ${type} support")
69 SET(${lang}_${type}_FLAGS "" CACHE STRING "${lang} ${type} flags")
70 ENDIF()
71
72 MARK_AS_ADVANCED(${lang}_${type}_FOUND ${lang}_${type}_FLAGS)
73
74ENDMACRO()
75
76CHECK_SSE(C "AVX" " ;-mavx;/arch:AVX")
mingfeimaced5c892023-04-02 17:39:35 +080077CHECK_SSE(C "AVX2" " ;-mavx2 -mfma -mf16c;/arch:AVX2")
imaginary-person9e53c822021-07-22 08:49:55 -070078CHECK_SSE(C "AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512")
Christian Puhrschf5641632018-10-09 10:46:50 -070079
80CHECK_SSE(CXX "AVX" " ;-mavx;/arch:AVX")
mingfeimaced5c892023-04-02 17:39:35 +080081CHECK_SSE(CXX "AVX2" " ;-mavx2 -mfma -mf16c;/arch:AVX2")
imaginary-person9e53c822021-07-22 08:49:55 -070082CHECK_SSE(CXX "AVX512" " ;-mavx512f -mavx512dq -mavx512vl -mavx512bw -mfma;/arch:AVX512")