Commit | Line | Data |
---|---|---|
80f575fc DM |
1 | # Check if SSE instructions are available on the machine where |
2 | # the project is compiled. | |
3 | ||
4 | IF(CMAKE_SYSTEM_NAME MATCHES "Linux") | |
5 | EXEC_PROGRAM(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO) | |
6 | ||
7 | STRING(REGEX REPLACE "^.*(sse2).*$" "\\1" SSE_THERE ${CPUINFO}) | |
8 | STRING(COMPARE EQUAL "sse2" "${SSE_THERE}" SSE2_TRUE) | |
9 | IF (SSE2_TRUE) | |
10 | set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") | |
11 | ELSE (SSE2_TRUE) | |
12 | set(SSE2_FOUND false CACHE BOOL "SSE2 available on host") | |
13 | ENDIF (SSE2_TRUE) | |
14 | ||
15 | # /proc/cpuinfo apparently omits sse3 :( | |
16 | STRING(REGEX REPLACE "^.*[^s](sse3).*$" "\\1" SSE_THERE ${CPUINFO}) | |
17 | STRING(COMPARE EQUAL "sse3" "${SSE_THERE}" SSE3_TRUE) | |
18 | IF (NOT SSE3_TRUE) | |
19 | STRING(REGEX REPLACE "^.*(T2300).*$" "\\1" SSE_THERE ${CPUINFO}) | |
20 | STRING(COMPARE EQUAL "T2300" "${SSE_THERE}" SSE3_TRUE) | |
21 | ENDIF (NOT SSE3_TRUE) | |
22 | ||
23 | STRING(REGEX REPLACE "^.*(ssse3).*$" "\\1" SSE_THERE ${CPUINFO}) | |
24 | STRING(COMPARE EQUAL "ssse3" "${SSE_THERE}" SSSE3_TRUE) | |
25 | IF (SSE3_TRUE OR SSSE3_TRUE) | |
26 | set(SSE3_FOUND true CACHE BOOL "SSE3 available on host") | |
27 | ELSE (SSE3_TRUE OR SSSE3_TRUE) | |
28 | set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") | |
29 | ENDIF (SSE3_TRUE OR SSSE3_TRUE) | |
30 | IF (SSSE3_TRUE) | |
31 | set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host") | |
32 | ELSE (SSSE3_TRUE) | |
33 | set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") | |
34 | ENDIF (SSSE3_TRUE) | |
35 | ||
36 | STRING(REGEX REPLACE "^.*(sse4_1).*$" "\\1" SSE_THERE ${CPUINFO}) | |
37 | STRING(COMPARE EQUAL "sse4_1" "${SSE_THERE}" SSE41_TRUE) | |
38 | IF (SSE41_TRUE) | |
39 | set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host") | |
40 | ELSE (SSE41_TRUE) | |
41 | set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") | |
42 | ENDIF (SSE41_TRUE) | |
43 | ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin") | |
44 | EXEC_PROGRAM("/usr/sbin/sysctl -n machdep.cpu.features" OUTPUT_VARIABLE | |
45 | CPUINFO) | |
46 | ||
47 | STRING(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" SSE_THERE ${CPUINFO}) | |
48 | STRING(COMPARE EQUAL "SSE2" "${SSE_THERE}" SSE2_TRUE) | |
49 | IF (SSE2_TRUE) | |
50 | set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") | |
51 | ELSE (SSE2_TRUE) | |
52 | set(SSE2_FOUND false CACHE BOOL "SSE2 available on host") | |
53 | ENDIF (SSE2_TRUE) | |
54 | ||
55 | STRING(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" SSE_THERE ${CPUINFO}) | |
56 | STRING(COMPARE EQUAL "SSE3" "${SSE_THERE}" SSE3_TRUE) | |
57 | IF (SSE3_TRUE) | |
58 | set(SSE3_FOUND true CACHE BOOL "SSE3 available on host") | |
59 | ELSE (SSE3_TRUE) | |
60 | set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") | |
61 | ENDIF (SSE3_TRUE) | |
62 | ||
63 | STRING(REGEX REPLACE "^.*(SSSE3).*$" "\\1" SSE_THERE ${CPUINFO}) | |
64 | STRING(COMPARE EQUAL "SSSE3" "${SSE_THERE}" SSSE3_TRUE) | |
65 | IF (SSSE3_TRUE) | |
66 | set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host") | |
67 | ELSE (SSSE3_TRUE) | |
68 | set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") | |
69 | ENDIF (SSSE3_TRUE) | |
70 | ||
71 | STRING(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" SSE_THERE ${CPUINFO}) | |
72 | STRING(COMPARE EQUAL "SSE4.1" "${SSE_THERE}" SSE41_TRUE) | |
73 | IF (SSE41_TRUE) | |
74 | set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host") | |
75 | ELSE (SSE41_TRUE) | |
76 | set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") | |
77 | ENDIF (SSE41_TRUE) | |
78 | ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows") | |
79 | # TODO | |
80 | set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") | |
81 | set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") | |
82 | set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") | |
83 | set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") | |
84 | ELSE(CMAKE_SYSTEM_NAME MATCHES "Linux") | |
85 | set(SSE2_FOUND true CACHE BOOL "SSE2 available on host") | |
86 | set(SSE3_FOUND false CACHE BOOL "SSE3 available on host") | |
87 | set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host") | |
88 | set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host") | |
89 | ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") | |
90 | ||
91 | if(NOT SSE2_FOUND) | |
92 | MESSAGE(STATUS "Could not find hardware support for SSE2 on this machine.") | |
93 | endif(NOT SSE2_FOUND) | |
94 | if(NOT SSE3_FOUND) | |
95 | MESSAGE(STATUS "Could not find hardware support for SSE3 on this machine.") | |
96 | endif(NOT SSE3_FOUND) | |
97 | if(NOT SSSE3_FOUND) | |
98 | MESSAGE(STATUS "Could not find hardware support for SSSE3 on this machine.") | |
99 | endif(NOT SSSE3_FOUND) | |
100 | if(NOT SSE4_1_FOUND) | |
101 | MESSAGE(STATUS "Could not find hardware support for SSE4.1 on this machine.") | |
102 | endif(NOT SSE4_1_FOUND) | |
103 | ||
104 | mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND) |