summaryrefslogtreecommitdiffstats
path: root/cmake/modules/FindSSE.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/modules/FindSSE.cmake')
-rw-r--r--cmake/modules/FindSSE.cmake156
1 files changed, 156 insertions, 0 deletions
diff --git a/cmake/modules/FindSSE.cmake b/cmake/modules/FindSSE.cmake
new file mode 100644
index 0000000..d001b03
--- /dev/null
+++ b/cmake/modules/FindSSE.cmake
@@ -0,0 +1,156 @@
1# Check if SSE instructions are available on the machine where
2# the project is compiled.
3include(TestCXXAcceptsFlag)
4
5if(CMAKE_SYSTEM_NAME MATCHES "Linux")
6 if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
7 exec_program(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)
8
9 string(REGEX REPLACE "^.*(sse).*$" "\\1" _SSE_THERE ${CPUINFO})
10 string(COMPARE EQUAL "sse" "${_SSE_THERE}" _SSE_TRUE)
11 CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
12
13 string(REGEX REPLACE "^.*(sse2).*$" "\\1" _SSE_THERE ${CPUINFO})
14 string(COMPARE EQUAL "sse2" "${_SSE_THERE}" _SSE2_TRUE)
15 CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
16
17 # SSE3 is also known as the Prescott New Instructions (PNI)
18 # it's labeled as pni in /proc/cpuinfo
19 string(REGEX REPLACE "^.*(pni).*$" "\\1" _SSE_THERE ${CPUINFO})
20 string(COMPARE EQUAL "pni" "${_SSE_THERE}" _SSE3_TRUE)
21 CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
22
23 string(REGEX REPLACE "^.*(ssse3).*$" "\\1" _SSE_THERE ${CPUINFO})
24 string(COMPARE EQUAL "ssse3" "${_SSE_THERE}" _SSSE3_TRUE)
25 CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
26
27 string(REGEX REPLACE "^.*(sse4_1).*$" "\\1" _SSE_THERE ${CPUINFO})
28 string(COMPARE EQUAL "sse4_1" "${_SSE_THERE}" _SSE41_TRUE)
29 CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
30
31 string(REGEX REPLACE "^.*(sse4_2).*$" "\\1" _SSE_THERE ${CPUINFO})
32 string(COMPARE EQUAL "sse4_2" "${_SSE_THERE}" _SSE42_TRUE)
33 CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
34
35 string(REGEX REPLACE "^.*(avx).*$" "\\1" _SSE_THERE ${CPUINFO})
36 string(COMPARE EQUAL "avx" "${_SSE_THERE}" _AVX_TRUE)
37 CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
38
39 string(REGEX REPLACE "^.*(avx2).*$" "\\1" _SSE_THERE ${CPUINFO})
40 string(COMPARE EQUAL "avx2" "${_SSE_THERE}" _AVX2_TRUE)
41 CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
42 endif()
43elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
44 if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
45 set(_SSE_TRUE TRUE)
46 set(_SSE2_TRUE TRUE)
47 set(_SSE3_TRUE TRUE)
48 set(_SSSE3_TRUE TRUE)
49
50 CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
51 CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
52 CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
53 CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
54 CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
55 CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
56 CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
57 CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
58 endif()
59elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
60 if(NOT CPU MATCHES "arm")
61 exec_program("/usr/sbin/sysctl -n machdep.cpu.features machdep.cpu.leaf7_features" OUTPUT_VARIABLE CPUINFO)
62
63 string(REGEX REPLACE "^.*[^S](SSE).*$" "\\1" _SSE_THERE ${CPUINFO})
64 string(COMPARE EQUAL "SSE" "${_SSE_THERE}" _SSE_TRUE)
65 CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
66
67 string(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" _SSE_THERE ${CPUINFO})
68 string(COMPARE EQUAL "SSE2" "${_SSE_THERE}" _SSE2_TRUE)
69 CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
70
71 string(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
72 string(COMPARE EQUAL "SSE3" "${_SSE_THERE}" _SSE3_TRUE)
73 CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
74
75 string(REGEX REPLACE "^.*(SSSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
76 string(COMPARE EQUAL "SSSE3" "${_SSE_THERE}" _SSSE3_TRUE)
77 CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
78
79 string(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" _SSE_THERE ${CPUINFO})
80 string(COMPARE EQUAL "SSE4.1" "${_SSE_THERE}" _SSE41_TRUE)
81 CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
82
83 string(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" _SSE_THERE ${CPUINFO})
84 string(COMPARE EQUAL "SSE4.2" "${_SSE_THERE}" _SSE42_TRUE)
85 CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
86
87 string(REGEX REPLACE "^.*(AVX).*$" "\\1" _SSE_THERE ${CPUINFO})
88 string(COMPARE EQUAL "AVX" "${_SSE_THERE}" _AVX_TRUE)
89 CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
90
91 string(REGEX REPLACE "^.*(AVX2).*$" "\\1" _SSE_THERE ${CPUINFO})
92 string(COMPARE EQUAL "AVX2" "${_SSE_THERE}" _AVX2_TRUE)
93 CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
94 endif()
95elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
96 # TODO
97 set(_SSE_TRUE true)
98 set(_SSE_OK true)
99 set(_SSE2_TRUE true)
100 set(_SSE2_OK true)
101endif()
102
103include(FindPackageHandleStandardArgs)
104find_package_handle_standard_args(SSE
105 REQUIRED_VARS _SSE_TRUE _SSE_OK
106 FAIL_MESSAGE "Could not find hardware support for SSE")
107find_package_handle_standard_args(SSE2
108 REQUIRED_VARS _SSE2_TRUE _SSE2_OK
109 FAIL_MESSAGE "Could not find hardware support for SSE2")
110find_package_handle_standard_args(SSE3
111 REQUIRED_VARS _SSE3_TRUE _SSE3_OK
112 FAIL_MESSAGE "Could not find hardware support for SSE3")
113find_package_handle_standard_args(SSSE3
114 REQUIRED_VARS _SSSE3_TRUE _SSSE3_OK
115 FAIL_MESSAGE "Could not find hardware support for SSSE3")
116find_package_handle_standard_args(SSE4_1
117 REQUIRED_VARS _SSE41_TRUE _SSE41_OK
118 FAIL_MESSAGE "Could not find hardware support for SSE4.1")
119find_package_handle_standard_args(SSE4_2
120 REQUIRED_VARS _SSE42_TRUE _SSE42_OK
121 FAIL_MESSAGE "Could not find hardware support for SSE4.2")
122find_package_handle_standard_args(AVX
123 REQUIRED_VARS _AVX_TRUE _AVX_OK
124 FAIL_MESSAGE "Could not find hardware support for AVX")
125find_package_handle_standard_args(AVX2
126 REQUIRED_VARS _AVX2_TRUE _AVX2_OK
127 FAIL_MESSAGE "Could not find hardware support for AVX2")
128
129mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND AVX_FOUND AVX2_FOUND)
130
131unset(_SSE_THERE)
132unset(_SSE_TRUE)
133unset(_SSE_OK)
134unset(_SSE_OK CACHE)
135unset(_SSE2_TRUE)
136unset(_SSE2_OK)
137unset(_SSE2_OK CACHE)
138unset(_SSE3_TRUE)
139unset(_SSE3_OK)
140unset(_SSE3_OK CACHE)
141unset(_SSSE3_TRUE)
142unset(_SSSE3_OK)
143unset(_SSSE3_OK CACHE)
144unset(_SSE4_1_TRUE)
145unset(_SSE41_OK)
146unset(_SSE41_OK CACHE)
147unset(_SSE4_2_TRUE)
148unset(_SSE42_OK)
149unset(_SSE42_OK CACHE)
150unset(_AVX_TRUE)
151unset(_AVX_OK)
152unset(_AVX_OK CACHE)
153unset(_AVX2_TRUE)
154unset(_AVX2_OK)
155unset(_AVX2_OK CACHE)
156