3
3
4
4
INCLUDE (CheckCXXSourceRuns )
5
5
6
- SET (FIND_AVX_10 )
7
- SET (FIND_AVX_20 )
8
- SET (AVX_FLAGS )
9
- SET (AVX_FOUND )
10
-
11
- # Check AVX 2
12
- SET (CMAKE_REQUIRED_FLAGS )
13
6
IF (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
14
- SET (CMAKE_REQUIRED_FLAGS "-mavx2" )
15
- ELSEIF (MSVC AND NOT CMAKE_CL_64 ) # reserve for WINDOWS
16
- SET (CMAKE_REQUIRED_FLAGS "/arch:AVX2" )
7
+ set (MMX_FLAG "-mmmx" )
8
+ set (SSE2_FLAG "-msse2" )
9
+ set (SSE3_FLAG "-msse3" )
10
+ SET (AVX_FLAG "-mavx" )
11
+ SET (AVX2_FLAG "-mavx2" )
12
+ ELSEIF (MSVC )
13
+ set (MMX_FLAG "/arch:MMX" )
14
+ set (SSE2_FLAG "/arch:SSE2" )
15
+ set (SSE3_FLAG "/arch:SSE3" )
16
+ SET (AVX_FLAG "/arch:AVX" )
17
+ SET (AVX2_FLAG "/arch:AVX2" )
17
18
ENDIF ()
18
19
20
+ # Check MMX
21
+ set (CMAKE_REQUIRED_FLAGS ${MMX_FLAG} )
19
22
CHECK_CXX_SOURCE_RUNS ("
20
- #include <immintrin .h>
23
+ #include <mmintrin .h>
21
24
int main()
22
25
{
23
- __m256i a = _mm256_set_epi32 (-1, 2, -3, 4, -1, 2, -3, 4);
24
- __m256i result = _mm256_abs_epi32 (a);
26
+ _mm_setzero_si64();
25
27
return 0;
26
- }" FIND_AVX_20 )
28
+ }" MMX_FOUND )
27
29
28
- # Check AVX
29
- SET (CMAKE_REQUIRED_FLAGS )
30
- IF (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
31
- SET (CMAKE_REQUIRED_FLAGS "-mavx" )
32
- ELSEIF (MSVC AND NOT CMAKE_CL_64 )
33
- SET (CMAKE_REQUIRED_FLAGS "/arch:AVX" )
34
- endif ()
30
+ # Check SSE2
31
+ set (CMAKE_REQUIRED_FLAGS ${SSE2_FLAG} )
32
+ CHECK_CXX_SOURCE_RUNS ("
33
+ #include <emmintrin.h>
34
+ int main()
35
+ {
36
+ _mm_setzero_si128();
37
+ return 0;
38
+ }" SSE2_FOUND )
35
39
40
+ # Check SSE3
41
+ set (CMAKE_REQUIRED_FLAGS ${SSE3_FLAG} )
42
+ CHECK_CXX_SOURCE_RUNS ("
43
+ #include <pmmintrin.h>
44
+ int main()
45
+ {
46
+ __m128d a = _mm_set1_pd(6.28);
47
+ __m128d b = _mm_set1_pd(3.14);
48
+ __m128d result = _mm_addsub_pd(a, b);
49
+ result = _mm_movedup_pd(result);
50
+ return 0;
51
+ }" SSE3_FOUND )
52
+
53
+ # Check AVX
54
+ set (CMAKE_REQUIRED_FLAGS ${AVX_FLAG} )
36
55
CHECK_CXX_SOURCE_RUNS ("
37
56
#include <immintrin.h>
38
57
int main()
@@ -41,25 +60,17 @@ int main()
41
60
__m256 b = _mm256_set_ps (1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f);
42
61
__m256 result = _mm256_add_ps (a, b);
43
62
return 0;
44
- }" FIND_AVX_10 )
45
-
46
- IF (${FIND_AVX_20} )
47
- IF (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
48
- SET (AVX_FLAGS "${AVX_FLAGS} -mavx2" )
49
- ELSEIF (MSVC )
50
- SET (AVX_FLAGS "${AVX_FLAGS} /arch:AVX2" )
51
- ENDIF ()
52
- ENDIF ()
63
+ }" AVX_FOUND )
53
64
54
- IF (${FIND_AVX_10} )
55
- IF (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
56
- SET (AVX_FLAGS "${AVX_FLAGS} -mavx" )
57
- ELSEIF (MSVC )
58
- SET (AVX_FLAGS "${AVX_FLAGS} /arch:AVX" )
59
- ENDIF ()
60
- ENDIF ()
65
+ # Check AVX 2
66
+ set (CMAKE_REQUIRED_FLAGS ${AVX2_FLAG} )
67
+ CHECK_CXX_SOURCE_RUNS ("
68
+ #include <immintrin.h>
69
+ int main()
70
+ {
71
+ __m256i a = _mm256_set_epi32 (-1, 2, -3, 4, -1, 2, -3, 4);
72
+ __m256i result = _mm256_abs_epi32 (a);
73
+ return 0;
74
+ }" AVX2_FOUND )
61
75
62
- IF (${FIND_AVX_10} )
63
- SET (AVX_FOUND TRUE )
64
- MESSAGE (STATUS "Find CPU supports ${AVX_FLAGS} ." )
65
- ENDIF ()
76
+ mark_as_advanced (MMX_FOUND SSE2_FOUND SSE3_FOUND AVX_FOUND AVX2_FOUND )
0 commit comments