Merge pull request #23092 from webosbrew/feature/webOS
[xbmc.git] / cmake / modules / FindSSE.cmake
blobd9d5c7af089ee135a2fce22c2a098a189371411a
1 # Check if SSE instructions are available on the machine where
2 # the project is compiled.
3 include(TestCXXAcceptsFlag)
5 if(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)
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)
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)
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)
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)
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)
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)
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)
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()
43 elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
44    if(CPU MATCHES "amd64" OR CPU MATCHES "i.86")
45      exec_program(cat ARGS "/var/run/dmesg.boot | grep Features" OUTPUT_VARIABLE CPUINFO)
47      string(REGEX REPLACE "^.*(SSE).*$" "\\1" _SSE_THERE ${CPUINFO})
48      string(COMPARE EQUAL "SSE" "${_SSE_THERE}" _SSE_TRUE)
49      CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
51      string(REGEX REPLACE "^.*(SSE2).*$" "\\1" _SSE_THERE ${CPUINFO})
52      string(COMPARE EQUAL "SSE2" "${_SSE_THERE}" _SSE2_TRUE)
53      CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
55      string(REGEX REPLACE "^.*(SSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
56      string(COMPARE EQUAL "SSE3" "${_SSE_THERE}" _SSE3_TRUE)
57      CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
59      string(REGEX REPLACE "^.*(SSSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
60      string(COMPARE EQUAL "SSSE3" "${_SSE_THERE}" _SSSE3_TRUE)
61      CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
63      string(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" _SSE_THERE ${CPUINFO})
64      string(COMPARE EQUAL "SSE4.1" "${_SSE_THERE}" _SSE41_TRUE)
65      CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
66      string(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" _SSE_THERE ${CPUINFO})
67      string(COMPARE EQUAL "SSE4.2" "${_SSE_THERE}" _SSE42_TRUE)
68      CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
70      string(REGEX REPLACE "^.*(AVX).*$" "\\1" _SSE_THERE ${CPUINFO})
71      string(COMPARE EQUAL "AVX" "${_SSE_THERE}" _AVX_TRUE)
72      CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
74      string(REGEX REPLACE "^.*(AVX2).*$" "\\1" _SSE_THERE ${CPUINFO})
75      string(COMPARE EQUAL "AVX2" "${_SSE_THERE}" _AVX2_TRUE)
76      CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
77    endif()
78 elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
79   if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
80     set(_SSE_TRUE TRUE)
81     set(_SSE2_TRUE TRUE)
82     set(_SSE3_TRUE TRUE)
83     set(_SSSE3_TRUE TRUE)
85     CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
86     CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
87     CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
88     CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
89     CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
90     CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
91     CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
92     CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
93    endif()
94 elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
95    if(NOT CPU MATCHES "arm")
96       exec_program("/usr/sbin/sysctl -n machdep.cpu.features machdep.cpu.leaf7_features" OUTPUT_VARIABLE CPUINFO)
98       string(REGEX REPLACE "^.*[^S](SSE).*$" "\\1" _SSE_THERE ${CPUINFO})
99       string(COMPARE EQUAL "SSE" "${_SSE_THERE}" _SSE_TRUE)
100       CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
102       string(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" _SSE_THERE ${CPUINFO})
103       string(COMPARE EQUAL "SSE2" "${_SSE_THERE}" _SSE2_TRUE)
104       CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
106       string(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
107       string(COMPARE EQUAL "SSE3" "${_SSE_THERE}" _SSE3_TRUE)
108       CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
110       string(REGEX REPLACE "^.*(SSSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
111       string(COMPARE EQUAL "SSSE3" "${_SSE_THERE}" _SSSE3_TRUE)
112       CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
114       string(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" _SSE_THERE ${CPUINFO})
115       string(COMPARE EQUAL "SSE4.1" "${_SSE_THERE}" _SSE41_TRUE)
116       CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
118       string(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" _SSE_THERE ${CPUINFO})
119       string(COMPARE EQUAL "SSE4.2" "${_SSE_THERE}" _SSE42_TRUE)
120       CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
122       string(REGEX REPLACE "^.*(AVX).*$" "\\1" _SSE_THERE ${CPUINFO})
123       string(COMPARE EQUAL "AVX" "${_SSE_THERE}" _AVX_TRUE)
124       CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
126       string(REGEX REPLACE "^.*(AVX2).*$" "\\1" _SSE_THERE ${CPUINFO})
127       string(COMPARE EQUAL "AVX2" "${_SSE_THERE}" _AVX2_TRUE)
128       CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
129    endif()
130 elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
131    # TODO
132    if(ARCH STREQUAL win32 OR ARCH STREQUAL x64)
133       set(_SSE_TRUE true)
134       set(_SSE_OK   true)
135       set(_SSE2_TRUE true)
136       set(_SSE2_OK   true)
137    endif()
138 endif()
140 include(FindPackageHandleStandardArgs)
141 find_package_handle_standard_args(SSE
142                                   REQUIRED_VARS _SSE_TRUE _SSE_OK
143                                   FAIL_MESSAGE "Could not find hardware support for SSE")
144 set(FPHSA_NAME_MISMATCHED ON)
145 find_package_handle_standard_args(SSE2
146                                   REQUIRED_VARS _SSE2_TRUE _SSE2_OK
147                                   FAIL_MESSAGE "Could not find hardware support for SSE2")
148 find_package_handle_standard_args(SSE3
149                                   REQUIRED_VARS _SSE3_TRUE _SSE3_OK
150                                   FAIL_MESSAGE "Could not find hardware support for SSE3")
151 find_package_handle_standard_args(SSSE3
152                                   REQUIRED_VARS _SSSE3_TRUE _SSSE3_OK
153                                   FAIL_MESSAGE "Could not find hardware support for SSSE3")
154 find_package_handle_standard_args(SSE4_1
155                                   REQUIRED_VARS _SSE41_TRUE _SSE41_OK
156                                   FAIL_MESSAGE "Could not find hardware support for SSE4.1")
157 find_package_handle_standard_args(SSE4_2
158                                   REQUIRED_VARS _SSE42_TRUE _SSE42_OK
159                                   FAIL_MESSAGE "Could not find hardware support for SSE4.2")
160 find_package_handle_standard_args(AVX
161                                   REQUIRED_VARS _AVX_TRUE _AVX_OK
162                                   FAIL_MESSAGE "Could not find hardware support for AVX")
163 find_package_handle_standard_args(AVX2
164                                   REQUIRED_VARS _AVX2_TRUE _AVX2_OK
165                                   FAIL_MESSAGE "Could not find hardware support for AVX2")
166 unset(FPHSA_NAME_MISMATCHED)
168 mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND AVX_FOUND AVX2_FOUND)
170 unset(_SSE_THERE)
171 unset(_SSE_TRUE)
172 unset(_SSE_OK)
173 unset(_SSE_OK CACHE)
174 unset(_SSE2_TRUE)
175 unset(_SSE2_OK)
176 unset(_SSE2_OK CACHE)
177 unset(_SSE3_TRUE)
178 unset(_SSE3_OK)
179 unset(_SSE3_OK CACHE)
180 unset(_SSSE3_TRUE)
181 unset(_SSSE3_OK)
182 unset(_SSSE3_OK CACHE)
183 unset(_SSE4_1_TRUE)
184 unset(_SSE41_OK)
185 unset(_SSE41_OK CACHE)
186 unset(_SSE4_2_TRUE)
187 unset(_SSE42_OK)
188 unset(_SSE42_OK CACHE)
189 unset(_AVX_TRUE)
190 unset(_AVX_OK)
191 unset(_AVX_OK CACHE)
192 unset(_AVX2_TRUE)
193 unset(_AVX2_OK)
194 unset(_AVX2_OK CACHE)