@@ -22,6 +22,58 @@ if(MSVC)
2222endif ()
2323
2424
25+
26+ # ------------------------------------------------------------------------------
27+ # native arch
28+ option (ARCH_NATIVE "Enable native arch" OFF )
29+ if (ARCH_NATIVE AND CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|Intel|MSVC" )
30+ include (CheckCCompilerFlag)
31+ include (CheckCSourceRuns)
32+
33+ set (ISA_LIST
34+ "AVX512|/arch:AVX512|-mavx512f|#include <immintrin.h>\n int main(){__m512i a = _mm512_setzero_si512()\\\; return 0\\\; }"
35+ "AVX2|/arch:AVX2|-mavx2|#include <immintrin.h>\n int main(){__m256i a = _mm256_setzero_si256()\\\; return 0\\\; }"
36+ "SSE2|/arch:SSE2|-msse2|#include <immintrin.h>\n int main(){__m128i a = _mm_setzero_si128()\\\; return 0\\\; }"
37+ )
38+
39+ foreach (ISA_INFO IN LISTS ISA_LIST)
40+ string (REPLACE "|" ";" ISA_INFO "${ISA_INFO} " )
41+ list (GET ISA_INFO 0 ISA_NAME)
42+ if (MSVC )
43+ list (GET ISA_INFO 1 ISA_FLAG)
44+ else ()
45+ list (GET ISA_INFO 2 ISA_FLAG)
46+ endif ()
47+ list (GET ISA_INFO 3 ISA_CHECK_CODE)
48+
49+ message (STATUS "Check ${ISA_NAME} support" )
50+ file (WRITE "${CMAKE_BINARY_DIR} /${ISA_NAME} _check.c" "${ISA_CHECK_CODE} " )
51+ try_run (RUN_RESULT COMPILE_RESULT
52+ "${CMAKE_BINARY_DIR} /${ISA_NAME} _check"
53+ "${CMAKE_BINARY_DIR} /${ISA_NAME} _check.c"
54+ COMPILE_DEFINITIONS "${ISA_FLAG} "
55+ COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT
56+ RUN_OUTPUT_VARIABLE RUN_OUTPUT
57+ )
58+
59+ if (COMPILE_RESULT AND RUN_RESULT EQUAL 0)
60+ if (NOT ISA_FLAG_NATIVE)
61+ set (ISA_FLAG_NATIVE ${ISA_FLAG} )
62+ endif ()
63+ add_definitions (-DHAVE_${ISA_NAME} )
64+ message (STATUS "Define HAVE_${ISA_NAME} =1" )
65+ endif ()
66+ endforeach ()
67+
68+ if (MSVC AND ISA_FLAG_NATIVE)
69+ add_compile_options (${ISA_FLAG_NATIVE} )
70+ elseif (NOT MSVC )
71+ add_compile_options (-march=native)
72+ endif ()
73+ endif ()
74+
75+
76+
2577# ------------------------------------------------------------------------------
2678# vendor
2779set (vendors "" )
@@ -173,5 +225,3 @@ endif()
173225
174226# copy test data
175227file (COPY ${CMAKE_CURRENT_SOURCE_DIR} /data DESTINATION ${CMAKE_CURRENT_BINARY_DIR} )
176-
177-
0 commit comments