@@ -61,21 +61,38 @@ function(_AppendFlags _RESULT _FLAG)
6161endfunction ()
6262
6363macro (add_arch_flag FLAG VAR_NAME OPTION_NAME )
64- check_c_compiler_flag ("${FLAG} " COMPILER_SUPPORT_${VAR_NAME} )
65- if (COMPILER_SUPPORT_${VAR_NAME} )
66- _AppendFlags (CMAKE_C_FLAGS "${FLAG} " )
67- _AppendFlags (CMAKE_CXX_FLAGS "${FLAG} " )
68- set (${VAR_NAME} _ENABLED ON )
64+ if (MSVC )
65+ if (${ARGC} GREATER 3)
66+ set (_effective_flag "${ARGV3} " )
67+ else ()
68+ set (_effective_flag "" )
69+ endif ()
6970 else ()
70- if (${OPTION_NAME} )
71- message (FATAL_ERROR "Compiler does not support required flag: '${FLAG} ' for ${OPTION_NAME} " )
71+ set (_effective_flag "${FLAG} " )
72+ endif ()
73+
74+ if (NOT "${_effective_flag} " STREQUAL "" )
75+ check_c_compiler_flag ("${_effective_flag} " COMPILER_SUPPORT_${VAR_NAME} )
76+ if (COMPILER_SUPPORT_${VAR_NAME} )
77+ _AppendFlags (CMAKE_C_FLAGS "${_effective_flag} " )
78+ _AppendFlags (CMAKE_CXX_FLAGS "${_effective_flag} " )
79+ set (${VAR_NAME} _ENABLED ON )
7280 else ()
73- set (${VAR_NAME} _ENABLED OFF )
81+ if (${OPTION_NAME} )
82+ message (FATAL_ERROR "Compiler does not support required flag: '${_effective_flag} ' for ${OPTION_NAME} " )
83+ else ()
84+ set (${VAR_NAME} _ENABLED OFF )
85+ endif ()
7486 endif ()
87+ else ()
88+ set (${VAR_NAME} _ENABLED ON )
7589 endif ()
7690endmacro ()
7791
7892function (_setup_armv8_march )
93+ if (MSVC )
94+ return ()
95+ endif ()
7996 set (_arch "armv8" )
8097 check_c_compiler_flag ("-march=${_arch} " _COMP_SUPP_${_arch} )
8198 if (_COMP_SUPP_${_arch} )
@@ -90,6 +107,9 @@ function(_setup_armv8_march)
90107endfunction ()
91108
92109function (_setup_x86_march )
110+ if (MSVC )
111+ return ()
112+ endif ()
93113 set (_arch "x86-64" )
94114 check_c_compiler_flag ("-march=${_arch} " _COMP_SUPP_${_arch} )
95115 if (_COMP_SUPP_${_arch} )
@@ -104,6 +124,40 @@ function(_setup_x86_march)
104124endfunction ()
105125
106126function (setup_compiler_march_for_x86 VAR_NAME_SSE VAR_NAME_AVX2 VAR_NAME_AVX512 VAR_NAME_AVX512FP16 )
127+ if (MSVC )
128+ #sse
129+ set (${VAR_NAME_SSE} "" PARENT_SCOPE )
130+
131+ #avx2
132+ check_c_compiler_flag ("/arch:AVX2" _COMP_SUPP_MSVC_AVX2 )
133+ if (_COMP_SUPP_MSVC_AVX2)
134+ set (${VAR_NAME_AVX2} "/arch:AVX2" PARENT_SCOPE )
135+ else ()
136+ set (${VAR_NAME_AVX2} "" PARENT_SCOPE )
137+ endif ()
138+
139+ #avx512
140+ check_c_compiler_flag ("/arch:AVX512" _COMP_SUPP_MSVC_AVX512 )
141+ if (_COMP_SUPP_MSVC_AVX512)
142+ set (${VAR_NAME_AVX512} "/arch:AVX512" PARENT_SCOPE )
143+ elseif (_COMP_SUPP_MSVC_AVX2)
144+ set (${VAR_NAME_AVX512} "/arch:AVX2" PARENT_SCOPE )
145+ else ()
146+ set (${VAR_NAME_AVX512} "" PARENT_SCOPE )
147+ endif ()
148+
149+ #avx512fp16
150+ if (_COMP_SUPP_MSVC_AVX512)
151+ set (${VAR_NAME_AVX512FP16} "/arch:AVX512" PARENT_SCOPE )
152+ elseif (_COMP_SUPP_MSVC_AVX2)
153+ set (${VAR_NAME_AVX512FP16} "/arch:AVX2" PARENT_SCOPE )
154+ else ()
155+ set (${VAR_NAME_AVX512FP16} "" PARENT_SCOPE )
156+ endif ()
157+
158+ return ()
159+ endif ()
160+
107161 #sse
108162 set (${VAR_NAME_SSE} "-march=corei7" PARENT_SCOPE )
109163
@@ -133,71 +187,60 @@ function(setup_compiler_march_for_x86 VAR_NAME_SSE VAR_NAME_AVX2 VAR_NAME_AVX512
133187 endforeach ()
134188endfunction ()
135189
136- if (MSVC )
137- # Prefer higher ISAs
138- foreach (_isa IN ITEMS "AVX512" "AVX2" "AVX" "SSE2" )
139- check_c_compiler_flag ("/arch:${_isa} " _COMP_SUPP_${_isa} )
140- if (_COMP_SUPP_${_isa} )
141- _AppendFlags (CMAKE_C_FLAGS "/arch:${_isa} " )
142- _AppendFlags (CMAKE_CXX_FLAGS "/arch:${_isa} " )
143- message (STATUS "MSVC: enabled /arch:${_isa} " )
144- break ()
145- endif ()
146- endforeach ()
147- return ()
148- endif ()
149-
150190if (NOT AUTO_DETECT_ARCH)
151191 if (ENABLE_NATIVE)
192+ if (MSVC )
193+ message (FATAL_ERROR "ENABLE_NATIVE is not supported with MSVC. Select a specific architecture instead." )
194+ endif ()
152195 add_arch_flag ("-march=native" NATIVE ENABLE_NATIVE )
153196 endif ()
154197
155198 if (ENABLE_ZEN3)
156- add_arch_flag ("-march=znver3" ZNVER3 ENABLE_ZEN3 )
199+ add_arch_flag ("-march=znver3" ZNVER3 ENABLE_ZEN3 "/arch:AVX2" )
157200 endif ()
158201
159202 if (ENABLE_ZEN2)
160- add_arch_flag ("-march=znver2" ZNVER2 ENABLE_ZEN2 )
203+ add_arch_flag ("-march=znver2" ZNVER2 ENABLE_ZEN2 "/arch:AVX2" )
161204 endif ()
162205
163206 if (ENABLE_ZEN1)
164- add_arch_flag ("-march=znver1" ZNVER1 ENABLE_ZEN1 )
207+ add_arch_flag ("-march=znver1" ZNVER1 ENABLE_ZEN1 "/arch:AVX2" )
165208 endif ()
166209
167210 if (ENABLE_GRANITERAPIDS)
168- add_arch_flag ("-march=graniterapids" GRANITERAPIDS ENABLE_GRANITERAPIDS )
211+ add_arch_flag ("-march=graniterapids" GRANITERAPIDS ENABLE_GRANITERAPIDS "/arch:AVX512" )
169212 endif ()
170213
171214 if (ENABLE_EMERALDRAPIDS)
172- add_arch_flag ("-march=emeraldrapids" EMERALDRAPIDS ENABLE_EMERALDRAPIDS )
215+ add_arch_flag ("-march=emeraldrapids" EMERALDRAPIDS ENABLE_EMERALDRAPIDS "/arch:AVX512" )
173216 endif ()
174217
175218 if (ENABLE_SAPPHIRERAPIDS)
176- add_arch_flag ("-march=sapphirerapids" SAPPHIRERAPIDS ENABLE_SAPPHIRERAPIDS )
219+ add_arch_flag ("-march=sapphirerapids" SAPPHIRERAPIDS ENABLE_SAPPHIRERAPIDS "/arch:AVX512" )
177220 endif ()
178221
179222 if (ENABLE_ICELAKE)
180- add_arch_flag ("-march=icelake-server" ICELAKE ENABLE_ICELAKE )
223+ add_arch_flag ("-march=icelake-server" ICELAKE ENABLE_ICELAKE "/arch:AVX512" )
181224 endif ()
182225
183226 if (ENABLE_SKYLAKE_AVX512)
184- add_arch_flag ("-march=skylake-avx512" SKYLAKE_AVX512 ENABLE_SKYLAKE_AVX512 )
227+ add_arch_flag ("-march=skylake-avx512" SKYLAKE_AVX512 ENABLE_SKYLAKE_AVX512 "/arch:AVX512" )
185228 endif ()
186229
187230 if (ENABLE_SKYLAKE)
188- add_arch_flag ("-march=skylake" SKYLAKE ENABLE_SKYLAKE )
231+ add_arch_flag ("-march=skylake" SKYLAKE ENABLE_SKYLAKE "/arch:AVX2" )
189232 endif ()
190233
191234 if (ENABLE_BROADWELL)
192- add_arch_flag ("-march=broadwell" BROADWELL ENABLE_BROADWELL )
235+ add_arch_flag ("-march=broadwell" BROADWELL ENABLE_BROADWELL "/arch:AVX2" )
193236 endif ()
194237
195238 if (ENABLE_HASWELL)
196- add_arch_flag ("-march=haswell" HASWELL ENABLE_HASWELL )
239+ add_arch_flag ("-march=haswell" HASWELL ENABLE_HASWELL "/arch:AVX2" )
197240 endif ()
198241
199242 if (ENABLE_SANDYBRIDGE)
200- add_arch_flag ("-march=sandybridge" SANDYBRIDGE ENABLE_SANDYBRIDGE )
243+ add_arch_flag ("-march=sandybridge" SANDYBRIDGE ENABLE_SANDYBRIDGE "/arch:AVX" )
201244 endif ()
202245
203246 if (ENABLE_NEHALEM)
@@ -231,13 +274,29 @@ if(NOT AUTO_DETECT_ARCH)
231274else ()
232275 # AUTO DETECT
233276 # Heuristic: detect host architecture and probe appropriate flags
234- if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64" )
235- _setup_armv8_march ()
236- elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|i686|i386|x64" )
237- _setup_x86_march ()
277+ string (TOLOWER "${CMAKE_SYSTEM_PROCESSOR} " SYSTEM_PROC_LOWER)
278+
279+ if (SYSTEM_PROC_LOWER MATCHES "^(x86_64|amd64|x64)$" )
280+ set (HOST_ARCH x64)
281+ elseif (SYSTEM_PROC_LOWER MATCHES "^(i[3-6]86|x86)$" )
282+ set (HOST_ARCH x86)
283+ elseif (SYSTEM_PROC_LOWER MATCHES "^(aarch64|arm64)$" )
284+ set (HOST_ARCH arm64)
285+ elseif (SYSTEM_PROC_LOWER MATCHES "^(arm|armv7|armv7-a|armv7l)$" )
286+ set (HOST_ARCH arm)
238287 else ()
239- message (WARNING "Unknown host architecture: ${CMAKE_SYSTEM_PROCESSOR} ; no -march= set." )
288+ set (HOST_ARCH unknown)
289+ message (WARNING "unknown host arch: ${CMAKE_SYSTEM_PROCESSOR} " )
240290 endif ()
291+ message (STATUS "host arch: ${HOST_ARCH} " )
292+
293+ if (HOST_ARCH MATCHES "^(arm|arm64)$" )
294+ _setup_armv8_march ()
295+ elseif (HOST_ARCH MATCHES "^(x86|x64)$" )
296+ _setup_x86_march ()
297+ else ()
298+ message (WARNING "unknown host arch - no -march set" )
299+ endif ()
241300endif ()
242301
243302# -----------------------------
0 commit comments