summaryrefslogtreecommitdiffstats
path: root/project/cmake/modules/FindSSE.cmake
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2016-11-24 21:27:41 +0100
committermanuel <manuel@mausz.at>2016-11-24 21:27:41 +0100
commit8cdf8dec703d882b46ca50a769fabb95ffc48e2c (patch)
treef7fe8233508f79d3dc94f8f445ce6342e7dfbdbb /project/cmake/modules/FindSSE.cmake
parent5823b05feb29a59510c32a9c28ca18b50b9b6399 (diff)
downloadkodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.tar.gz
kodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.tar.bz2
kodi-pvr-build-8cdf8dec703d882b46ca50a769fabb95ffc48e2c.zip
sync with upstream
Diffstat (limited to 'project/cmake/modules/FindSSE.cmake')
-rw-r--r--project/cmake/modules/FindSSE.cmake238
1 files changed, 138 insertions, 100 deletions
diff --git a/project/cmake/modules/FindSSE.cmake b/project/cmake/modules/FindSSE.cmake
index c76b811..0554663 100644
--- a/project/cmake/modules/FindSSE.cmake
+++ b/project/cmake/modules/FindSSE.cmake
@@ -1,105 +1,143 @@
1# Check if SSE instructions are available on the machine where 1# Check if SSE instructions are available on the machine where
2# the project is compiled. 2# the project is compiled.
3include(TestCXXAcceptsFlag)
3 4
4IF(CMAKE_SYSTEM_NAME MATCHES "Linux") 5if(CMAKE_SYSTEM_NAME MATCHES "Linux")
5 EXEC_PROGRAM(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO) 6 if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
6 7 exec_program(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)
7 STRING(REGEX REPLACE "^.*(sse2).*$" "\\1" SSE_THERE ${CPUINFO}) 8
8 STRING(COMPARE EQUAL "sse2" "${SSE_THERE}" SSE2_TRUE) 9 string(REGEX REPLACE "^.*(sse).*$" "\\1" _SSE_THERE ${CPUINFO})
9 IF (SSE2_TRUE) 10 string(COMPARE EQUAL "sse" "${_SSE_THERE}" _SSE_TRUE)
10 set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") 11 CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
11 ELSE (SSE2_TRUE) 12
12 set(SSE2_FOUND false CACHE BOOL "SSE2 available on host") 13 string(REGEX REPLACE "^.*(sse2).*$" "\\1" _SSE_THERE ${CPUINFO})
13 ENDIF (SSE2_TRUE) 14 string(COMPARE EQUAL "sse2" "${_SSE_THERE}" _SSE2_TRUE)
14 15 CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
15 # /proc/cpuinfo apparently omits sse3 :( 16
16 STRING(REGEX REPLACE "^.*[^s](sse3).*$" "\\1" SSE_THERE ${CPUINFO}) 17 # /proc/cpuinfo apparently omits sse3 :(
17 STRING(COMPARE EQUAL "sse3" "${SSE_THERE}" SSE3_TRUE) 18 string(REGEX REPLACE "^.*[^s](sse3).*$" "\\1" _SSE_THERE ${CPUINFO})
18 IF (NOT SSE3_TRUE) 19 string(COMPARE EQUAL "sse3" "${_SSE_THERE}" _SSE3_TRUE)
19 STRING(REGEX REPLACE "^.*(T2300).*$" "\\1" SSE_THERE ${CPUINFO}) 20 if(NOT _SSE3_TRUE)
20 STRING(COMPARE EQUAL "T2300" "${SSE_THERE}" SSE3_TRUE) 21 string(REGEX REPLACE "^.*(T2300).*$" "\\1" _SSE_THERE ${CPUINFO})
21 ENDIF (NOT SSE3_TRUE) 22 string(COMPARE EQUAL "T2300" "${_SSE_THERE}" _SSE3_TRUE)
22 23 endif()
23 STRING(REGEX REPLACE "^.*(ssse3).*$" "\\1" SSE_THERE ${CPUINFO}) 24 CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
24 STRING(COMPARE EQUAL "ssse3" "${SSE_THERE}" SSSE3_TRUE) 25
25 IF (SSE3_TRUE OR SSSE3_TRUE) 26 string(REGEX REPLACE "^.*(ssse3).*$" "\\1" _SSE_THERE ${CPUINFO})
26 set(SSE3_FOUND true CACHE BOOL "SSE3 available on host") 27 string(COMPARE EQUAL "ssse3" "${_SSE_THERE}" _SSSE3_TRUE)
27 ELSE (SSE3_TRUE OR SSSE3_TRUE) 28 CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
28 set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") 29
29 ENDIF (SSE3_TRUE OR SSSE3_TRUE) 30 string(REGEX REPLACE "^.*(sse4_1).*$" "\\1" _SSE_THERE ${CPUINFO})
30 IF (SSSE3_TRUE) 31 string(COMPARE EQUAL "sse4_1" "${_SSE_THERE}" _SSE41_TRUE)
31 set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host") 32 CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
32 ELSE (SSSE3_TRUE) 33
33 set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") 34 string(REGEX REPLACE "^.*(sse4_2).*$" "\\1" _SSE_THERE ${CPUINFO})
34 ENDIF (SSSE3_TRUE) 35 string(COMPARE EQUAL "sse4_2" "${_SSE_THERE}" _SSE42_TRUE)
35 36 CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
36 STRING(REGEX REPLACE "^.*(sse4_1).*$" "\\1" SSE_THERE ${CPUINFO}) 37
37 STRING(COMPARE EQUAL "sse4_1" "${SSE_THERE}" SSE41_TRUE) 38 string(REGEX REPLACE "^.*(avx).*$" "\\1" _SSE_THERE ${CPUINFO})
38 IF (SSE41_TRUE) 39 string(COMPARE EQUAL "avx" "${_SSE_THERE}" _AVX_TRUE)
39 set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host") 40 CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
40 ELSE (SSE41_TRUE) 41
41 set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") 42 string(REGEX REPLACE "^.*(avx2).*$" "\\1" _SSE_THERE ${CPUINFO})
42 ENDIF (SSE41_TRUE) 43 string(COMPARE EQUAL "avx2" "${_SSE_THERE}" _AVX2_TRUE)
43ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin") 44 CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
44 EXEC_PROGRAM("/usr/sbin/sysctl -n machdep.cpu.features" OUTPUT_VARIABLE 45 endif()
45 CPUINFO) 46elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
46 47 if(NOT CPU MATCHES "arm")
47 STRING(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" SSE_THERE ${CPUINFO}) 48 exec_program("/usr/sbin/sysctl -n machdep.cpu.features machdep.cpu.leaf7_features" OUTPUT_VARIABLE CPUINFO)
48 STRING(COMPARE EQUAL "SSE2" "${SSE_THERE}" SSE2_TRUE) 49
49 IF (SSE2_TRUE) 50 string(REGEX REPLACE "^.*[^S](SSE).*$" "\\1" _SSE_THERE ${CPUINFO})
50 set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") 51 string(COMPARE EQUAL "SSE" "${_SSE_THERE}" _SSE_TRUE)
51 ELSE (SSE2_TRUE) 52 CHECK_CXX_ACCEPTS_FLAG("-msse" _SSE_OK)
52 set(SSE2_FOUND false CACHE BOOL "SSE2 available on host") 53
53 ENDIF (SSE2_TRUE) 54 string(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" _SSE_THERE ${CPUINFO})
54 55 string(COMPARE EQUAL "SSE2" "${_SSE_THERE}" _SSE2_TRUE)
55 STRING(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" SSE_THERE ${CPUINFO}) 56 CHECK_CXX_ACCEPTS_FLAG("-msse2" _SSE2_OK)
56 STRING(COMPARE EQUAL "SSE3" "${SSE_THERE}" SSE3_TRUE) 57
57 IF (SSE3_TRUE) 58 string(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
58 set(SSE3_FOUND true CACHE BOOL "SSE3 available on host") 59 string(COMPARE EQUAL "SSE3" "${_SSE_THERE}" _SSE3_TRUE)
59 ELSE (SSE3_TRUE) 60 CHECK_CXX_ACCEPTS_FLAG("-msse3" _SSE3_OK)
60 set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") 61
61 ENDIF (SSE3_TRUE) 62 string(REGEX REPLACE "^.*(SSSE3).*$" "\\1" _SSE_THERE ${CPUINFO})
62 63 string(COMPARE EQUAL "SSSE3" "${_SSE_THERE}" _SSSE3_TRUE)
63 STRING(REGEX REPLACE "^.*(SSSE3).*$" "\\1" SSE_THERE ${CPUINFO}) 64 CHECK_CXX_ACCEPTS_FLAG("-mssse3" _SSSE3_OK)
64 STRING(COMPARE EQUAL "SSSE3" "${SSE_THERE}" SSSE3_TRUE) 65
65 IF (SSSE3_TRUE) 66 string(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" _SSE_THERE ${CPUINFO})
66 set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host") 67 string(COMPARE EQUAL "SSE4.1" "${_SSE_THERE}" _SSE41_TRUE)
67 ELSE (SSSE3_TRUE) 68 CHECK_CXX_ACCEPTS_FLAG("-msse4.1" _SSE41_OK)
68 set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") 69
69 ENDIF (SSSE3_TRUE) 70 string(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" _SSE_THERE ${CPUINFO})
70 71 string(COMPARE EQUAL "SSE4.2" "${_SSE_THERE}" _SSE42_TRUE)
71 STRING(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" SSE_THERE ${CPUINFO}) 72 CHECK_CXX_ACCEPTS_FLAG("-msse4.2" _SSE42_OK)
72 STRING(COMPARE EQUAL "SSE4.1" "${SSE_THERE}" SSE41_TRUE) 73
73 IF (SSE41_TRUE) 74 string(REGEX REPLACE "^.*(AVX).*$" "\\1" _SSE_THERE ${CPUINFO})
74 set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host") 75 string(COMPARE EQUAL "AVX" "${_SSE_THERE}" _AVX_TRUE)
75 ELSE (SSE41_TRUE) 76 CHECK_CXX_ACCEPTS_FLAG("-mavx" _AVX_OK)
76 set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") 77
77 ENDIF (SSE41_TRUE) 78 string(REGEX REPLACE "^.*(AVX2).*$" "\\1" _SSE_THERE ${CPUINFO})
78ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows") 79 string(COMPARE EQUAL "AVX2" "${_SSE_THERE}" _AVX2_TRUE)
80 CHECK_CXX_ACCEPTS_FLAG("-mavx2" _AVX2_OK)
81 endif()
82elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
79 # TODO 83 # TODO
80 set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") 84 set(_SSE_TRUE true)
81 set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") 85 set(_SSE_OK true)
82 set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") 86 set(_SSE2_TRUE true)
83 set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") 87 set(_SSE2_OK true)
84ELSE(CMAKE_SYSTEM_NAME MATCHES "Linux") 88endif()
85 set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") 89
86 set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") 90include(FindPackageHandleStandardArgs)
87 set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") 91find_package_handle_standard_args(SSE
88 set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") 92 REQUIRED_VARS _SSE_TRUE _SSE_OK
89ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") 93 FAIL_MESSAGE "Could not find hardware support for SSE")
90 94find_package_handle_standard_args(SSE2
91if(NOT SSE2_FOUND) 95 REQUIRED_VARS _SSE2_TRUE _SSE2_OK
92 MESSAGE(STATUS "Could not find hardware support for SSE2 on this machine.") 96 FAIL_MESSAGE "Could not find hardware support for SSE2")
93endif(NOT SSE2_FOUND) 97find_package_handle_standard_args(SSE3
94if(NOT SSE3_FOUND) 98 REQUIRED_VARS _SSE3_TRUE _SSE3_OK
95 MESSAGE(STATUS "Could not find hardware support for SSE3 on this machine.") 99 FAIL_MESSAGE "Could not find hardware support for SSE3")
96endif(NOT SSE3_FOUND) 100find_package_handle_standard_args(SSSE3
97if(NOT SSSE3_FOUND) 101 REQUIRED_VARS _SSSE3_TRUE _SSSE3_OK
98 MESSAGE(STATUS "Could not find hardware support for SSSE3 on this machine.") 102 FAIL_MESSAGE "Could not find hardware support for SSSE3")
99endif(NOT SSSE3_FOUND) 103find_package_handle_standard_args(SSE4_1
100if(NOT SSE4_1_FOUND) 104 REQUIRED_VARS _SSE41_TRUE _SSE41_OK
101 MESSAGE(STATUS "Could not find hardware support for SSE4.1 on this machine.") 105 FAIL_MESSAGE "Could not find hardware support for SSE4.1")
102endif(NOT SSE4_1_FOUND) 106find_package_handle_standard_args(SSE4_2
103 107 REQUIRED_VARS _SSE42_TRUE _SSE42_OK
104mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND) 108 FAIL_MESSAGE "Could not find hardware support for SSE4.2")
109find_package_handle_standard_args(AVX
110 REQUIRED_VARS _AVX_TRUE _AVX_OK
111 FAIL_MESSAGE "Could not find hardware support for AVX")
112find_package_handle_standard_args(AVX2
113 REQUIRED_VARS _AVX2_TRUE _AVX2_OK
114 FAIL_MESSAGE "Could not find hardware support for AVX2")
115
116mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND AVX_FOUND AVX2_FOUND)
117
118unset(_SSE_THERE)
119unset(_SSE_TRUE)
120unset(_SSE_OK)
121unset(_SSE_OK CACHE)
122unset(_SSE2_TRUE)
123unset(_SSE2_OK)
124unset(_SSE2_OK CACHE)
125unset(_SSE3_TRUE)
126unset(_SSE3_OK)
127unset(_SSE3_OK CACHE)
128unset(_SSSE3_TRUE)
129unset(_SSSE3_OK)
130unset(_SSSE3_OK CACHE)
131unset(_SSE4_1_TRUE)
132unset(_SSE41_OK)
133unset(_SSE41_OK CACHE)
134unset(_SSE4_2_TRUE)
135unset(_SSE42_OK)
136unset(_SSE42_OK CACHE)
137unset(_AVX_TRUE)
138unset(_AVX_OK)
139unset(_AVX_OK CACHE)
140unset(_AVX2_TRUE)
141unset(_AVX2_OK)
142unset(_AVX2_OK CACHE)
105 143