Merge pull request #25883 from CrystalP/fix-slowscan
[xbmc.git] / cmake / modules / FindSSE.cmake
blob82a33dd6deda7bde5dede190d3e4b29e28c1642d
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      execute_process(COMMAND cat /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      execute_process(COMMAND dmesg
46                      COMMAND grep Features OUTPUT_VARIABLE CPUINFO)
48      string(REGEX REPLACE "^.*(SSE).*$" "\\1" _SSE_THERE "${CPUINFO}")
49      string(COMPARE EQUAL "SSE" "${_SSE_THERE}" _SSE_TRUE)
50      CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
52      string(REGEX REPLACE "^.*(SSE2).*$" "\\1" _SSE_THERE "${CPUINFO}")
53      string(COMPARE EQUAL "SSE2" "${_SSE_THERE}" _SSE2_TRUE)
54      CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
56      string(REGEX REPLACE "^.*(SSE3).*$" "\\1" _SSE_THERE "${CPUINFO}")
57      string(COMPARE EQUAL "SSE3" "${_SSE_THERE}" _SSE3_TRUE)
58      CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
60      string(REGEX REPLACE "^.*(SSSE3).*$" "\\1" _SSE_THERE "${CPUINFO}")
61      string(COMPARE EQUAL "SSSE3" "${_SSE_THERE}" _SSSE3_TRUE)
62      CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
64      string(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" _SSE_THERE "${CPUINFO}")
65      string(COMPARE EQUAL "SSE4.1" "${_SSE_THERE}" _SSE41_TRUE)
66      CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
67      string(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" _SSE_THERE "${CPUINFO}")
68      string(COMPARE EQUAL "SSE4.2" "${_SSE_THERE}" _SSE42_TRUE)
69      CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
71      string(REGEX REPLACE "^.*(AVX).*$" "\\1" _SSE_THERE "${CPUINFO}")
72      string(COMPARE EQUAL "AVX" "${_SSE_THERE}" _AVX_TRUE)
73      CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
75      string(REGEX REPLACE "^.*(AVX2).*$" "\\1" _SSE_THERE "${CPUINFO}")
76      string(COMPARE EQUAL "AVX2" "${_SSE_THERE}" _AVX2_TRUE)
77      CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
78    endif()
79 elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
80   if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
81     set(_SSE_TRUE TRUE)
82     set(_SSE2_TRUE TRUE)
83     set(_SSE3_TRUE TRUE)
84     set(_SSSE3_TRUE TRUE)
86     CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
87     CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
88     CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
89     CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
90     CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
91     CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
92     CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
93     CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
94    endif()
95 elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
96    # TODO
97    if(ARCH STREQUAL win32 OR ARCH STREQUAL x64)
98       set(_SSE_TRUE true)
99       set(_SSE_OK   true)
100       set(_SSE2_TRUE true)
101       set(_SSE2_OK   true)
102    endif()
103 endif()
105 include(FindPackageHandleStandardArgs)
106 find_package_handle_standard_args(SSE
107                                   REQUIRED_VARS _SSE_TRUE _SSE_OK
108                                   FAIL_MESSAGE "Could not find hardware support for SSE")
109 set(FPHSA_NAME_MISMATCHED ON)
110 find_package_handle_standard_args(SSE2
111                                   REQUIRED_VARS _SSE2_TRUE _SSE2_OK
112                                   FAIL_MESSAGE "Could not find hardware support for SSE2")
113 find_package_handle_standard_args(SSE3
114                                   REQUIRED_VARS _SSE3_TRUE _SSE3_OK
115                                   FAIL_MESSAGE "Could not find hardware support for SSE3")
116 find_package_handle_standard_args(SSSE3
117                                   REQUIRED_VARS _SSSE3_TRUE _SSSE3_OK
118                                   FAIL_MESSAGE "Could not find hardware support for SSSE3")
119 find_package_handle_standard_args(SSE4_1
120                                   REQUIRED_VARS _SSE41_TRUE _SSE41_OK
121                                   FAIL_MESSAGE "Could not find hardware support for SSE4.1")
122 find_package_handle_standard_args(SSE4_2
123                                   REQUIRED_VARS _SSE42_TRUE _SSE42_OK
124                                   FAIL_MESSAGE "Could not find hardware support for SSE4.2")
125 find_package_handle_standard_args(AVX
126                                   REQUIRED_VARS _AVX_TRUE _AVX_OK
127                                   FAIL_MESSAGE "Could not find hardware support for AVX")
128 find_package_handle_standard_args(AVX2
129                                   REQUIRED_VARS _AVX2_TRUE _AVX2_OK
130                                   FAIL_MESSAGE "Could not find hardware support for AVX2")
131 unset(FPHSA_NAME_MISMATCHED)
133 mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND AVX_FOUND AVX2_FOUND)
135 unset(_SSE_THERE)
136 unset(_SSE_TRUE)
137 unset(_SSE_OK)
138 unset(_SSE_OK CACHE)
139 unset(_SSE2_TRUE)
140 unset(_SSE2_OK)
141 unset(_SSE2_OK CACHE)
142 unset(_SSE3_TRUE)
143 unset(_SSE3_OK)
144 unset(_SSE3_OK CACHE)
145 unset(_SSSE3_TRUE)
146 unset(_SSSE3_OK)
147 unset(_SSSE3_OK CACHE)
148 unset(_SSE4_1_TRUE)
149 unset(_SSE41_OK)
150 unset(_SSE41_OK CACHE)
151 unset(_SSE4_2_TRUE)
152 unset(_SSE42_OK)
153 unset(_SSE42_OK CACHE)
154 unset(_AVX_TRUE)
155 unset(_AVX_OK)
156 unset(_AVX_OK CACHE)
157 unset(_AVX2_TRUE)
158 unset(_AVX2_OK)
159 unset(_AVX2_OK CACHE)