1+ macro (set_avx_flags)
2+ set (AVX_FLAGS)
3+
4+ include (CheckCXXSourceRuns)
5+ set (CMAKE_REQUIRED_FLAGS)
6+
7+ # AVX
8+ if (MSVC AND NOT MSVC_VERSION LESS 1600)
9+ set (CMAKE_REQUIRED_FLAGS "/arch:AVX" )
10+ elseif (UNIX OR MINGW)
11+ set (CMAKE_REQUIRED_FLAGS "-mavx" )
12+ endif ()
13+
14+ check_cxx_source_runs("
15+ #include <immintrin.h>
16+ int main()
17+ {
18+ float v[8] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
19+ float r[8];
20+ __m256 first = _mm256_loadu_ps(v);
21+ __m256 second = _mm256_setr_ps(0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f);
22+ __m256 result = _mm256_add_ps(first, second);
23+ _mm256_storeu_ps(r, result);
24+
25+ for( int i = 0; i < 8; i++)
26+ if ((i+1)*1.0f+0.5f != r[i])
27+ return -1;
28+ return 0;
29+ }"
30+ FOUND_AVX)
31+
32+ # AVX2
33+ if (MSVC AND NOT MSVC_VERSION LESS 1800)
34+ set (CMAKE_REQUIRED_FLAGS "/arch:AVX2" )
35+ elseif (UNIX OR MINGW)
36+ set (CMAKE_REQUIRED_FLAGS "-mavx2" )
37+ endif ()
38+
39+ check_cxx_source_runs("
40+ #include <immintrin.h>
41+ int main()
42+ {
43+ int v[8] = {10, 20, 30, 40, 50, 60, 70, 80};
44+ int r[8];
45+ __m256i first = _mm256_loadu_si256((__m256i*)v);
46+ __m256i second = _mm256_set_epi32(5, 5, 5, 5, 5, 5, 5, 5);
47+ __m256i result = _mm256_add_epi32(first, second);
48+ _mm256_storeu_si256((__m256i*)r, result);
49+
50+ for( int i = 0; i < 8; i++)
51+ if ((i+1)*10+5 != r[i])
52+ return -1;
53+ return 0;
54+ }"
55+ FOUND_AVX2)
56+
57+ # set compiler flags
58+ if (FOUND_AVX2)
59+ if (MSVC )
60+ set (AVX_FLAGS "/arch:AVX2" )
61+ elseif (UNIX OR MINGW)
62+ set (AVX_FLAGS "-mavx2;-mfma" )
63+ endif ()
64+ elseif (FOUND_AVX)
65+ if (MSVC )
66+ set (AVX_FLAGS "/arch:AVX" )
67+ elseif (UNIX OR MINGW)
68+ set (AVX_FLAGS "-mavx" )
69+ endif ()
70+ endif ()
71+ endmacro ()
0 commit comments