diff options
Diffstat (limited to 'cmake/modules/FindSSE.cmake')
| -rw-r--r-- | cmake/modules/FindSSE.cmake | 156 |
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. | ||
| 3 | include(TestCXXAcceptsFlag) | ||
| 4 | |||
| 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) | ||
| 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() | ||
| 43 | elseif(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() | ||
| 59 | elseif(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() | ||
| 95 | elseif(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) | ||
| 101 | endif() | ||
| 102 | |||
| 103 | include(FindPackageHandleStandardArgs) | ||
| 104 | find_package_handle_standard_args(SSE | ||
| 105 | REQUIRED_VARS _SSE_TRUE _SSE_OK | ||
| 106 | FAIL_MESSAGE "Could not find hardware support for SSE") | ||
| 107 | find_package_handle_standard_args(SSE2 | ||
| 108 | REQUIRED_VARS _SSE2_TRUE _SSE2_OK | ||
| 109 | FAIL_MESSAGE "Could not find hardware support for SSE2") | ||
| 110 | find_package_handle_standard_args(SSE3 | ||
| 111 | REQUIRED_VARS _SSE3_TRUE _SSE3_OK | ||
| 112 | FAIL_MESSAGE "Could not find hardware support for SSE3") | ||
| 113 | find_package_handle_standard_args(SSSE3 | ||
| 114 | REQUIRED_VARS _SSSE3_TRUE _SSSE3_OK | ||
| 115 | FAIL_MESSAGE "Could not find hardware support for SSSE3") | ||
| 116 | find_package_handle_standard_args(SSE4_1 | ||
| 117 | REQUIRED_VARS _SSE41_TRUE _SSE41_OK | ||
| 118 | FAIL_MESSAGE "Could not find hardware support for SSE4.1") | ||
| 119 | find_package_handle_standard_args(SSE4_2 | ||
| 120 | REQUIRED_VARS _SSE42_TRUE _SSE42_OK | ||
| 121 | FAIL_MESSAGE "Could not find hardware support for SSE4.2") | ||
| 122 | find_package_handle_standard_args(AVX | ||
| 123 | REQUIRED_VARS _AVX_TRUE _AVX_OK | ||
| 124 | FAIL_MESSAGE "Could not find hardware support for AVX") | ||
| 125 | find_package_handle_standard_args(AVX2 | ||
| 126 | REQUIRED_VARS _AVX2_TRUE _AVX2_OK | ||
| 127 | FAIL_MESSAGE "Could not find hardware support for AVX2") | ||
| 128 | |||
| 129 | mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND AVX_FOUND AVX2_FOUND) | ||
| 130 | |||
| 131 | unset(_SSE_THERE) | ||
| 132 | unset(_SSE_TRUE) | ||
| 133 | unset(_SSE_OK) | ||
| 134 | unset(_SSE_OK CACHE) | ||
| 135 | unset(_SSE2_TRUE) | ||
| 136 | unset(_SSE2_OK) | ||
| 137 | unset(_SSE2_OK CACHE) | ||
| 138 | unset(_SSE3_TRUE) | ||
| 139 | unset(_SSE3_OK) | ||
| 140 | unset(_SSE3_OK CACHE) | ||
| 141 | unset(_SSSE3_TRUE) | ||
| 142 | unset(_SSSE3_OK) | ||
| 143 | unset(_SSSE3_OK CACHE) | ||
| 144 | unset(_SSE4_1_TRUE) | ||
| 145 | unset(_SSE41_OK) | ||
| 146 | unset(_SSE41_OK CACHE) | ||
| 147 | unset(_SSE4_2_TRUE) | ||
| 148 | unset(_SSE42_OK) | ||
| 149 | unset(_SSE42_OK CACHE) | ||
| 150 | unset(_AVX_TRUE) | ||
| 151 | unset(_AVX_OK) | ||
| 152 | unset(_AVX_OK CACHE) | ||
| 153 | unset(_AVX2_TRUE) | ||
| 154 | unset(_AVX2_OK) | ||
| 155 | unset(_AVX2_OK CACHE) | ||
| 156 | |||
