forked from SatDump/SatDump
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FindSSE41.cmake
151 lines (132 loc) · 3.84 KB
/
FindSSE41.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#.rst:
# FindSSE41
# ---------
#
# Finds SSE41 support
#
# This module can be used to detect SSE41 support in a C compiler. If
# the compiler supports SSE41, the flags required to compile with
# SSE41 support are returned in variables for the different languages.
# The variables may be empty if the compiler does not need a special
# flag to support SSE41.
#
# The following variables are set:
#
# ::
#
# SSE41_C_FLAGS - flags to add to the C compiler for SSE41 support
# SSE41_FOUND - true if SSE41 is detected
#
#=============================================================================
set(_SSE41_REQUIRED_VARS)
set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
set(CMAKE_REQUIRED_QUIET ${SSE41_FIND_QUIETLY})
# sample SSE41 source code to test
set(SSE41_C_TEST_SOURCE
"
#if defined(_MSC_VER)
#include <intrin.h>
#else
#include <smmintrin.h>
#endif
int foo() {
__m128i vOne = _mm_set1_epi8(1);
__m128i result = _mm_max_epi8(vOne,vOne);
return _mm_extract_epi8(result, 0);
}
int main(void) { return foo(); }
")
# if these are set then do not try to find them again,
# by avoiding any try_compiles for the flags
if((DEFINED SSE41_C_FLAGS) OR (DEFINED HAVE_SSE41))
else()
if(WIN32)
set(SSE41_C_FLAG_CANDIDATES
#Empty, if compiler automatically accepts SSE41
" "
"/arch:SSE2")
else()
set(SSE41_C_FLAG_CANDIDATES
#Empty, if compiler automatically accepts SSE41
" "
#GNU, Intel
"-march=corei7"
#clang
"-msse4"
#GNU 4.4.7 ?
"-msse4.1"
)
endif()
include(CheckCSourceCompiles)
foreach(FLAG IN LISTS SSE41_C_FLAG_CANDIDATES)
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${FLAG}")
unset(HAVE_SSE41 CACHE)
if(NOT CMAKE_REQUIRED_QUIET)
message(STATUS "Try SSE41 C flag = [${FLAG}]")
endif()
check_c_source_compiles("${SSE41_C_TEST_SOURCE}" HAVE_SSE41)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
if(HAVE_SSE41)
set(SSE41_C_FLAGS_INTERNAL "${FLAG}")
break()
endif()
endforeach()
unset(SSE41_C_FLAG_CANDIDATES)
set(SSE41_C_FLAGS "${SSE41_C_FLAGS_INTERNAL}"
CACHE STRING "C compiler flags for SSE41 intrinsics")
endif()
list(APPEND _SSE41_REQUIRED_VARS SSE41_C_FLAGS)
set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
if(_SSE41_REQUIRED_VARS)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SSE41
REQUIRED_VARS ${_SSE41_REQUIRED_VARS})
mark_as_advanced(${_SSE41_REQUIRED_VARS})
unset(_SSE41_REQUIRED_VARS)
else()
message(SEND_ERROR "FindSSE41 requires C or CXX language to be enabled")
endif()
# begin tests for SSE4.1 specfic features
set(SSE41_C_TEST_SOURCE_INSERT64
"
#include <stdint.h>
#if defined(_MSC_VER)
#include <intrin.h>
#else
#include <smmintrin.h>
#endif
__m128i foo() {
__m128i vOne = _mm_set1_epi8(1);
return _mm_insert_epi64(vOne,INT64_MIN,0);
}
int main(void) { foo(); return 0; }
")
if(SSE41_C_FLAGS)
include(CheckCSourceCompiles)
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${SSE41_C_FLAGS}")
check_c_source_compiles("${SSE41_C_TEST_SOURCE_INSERT64}" HAVE_SSE41_MM_INSERT_EPI64)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
endif()
set(SSE41_C_TEST_SOURCE_EXTRACT64
"
#include <stdint.h>
#if defined(_MSC_VER)
#include <intrin.h>
#else
#include <smmintrin.h>
#endif
int64_t foo() {
__m128i vOne = _mm_set1_epi8(1);
return (int64_t)_mm_extract_epi64(vOne,0);
}
int main(void) { return (int)foo(); }
")
if(SSE41_C_FLAGS)
include(CheckCSourceCompiles)
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${SSE41_C_FLAGS}")
check_c_source_compiles("${SSE41_C_TEST_SOURCE_EXTRACT64}" HAVE_SSE41_MM_EXTRACT_EPI64)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
endif()