76f56ba422edc1b4ae429ecc4e76537307f1399e
[platform/upstream/opencv.git] / cmake / OpenCVCompilerOptimizations.cmake
1 # x86/x86-64 arch:
2 # SSE / SSE2 (always available on 64-bit CPUs)
3 # SSE3 / SSSE3
4 # SSE4_1 / SSE4_2 / POPCNT
5 # AVX / AVX2 / AVX_512F
6 # FMA3
7
8 # CPU_{opt}_SUPPORTED=ON/OFF - compiler support (possibly with additional flag)
9 # CPU_{opt}_IMPLIES=<list>
10 # CPU_{opt}_FORCE=<list> - subset of "implies" list
11 # CPU_{opt}_GROUP=<list> - similar to "implies" list, but additionally merges compiler flags
12 # CPU_{opt}_FLAGS_ON=""
13 # CPU_{opt}_FEATURE_ALIAS - mapping to CV_CPU_* HWFeature enum
14
15 # Input variables:
16 # CPU_BASELINE=<list> - preferred list of baseline optimizations
17 # CPU_DISPATCH=<list> - preferred list of dispatched optimizations
18
19 # Advanced input variables:
20 # CPU_BASELINE_REQUIRE=<list> - list of required baseline optimizations
21 # CPU_DISPATCH_REQUIRE=<list> - list of required dispatched optimizations
22 # CPU_BASELINE_DISABLE=<list> - list of disabled baseline optimizations
23
24 # Output variables:
25 # CPU_BASELINE_FINAL=<list> - final list of enabled compiler optimizations
26 # CPU_DISPATCH_FINAL=<list> - final list of dispatched optimizations
27 #
28 # CPU_DISPATCH_FLAGS_${opt} - flags for source files compiled separately (<name>.avx2.cpp)
29
30 set(CPU_ALL_OPTIMIZATIONS "SSE;SSE2;SSE3;SSSE3;SSE4_1;SSE4_2;POPCNT;AVX;FP16;AVX2;FMA3;AVX_512F;AVX512_SKX")
31 list(APPEND CPU_ALL_OPTIMIZATIONS NEON VFPV3 FP16)
32 list(APPEND CPU_ALL_OPTIMIZATIONS VSX)
33 list(REMOVE_DUPLICATES CPU_ALL_OPTIMIZATIONS)
34
35 ocv_update(CPU_VFPV3_FEATURE_ALIAS "")
36
37
38 set(HELP_CPU_BASELINE "Specify list of enabled baseline CPU optimizations")
39 set(HELP_CPU_BASELINE_REQUIRE "Specify list of required baseline CPU optimizations")
40 set(HELP_CPU_BASELINE_DISABLE "Specify list of forbidden baseline CPU optimizations")
41 set(HELP_CPU_DISPATCH "Specify list of dispatched CPU optimizations")
42 set(HELP_CPU_DISPATCH_REQUIRE "Specify list of required dispatched CPU optimizations")
43
44 foreach(var CPU_BASELINE CPU_BASELINE_REQUIRE CPU_BASELINE_DISABLE CPU_DISPATCH CPU_DISPATCH_REQUIRE)
45   if(DEFINED ${var})
46     string(REPLACE "," ";" _list "${${var}}")
47     set(${var} "${_list}" CACHE STRING "${HELP_${var}}" FORCE)
48   endif()
49 endforeach()
50
51 # process legacy flags
52 macro(ocv_optimization_process_obsolete_option legacy_flag OPT legacy_warn)
53   if(DEFINED ${legacy_flag})
54     if(${legacy_warn})
55       message(STATUS "WARNING: Option ${legacy_flag}='${${legacy_flag}}' is deprecated and should not be used anymore")
56       message(STATUS "         Behaviour of this option is not backward compatible")
57       message(STATUS "         Refer to 'CPU_BASELINE'/'CPU_DISPATCH' CMake options documentation")
58     endif()
59     if(${legacy_flag})
60       if(NOT ";${CPU_BASELINE_REQUIRE};" MATCHES ";${OPT};")
61         set(CPU_BASELINE_REQUIRE "${CPU_BASELINE_REQUIRE};${OPT}" CACHE STRING "${HELP_CPU_BASELINE_REQUIRE}" FORCE)
62       endif()
63     else()
64       if(NOT ";${CPU_BASELINE_DISABLE};" MATCHES ";${OPT};")
65         set(CPU_BASELINE_DISABLE "${CPU_BASELINE_DISABLE};${OPT}" CACHE STRING "${HELP_CPU_BASELINE_DISABLE}" FORCE)
66       endif()
67     endif()
68   endif()
69 endmacro()
70 ocv_optimization_process_obsolete_option(ENABLE_SSE SSE ON)
71 ocv_optimization_process_obsolete_option(ENABLE_SSE2 SSE2 ON)
72 ocv_optimization_process_obsolete_option(ENABLE_SSE3 SSE3 ON)
73 ocv_optimization_process_obsolete_option(ENABLE_SSSE3 SSSE3 ON)
74 ocv_optimization_process_obsolete_option(ENABLE_SSE41 SSE4_1 ON)
75 ocv_optimization_process_obsolete_option(ENABLE_SSE42 SSE4_2 ON)
76 ocv_optimization_process_obsolete_option(ENABLE_POPCNT POPCNT ON)
77 ocv_optimization_process_obsolete_option(ENABLE_AVX AVX ON)
78 ocv_optimization_process_obsolete_option(ENABLE_AVX2 AVX2 ON)
79 ocv_optimization_process_obsolete_option(ENABLE_FMA3 FMA3 ON)
80
81 ocv_optimization_process_obsolete_option(ENABLE_VFPV3 VFPV3 OFF)
82 ocv_optimization_process_obsolete_option(ENABLE_NEON NEON OFF)
83
84 ocv_optimization_process_obsolete_option(ENABLE_VSX VSX OFF)
85
86 macro(ocv_is_optimization_in_list resultvar check_opt)
87   set(__checked "")
88   set(__queue ${ARGN})
89   set(${resultvar} 0)
90   while(__queue AND NOT ${resultvar})
91     list(REMOVE_DUPLICATES __queue)
92     set(__queue_current ${__queue})
93     set(__queue "")
94     foreach(OPT ${__queue_current})
95       if("x${OPT}" STREQUAL "x${check_opt}")
96         set(${resultvar} 1)
97         break()
98       elseif(NOT ";${__checked};" MATCHES ";${OPT};")
99         list(APPEND __queue ${CPU_${OPT}_IMPLIES})
100       endif()
101       list(APPEND __checked ${OPT})
102     endforeach()
103   endwhile()
104 endmacro()
105
106 macro(ocv_is_optimization_in_force_list resultvar check_opt)
107   set(__checked "")
108   set(__queue ${ARGN})
109   set(${resultvar} 0)
110   while(__queue AND NOT ${resultvar})
111     list(REMOVE_DUPLICATES __queue)
112     set(__queue_current ${__queue})
113     set(__queue "")
114     foreach(OPT ${__queue_current})
115       if(OPT STREQUAL "${check_opt}")
116         set(${resultvar} 1)
117         break()
118       elseif(NOT ";${__checked};" MATCHES ";${OPT};")
119         list(APPEND __queue ${CPU_${OPT}_FORCE})
120       endif()
121       list(APPEND __checked ${OPT})
122     endforeach()
123   endwhile()
124 endmacro()
125
126 macro(ocv_append_optimization_flag var OPT)
127   if(CPU_${OPT}_FLAGS_CONFLICT)
128     string(REGEX REPLACE " ${CPU_${OPT}_FLAGS_CONFLICT}" "" ${var} " ${${var}} ")
129     string(REGEX REPLACE "^ +" "" ${var} "${${var}}")
130   endif()
131   set(${var} "${${var}} ${CPU_${OPT}_FLAGS_ON}")
132 endmacro()
133
134 # Support GCC -march=native or Intel Compiler -xHost flags
135 if(";${CPU_BASELINE};" MATCHES ";NATIVE;" OR ";${CPU_BASELINE};" MATCHES ";HOST;")
136   set(CPU_BASELINE_DETECT ON)
137   set(_add_native_flag ON)
138 elseif(";${CPU_BASELINE};" MATCHES ";DETECT;")
139   set(CPU_BASELINE_DETECT ON)
140 elseif(" ${CMAKE_CXX_FLAGS} " MATCHES " -march=native | -xHost | /QxHost ")
141   if(DEFINED CPU_BASELINE)
142     message(STATUS "CPU: Detected '-march=native' or '-xHost' compiler flag. Force CPU_BASELINE=DETECT.")
143   endif()
144   set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
145   set(CPU_BASELINE_DETECT ON)
146 endif()
147
148 if(X86 OR X86_64)
149   ocv_update(CPU_KNOWN_OPTIMIZATIONS "SSE;SSE2;SSE3;SSSE3;SSE4_1;POPCNT;SSE4_2;FP16;FMA3;AVX;AVX2;AVX_512F;AVX512_SKX")
150
151   ocv_update(CPU_AVX512_SKX_GROUP "AVX_512F;AVX_512CD;AVX_512BW;AVX_512DQ;AVX_512VL")
152
153   ocv_update(CPU_SSE_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_sse.cpp")
154   ocv_update(CPU_SSE2_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_sse2.cpp")
155   ocv_update(CPU_SSE3_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_sse3.cpp")
156   ocv_update(CPU_SSSE3_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_ssse3.cpp")
157   ocv_update(CPU_SSE4_1_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_sse41.cpp")
158   ocv_update(CPU_SSE4_2_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_sse42.cpp")
159   ocv_update(CPU_POPCNT_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_popcnt.cpp")
160   ocv_update(CPU_AVX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_avx.cpp")
161   ocv_update(CPU_AVX2_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_avx2.cpp")
162   ocv_update(CPU_FP16_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_fp16.cpp")
163   ocv_update(CPU_AVX_512F_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_avx512.cpp")
164   ocv_update(CPU_AVX512_SKX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_avx512skx.cpp")
165
166   if(NOT OPENCV_CPU_OPT_IMPLIES_IGNORE)
167     ocv_update(CPU_AVX_512F_IMPLIES "AVX2")
168     ocv_update(CPU_AVX_512F_FORCE "") # Don't force other optimizations
169     ocv_update(CPU_AVX2_IMPLIES "AVX;FMA3;FP16")
170     ocv_update(CPU_FMA3_IMPLIES "AVX2")
171     ocv_update(CPU_FMA3_FORCE "") # Don't force other optimizations
172     ocv_update(CPU_FP16_IMPLIES "AVX")
173     ocv_update(CPU_FP16_FORCE "") # Don't force other optimizations
174     ocv_update(CPU_AVX_IMPLIES "SSE4_2")
175     ocv_update(CPU_SSE4_2_IMPLIES "SSE4_1;POPCNT")
176     ocv_update(CPU_POPCNT_IMPLIES "SSE4_1")
177     ocv_update(CPU_POPCNT_FORCE "") # Don't force other optimizations
178     ocv_update(CPU_SSE4_1_IMPLIES "SSE3;SSSE3")
179     ocv_update(CPU_SSSE3_IMPLIES "SSE3")
180     ocv_update(CPU_SSE3_IMPLIES "SSE2")
181     ocv_update(CPU_SSE2_IMPLIES "SSE")
182   endif()
183
184   if(CV_ICC)
185     macro(ocv_intel_compiler_optimization_option name unix_flags msvc_flags)
186       ocv_update(CPU_${name}_FLAGS_NAME "${name}")
187       if(MSVC)
188         set(enable_flags "${msvc_flags}")
189         set(flags_conflict "/arch:[^ ]+")
190       else()
191         set(enable_flags "${unix_flags}")
192         set(flags_conflict "-msse[^ ]*|-mssse3|-mavx[^ ]*|-march[^ ]+")
193       endif()
194       ocv_update(CPU_${name}_FLAGS_ON "${enable_flags}")
195       if(flags_conflict)
196         ocv_update(CPU_${name}_FLAGS_CONFLICT "${flags_conflict}")
197       endif()
198     endmacro()
199     ocv_intel_compiler_optimization_option(AVX2 "-march=core-avx2" "/arch:CORE-AVX2")
200     ocv_intel_compiler_optimization_option(FP16 "-mavx" "/arch:AVX")
201     ocv_intel_compiler_optimization_option(AVX "-mavx" "/arch:AVX")
202     ocv_intel_compiler_optimization_option(FMA3 "" "")
203     ocv_intel_compiler_optimization_option(POPCNT "" "")
204     ocv_intel_compiler_optimization_option(SSE4_2 "-msse4.2" "/arch:SSE4.2")
205     ocv_intel_compiler_optimization_option(SSE4_1 "-msse4.1" "/arch:SSE4.1")
206     ocv_intel_compiler_optimization_option(SSE3 "-msse3" "/arch:SSE3")
207     ocv_intel_compiler_optimization_option(SSSE3 "-mssse3" "/arch:SSSE3")
208     ocv_intel_compiler_optimization_option(SSE2 "-msse2" "/arch:SSE2")
209     if(NOT X86_64) # x64 compiler doesn't support /arch:sse
210       ocv_intel_compiler_optimization_option(SSE "-msse" "/arch:SSE")
211     endif()
212     ocv_intel_compiler_optimization_option(AVX_512F "-march=common-avx512" "/arch:COMMON-AVX512")
213     ocv_intel_compiler_optimization_option(AVX512_SKX "-march=core-avx512" "/arch:CORE-AVX512")
214   elseif(CV_GCC OR CV_CLANG)
215     ocv_update(CPU_AVX2_FLAGS_ON "-mavx2")
216     ocv_update(CPU_FP16_FLAGS_ON "-mf16c")
217     ocv_update(CPU_AVX_FLAGS_ON "-mavx")
218     ocv_update(CPU_FMA3_FLAGS_ON "-mfma")
219     ocv_update(CPU_POPCNT_FLAGS_ON "-mpopcnt")
220     ocv_update(CPU_SSE4_2_FLAGS_ON "-msse4.2")
221     ocv_update(CPU_SSE4_1_FLAGS_ON "-msse4.1")
222     ocv_update(CPU_SSE3_FLAGS_ON "-msse3")
223     ocv_update(CPU_SSSE3_FLAGS_ON "-mssse3")
224     ocv_update(CPU_SSE2_FLAGS_ON "-msse2")
225     ocv_update(CPU_SSE_FLAGS_ON "-msse")
226     if(NOT (CV_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0"))  # GCC >= 5.0
227       # -mavx512f -mavx512pf -mavx512er -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi
228       ocv_update(CPU_AVX_512F_FLAGS_ON "-mavx512f")
229       ocv_update(CPU_AVX512_SKX_FLAGS_ON "-mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq")
230     else()
231       ocv_update(CPU_AVX_512F_SUPPORTED OFF)
232       ocv_update(CPU_AVX512_SKX_SUPPORTED OFF)
233     endif()
234   elseif(MSVC)
235     ocv_update(CPU_AVX2_FLAGS_ON "/arch:AVX2")
236     ocv_update(CPU_AVX_FLAGS_ON "/arch:AVX")
237     ocv_update(CPU_FP16_FLAGS_ON "/arch:AVX")
238     if(NOT MSVC64)
239       # 64-bit MSVC compiler uses SSE/SSE2 by default
240       ocv_update(CPU_SSE_FLAGS_ON "/arch:SSE")
241       ocv_update(CPU_SSE_SUPPORTED ON)
242       ocv_update(CPU_SSE2_FLAGS_ON "/arch:SSE2")
243       ocv_update(CPU_SSE2_SUPPORTED ON)
244     else()
245       ocv_update(CPU_SSE_SUPPORTED ON)
246       ocv_update(CPU_SSE2_SUPPORTED ON)
247     endif()
248     # Other instruction sets are supported by default since MSVC 2008 at least
249   else()
250     message(WARNING "TODO: Unsupported compiler")
251   endif()
252
253   if(NOT DEFINED CPU_DISPATCH)
254     if(X86_64)
255       set(CPU_DISPATCH "SSE4_1;SSE4_2;AVX;FP16;AVX2;AVX512_SKX" CACHE STRING "${HELP_CPU_DISPATCH}")
256     else()
257       set(CPU_DISPATCH "SSE4_1;SSE4_2;AVX;FP16" CACHE STRING "${HELP_CPU_DISPATCH}")
258     endif()
259   endif()
260
261   if(NOT DEFINED CPU_BASELINE)
262     if(APPLE)
263       # MacOS X has limited set of possible supported H/W, so compiler is configured well
264       set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
265     elseif(X86_64)
266       set(CPU_BASELINE "SSE3" CACHE STRING "${HELP_CPU_BASELINE}")
267     else()
268       set(CPU_BASELINE "SSE2" CACHE STRING "${HELP_CPU_BASELINE}")
269     endif()
270   endif()
271
272 elseif(ARM OR AARCH64)
273   ocv_update(CPU_NEON_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_neon.cpp")
274   ocv_update(CPU_FP16_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_fp16.cpp")
275   if(NOT AARCH64)
276     ocv_update(CPU_KNOWN_OPTIMIZATIONS "VFPV3;NEON;FP16")
277     if(NOT MSVC)
278       ocv_update(CPU_VFPV3_FLAGS_ON "-mfpu=vfpv3")
279       ocv_update(CPU_NEON_FLAGS_ON "-mfpu=neon")
280       ocv_update(CPU_NEON_FLAGS_CONFLICT "-mfpu=[^ ]*")
281       ocv_update(CPU_FP16_FLAGS_ON "-mfpu=neon-fp16")
282       ocv_update(CPU_FP16_FLAGS_CONFLICT "-mfpu=[^ ]*")
283     endif()
284     ocv_update(CPU_FP16_IMPLIES "NEON")
285   else()
286     ocv_update(CPU_KNOWN_OPTIMIZATIONS "NEON;FP16")
287     ocv_update(CPU_NEON_FLAGS_ON "")
288     ocv_update(CPU_FP16_IMPLIES "NEON")
289     set(CPU_BASELINE "NEON;FP16" CACHE STRING "${HELP_CPU_BASELINE}")
290   endif()
291 elseif(PPC64LE)
292   ocv_update(CPU_KNOWN_OPTIMIZATIONS "VSX")
293   ocv_update(CPU_VSX_TEST_FILE "${OpenCV_SOURCE_DIR}/cmake/checks/cpu_vsx.cpp")
294
295   if(CV_CLANG AND (NOT ${CMAKE_CXX_COMPILER} MATCHES "xlc"))
296     ocv_update(CPU_VSX_FLAGS_ON "-mvsx -maltivec")
297   else()
298     ocv_update(CPU_VSX_FLAGS_ON "-mcpu=power8")
299   endif()
300 endif()
301
302 # Helper values for cmake-gui
303 set(CPU_BASELINE "DETECT" CACHE STRING "${HELP_CPU_BASELINE}")
304 set(CPU_DISPATCH "" CACHE STRING "${HELP_CPU_DISPATCH}")
305 set_property(CACHE CPU_BASELINE PROPERTY STRINGS "" ${CPU_KNOWN_OPTIMIZATIONS})
306 set_property(CACHE CPU_DISPATCH PROPERTY STRINGS "" ${CPU_KNOWN_OPTIMIZATIONS})
307
308 # Update CPU_BASELINE_DETECT flag
309 if(";${CPU_BASELINE};" MATCHES ";DETECT;")
310   set(CPU_BASELINE_DETECT ON)
311 endif()
312
313 set(CPU_BASELINE_FLAGS "")
314
315 set(CPU_BASELINE_FINAL "")
316 set(CPU_DISPATCH_FINAL "")
317
318 if(CV_DISABLE_OPTIMIZATION)
319   set(CPU_DISPATCH "")
320   set(CPU_DISPATCH_REQUIRE "")
321 endif()
322
323 macro(ocv_check_compiler_optimization OPT)
324   if(NOT DEFINED CPU_${OPT}_SUPPORTED)
325     if((DEFINED CPU_${OPT}_FLAGS_ON AND NOT "x${CPU_${OPT}_FLAGS_ON}" STREQUAL "x") OR CPU_${OPT}_TEST_FILE)
326       set(_varname "")
327       if(CPU_${OPT}_TEST_FILE)
328         set(__available 0)
329         if(CPU_BASELINE_DETECT)
330           set(_varname "HAVE_CPU_${OPT}_SUPPORT")
331           ocv_check_compiler_flag(CXX "${CPU_BASELINE_FLAGS}" "${_varname}" "${CPU_${OPT}_TEST_FILE}")
332           if(${_varname})
333             list(APPEND CPU_BASELINE_FINAL ${OPT})
334             set(__available 1)
335           endif()
336         endif()
337         if(NOT __available)
338           if(NOT "x${CPU_${OPT}_FLAGS_NAME}" STREQUAL "x")
339             set(_varname "HAVE_CPU_${CPU_${OPT}_FLAGS_NAME}")
340             set(_compile_flags "${CPU_BASELINE_FLAGS}")
341             ocv_append_optimization_flag(_compile_flags ${OPT})
342             ocv_check_compiler_flag(CXX "${_compile_flags}" "${_varname}" "${CPU_${OPT}_TEST_FILE}")
343           elseif(NOT "x${CPU_${OPT}_FLAGS_ON}" STREQUAL "x")
344             ocv_check_flag_support(CXX "${CPU_${OPT}_FLAGS_ON}" _varname "" "${CPU_${OPT}_TEST_FILE}")
345           else()
346             set(_varname "HAVE_CPU_${OPT}_SUPPORT")
347             set(_compile_flags "${CPU_BASELINE_FLAGS}")
348             ocv_append_optimization_flag(_compile_flags ${OPT})
349             ocv_check_compiler_flag(CXX "${_compile_flags}" "${_varname}" "${CPU_${OPT}_TEST_FILE}")
350           endif()
351         endif()
352       else()
353         ocv_check_flag_support(CXX "${CPU_${OPT}_FLAGS_ON}" _varname "")
354       endif()
355       if(_varname AND ${_varname})
356         set(CPU_${OPT}_SUPPORTED ON)
357       elseif(NOT CPU_${OPT}_SUPPORTED)
358         message(STATUS "${OPT} is not supported by C++ compiler")
359       endif()
360     else()
361       set(CPU_${OPT}_SUPPORTED ON)
362     endif()
363   endif()
364 endmacro()
365
366 foreach(OPT ${CPU_KNOWN_OPTIMIZATIONS})
367   set(CPU_${OPT}_USAGE_COUNT 0 CACHE INTERNAL "")
368   if("${CPU_${OPT}_FLAGS_ON}" STREQUAL "disabled")
369     set(CPU_${OPT}_SUPPORTED OFF)
370   elseif(DEFINED CPU_${OPT}_GROUP)
371     if(NOT DEFINED CPU_${OPT}_IMPLIES)
372       set(CPU_${OPT}_IMPLIES "${CPU_${OPT}_GROUP}")
373     endif()
374     set(__disabled 0)
375     set(__flags "")
376     foreach(OPT2 ${CPU_${OPT}_GROUP})
377       if("${CPU_${OPT2}_FLAGS_ON}" STREQUAL "disabled" OR (DEFINED CPU_${OPT2}_SUPPORTED AND NOT CPU_${OPT}_SUPPORTED))
378         set(__disabled 1)
379       endif()
380       set(__flags "${__flags} ${CPU_${OPT2}_FLAGS_ON}")
381       string(STRIP "${__flags}" __flags)
382     endforeach()
383     if(__disabled)
384       set(CPU_${OPT}_SUPPORTED OFF)
385     else()
386       if(NOT DEFINED CPU_${OPT}_FLAGS_ON)
387         set(CPU_${OPT}_FLAGS_ON "${__flags}")
388       endif()
389     endif()
390   endif()
391   if(NOT DEFINED CPU_${OPT}_FORCE)
392     set(CPU_${OPT}_FORCE "${CPU_${OPT}_IMPLIES}")
393   endif()
394 endforeach()
395
396 if(_add_native_flag)
397   set(_varname "HAVE_CPU_NATIVE_SUPPORT")
398   ocv_check_compiler_flag(CXX "-march=native" "${_varname}" "")
399   if(${_varname})
400     set(CPU_BASELINE_FLAGS "${CPU_BASELINE_FLAGS} -march=native")
401   else()
402     set(_varname "HAVE_CPU_HOST_SUPPORT")
403     if(MSVC)
404       set(_flag "/QxHost")
405     else()
406       set(_flag "-xHost")
407     endif()
408     ocv_check_compiler_flag(CXX "${_flag}" "${_varname}" "")
409     if(${_varname})
410       set(CPU_BASELINE_FLAGS "${CPU_BASELINE_FLAGS} ${_flag}")
411     endif()
412   endif()
413 endif()
414
415 foreach(OPT ${CPU_KNOWN_OPTIMIZATIONS})
416   set(__is_disabled 0)
417   foreach(OPT2 ${CPU_BASELINE_DISABLE})
418     ocv_is_optimization_in_list(__is_disabled ${OPT2} ${OPT})
419     if(__is_disabled)
420       break()
421     endif()
422   endforeach()
423   if(__is_disabled)
424     set(__is_from_baseline 0)
425   else()
426     if(CPU_${OPT}_SUPPORTED AND CPU_BASELINE_DETECT)
427       list(APPEND CPU_BASELINE_FINAL ${OPT})
428     endif()
429     ocv_is_optimization_in_list(__is_from_baseline ${OPT} ${CPU_BASELINE_REQUIRE})
430     if(NOT __is_from_baseline)
431       ocv_is_optimization_in_list(__is_from_baseline ${OPT} ${CPU_BASELINE})
432     endif()
433   endif()
434   ocv_is_optimization_in_list(__is_from_dispatch ${OPT} ${CPU_DISPATCH_REQUIRE})
435   if(NOT __is_from_dispatch)
436     ocv_is_optimization_in_list(__is_from_dispatch ${OPT} ${CPU_DISPATCH})
437   endif()
438   if(__is_from_dispatch OR __is_from_baseline OR CPU_BASELINE_DETECT)
439     ocv_check_compiler_optimization(${OPT})
440   endif()
441   if(CPU_BASELINE_DETECT AND NOT __is_from_baseline AND NOT __is_disabled)
442     ocv_is_optimization_in_list(__is_from_baseline ${OPT} ${CPU_BASELINE_FINAL})
443   endif()
444   if(CPU_${OPT}_SUPPORTED)
445     if(";${CPU_DISPATCH};" MATCHES ";${OPT};" AND NOT __is_from_baseline)
446       list(APPEND CPU_DISPATCH_FINAL ${OPT})
447     elseif(__is_from_baseline)
448       if(NOT ";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
449         list(APPEND CPU_BASELINE_FINAL ${OPT})
450       endif()
451       ocv_append_optimization_flag(CPU_BASELINE_FLAGS ${OPT})
452     endif()
453   endif()
454 endforeach()
455
456 foreach(OPT ${CPU_BASELINE_REQUIRE})
457   if(NOT ";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
458     message(SEND_ERROR "Required baseline optimization is not supported: ${OPT} (CPU_BASELINE_REQUIRE=${CPU_BASELINE_REQUIRE})")
459   endif()
460 endforeach()
461
462 foreach(OPT ${CPU_BASELINE})
463   if(OPT STREQUAL "DETECT" OR OPT STREQUAL "HOST" OR OPT STREQUAL "NATIVE")
464     # nothing
465   elseif(NOT ";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
466     message(STATUS "Optimization ${OPT} is not available, skipped")
467   endif()
468 endforeach()
469
470 foreach(OPT ${CPU_DISPATCH_REQUIRE})
471   if(";${CPU_DISPATCH_FINAL};" MATCHES ";${OPT};")
472     # OK
473   elseif(";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
474     message(SEND_ERROR "Dispatched optimization ${OPT} is in baseline list (CPU_DISPATCH_REQUIRE=${CPU_DISPATCH_REQUIRE})")
475   else()
476     message(SEND_ERROR "Required dispatch optimization is not supported: ${OPT} (CPU_DISPATCH_REQUIRE=${CPU_DISPATCH_REQUIRE})")
477   endif()
478 endforeach()
479
480 foreach(OPT ${CPU_DISPATCH})
481   if(";${CPU_DISPATCH_FINAL};" MATCHES ";${OPT};")
482     # OK
483   elseif(";${CPU_BASELINE_FINAL};" MATCHES ";${OPT};")
484     # OK
485   else()
486     message(STATUS "Dispatch optimization ${OPT} is not available, skipped")
487   endif()
488 endforeach()
489
490 #message(STATUS "CPU_BASELINE_FINAL=${CPU_BASELINE_FINAL}")
491 #message(STATUS "CPU_DISPATCH_FINAL=${CPU_DISPATCH_FINAL}")
492
493 #if(CPU_DISPATCH_FINAL AND NOT PYTHON_DEFAULT_EXECUTABLE)
494 #  message(FATAL_ERROR "Python is required for CPU dispatched optimization support")
495 #endif()
496
497 macro(ocv_compiler_optimization_options)
498   set(__flags "${OPENCV_EXTRA_CXX_FLAGS} ${CPU_BASELINE_FLAGS}")
499   if(NOT __flags STREQUAL CACHED_CPU_BASELINE_FLAGS)
500     set(CACHED_CPU_BASELINE_FLAGS "${__flags}" CACHE INTERNAL "" FORCE)
501     ocv_clear_vars(HAVE_CPU_BASELINE_FLAGS)
502   endif()
503   ocv_check_compiler_flag(CXX "${__flags}" HAVE_CPU_BASELINE_FLAGS)
504   if(NOT HAVE_CPU_BASELINE_FLAGS)
505     message(FATAL_ERROR "Compiler doesn't support baseline optimization flags: ${CPU_BASELINE_FLAGS}")
506   endif()
507   add_extra_compiler_option_force("${CPU_BASELINE_FLAGS}")
508
509   foreach(OPT ${CPU_DISPATCH_FINAL})
510     set(__dispatch_flags "")
511     set(__dispatch_definitions "")
512     set(__dispatch_opts "")
513     set(__dispatch_opts_force "")
514     foreach(OPT2 ${CPU_KNOWN_OPTIMIZATIONS})
515       if(NOT CPU_${OPT2}_SUPPORTED)
516         #continue()
517       else()
518       ocv_is_optimization_in_list(__is_from_baseline ${OPT2} ${CPU_BASELINE_FINAL})
519       if(NOT __is_from_baseline)
520         ocv_is_optimization_in_list(__is_active ${OPT2} ${OPT})
521         if(__is_active)
522           ocv_append_optimization_flag(__dispatch_flags ${OPT2})
523           list(APPEND __dispatch_definitions "CV_CPU_COMPILE_${OPT2}=1")
524           list(APPEND __dispatch_opts "${OPT2}")
525         endif()
526         ocv_is_optimization_in_force_list(__is_force ${OPT2} ${OPT})
527         if(__is_force)
528           list(APPEND __dispatch_opts_force "${OPT2}")
529         endif()
530       endif()
531       endif()
532     endforeach()
533     set(__flags "${OPENCV_EXTRA_CXX_FLAGS} ${__dispatch_flags}")
534     if(NOT __flags STREQUAL CACHED_CPU_DISPATCH_${OPT}_FLAGS)
535       set(CACHED_CPU_DISPATCH_${OPT}_FLAGS "${__flags}" CACHE INTERNAL "" FORCE)
536       ocv_clear_vars(HAVE_CPU_DISPATCH_FLAGS_${OPT})
537     endif()
538     ocv_check_compiler_flag(CXX "${__flags}" HAVE_CPU_DISPATCH_FLAGS_${OPT})
539     if(NOT HAVE_CPU_DISPATCH_FLAGS_${OPT})
540       message(FATAL_ERROR "Compiler doesn't support optimization flags for ${OPT} dispatch mode: ${__dispatch_flags}")
541     endif()
542     set(CPU_DISPATCH_FLAGS_${OPT} "${__dispatch_flags}")
543     set(CPU_DISPATCH_DEFINITIONS_${OPT} "${__dispatch_definitions}")
544     set(CPU_DISPATCH_${OPT}_INCLUDED "${__dispatch_opts}")
545     set(CPU_DISPATCH_${OPT}_FORCED "${__dispatch_opts_force}")
546   endforeach()
547
548   if(ENABLE_POWERPC)
549     add_extra_compiler_option("-mcpu=G3 -mtune=G5")
550   endif()
551   if(ARM)
552     add_extra_compiler_option("-mfp16-format=ieee")
553   endif(ARM)
554 endmacro()
555
556 macro(ocv_compiler_optimization_options_finalize)
557   if((CV_GCC OR CV_CLANG) AND (X86 OR X86_64))
558     if(NOT APPLE AND CMAKE_SIZEOF_VOID_P EQUAL 4)
559       if(OPENCV_EXTRA_CXX_FLAGS MATCHES "-m(sse2|avx)")
560         add_extra_compiler_option(-mfpmath=sse) # !! important - be on the same wave with x64 compilers
561       else()
562         add_extra_compiler_option(-mfpmath=387)
563       endif()
564     endif()
565   endif()
566
567   if(MSVC)
568     # Generate Intrinsic Functions
569     set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /Oi")
570
571     if((X86 OR X86_64) AND CMAKE_SIZEOF_VOID_P EQUAL 4 AND ";${CPU_BASELINE_FINAL};" MATCHES ";SSE;")
572       set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} /fp:fast") # !! important - be on the same wave with x64 compilers
573     endif()
574   endif(MSVC)
575 endmacro()
576
577 macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME TARGET_BASE_NAME)
578   set(__result "")
579   set(__result_libs "")
580   foreach(OPT ${CPU_DISPATCH_FINAL})
581     set(__result_${OPT} "")
582   endforeach()
583   foreach(fname ${${SOURCES_VAR_NAME}})
584     string(TOLOWER "${fname}" fname_LOWER)
585     get_filename_component(fname_LOWER "${fname_LOWER}" NAME)
586     if(fname_LOWER MATCHES ".+\\.([^\\.]*)\\.cpp$")
587       string(TOUPPER "${CMAKE_MATCH_1}" OPT_)
588       if(OPT_ MATCHES "(CUDA.*|DISPATCH.*|OCL)") # don't touch files like filename.cuda.cpp
589         list(APPEND __result "${fname}")
590         #continue()
591       elseif(CV_DISABLE_OPTIMIZATION OR NOT CV_ENABLE_INTRINSICS)
592         ocv_get_smart_file_name(fname_ "${fname}")
593         message(STATUS "Excluding from source files list (optimization is disabled): ${fname_}")
594         #continue()
595       else()
596         get_source_file_property(__definitions "${fname}" COMPILE_DEFINITIONS)
597         if(__definitions)
598           list(APPEND __definitions "CV_CPU_DISPATCH_MODE=${OPT_}")
599         else()
600           set(__definitions "CV_CPU_DISPATCH_MODE=${OPT_}")
601         endif()
602         set_source_files_properties("${fname}" PROPERTIES COMPILE_DEFINITIONS "${__definitions}")
603
604         set(__opt_found 0)
605         foreach(OPT ${CPU_BASELINE_FINAL})
606           string(TOLOWER "${OPT}" OPT_LOWER)
607           if(fname_LOWER MATCHES "\\.${OPT_LOWER}\\.cpp$")
608 #message("${fname} BASELINE-${OPT}")
609             set(__opt_found 1)
610             list(APPEND __result "${fname}")
611             break()
612           endif()
613         endforeach()
614         foreach(OPT ${CPU_DISPATCH_FINAL})
615           foreach(OPT2 ${CPU_DISPATCH_${OPT}_FORCED})
616             string(TOLOWER "${OPT2}" OPT2_LOWER)
617             if(fname_LOWER MATCHES "\\.${OPT2_LOWER}\\.cpp$")
618               list(APPEND __result_${OPT} "${fname}")
619               math(EXPR CPU_${OPT}_USAGE_COUNT "${CPU_${OPT}_USAGE_COUNT}+1")
620               set(CPU_${OPT}_USAGE_COUNT "${CPU_${OPT}_USAGE_COUNT}" CACHE INTERNAL "" FORCE)
621 #message("(${CPU_${OPT}_USAGE_COUNT})${fname} ${OPT}")
622 #message("    ${CPU_DISPATCH_${OPT}_INCLUDED}")
623 #message("    ${CPU_DISPATCH_DEFINITIONS_${OPT}}")
624 #message("    ${CPU_DISPATCH_FLAGS_${OPT}}")
625               set(__opt_found 1)
626               break()
627             endif()
628           endforeach()
629           if(__opt_found)
630             set(__opt_found 1)
631             break()
632           endif()
633         endforeach()
634         if(NOT __opt_found)
635           ocv_get_smart_file_name(fname_ "${fname}")
636           message(STATUS "Excluding from source files list: ${fname_}")
637         endif()
638       endif()
639     else()
640       list(APPEND __result "${fname}")
641     endif()
642   endforeach()
643
644   foreach(OPT ${CPU_DISPATCH_FINAL})
645     if(__result_${OPT})
646 #message("${OPT}: ${__result_${OPT}}")
647       if(CMAKE_GENERATOR MATCHES "^Visual")
648         # extra flags are added before common flags, so switching between optimizations doesn't work correctly
649         # Also CMAKE_CXX_FLAGS doesn't work (it is directory-based, so add_subdirectory is required)
650         add_library(${TARGET_BASE_NAME}_${OPT} OBJECT ${__result_${OPT}})
651         ocv_append_dependant_targets(${TARGET_BASE_NAME} ${TARGET_BASE_NAME}_${OPT})
652         set_target_properties(${TARGET_BASE_NAME}_${OPT} PROPERTIES COMPILE_DEFINITIONS "${CPU_DISPATCH_DEFINITIONS_${OPT}}")
653         set_target_properties(${TARGET_BASE_NAME}_${OPT} PROPERTIES COMPILE_FLAGS "${CPU_DISPATCH_FLAGS_${OPT}}")
654         target_include_directories(${TARGET_BASE_NAME}_${OPT} PRIVATE $<TARGET_PROPERTY:${TARGET_BASE_NAME},INCLUDE_DIRECTORIES>)
655         #list(APPEND __result_libs ${TARGET_BASE_NAME}_${OPT})
656         list(APPEND __result "$<TARGET_OBJECTS:${TARGET_BASE_NAME}_${OPT}>")
657         if(ENABLE_SOLUTION_FOLDERS)
658           set_target_properties(${TARGET_BASE_NAME}_${OPT} PROPERTIES FOLDER "dispatched")
659         endif()
660       else()
661         foreach(fname ${__result_${OPT}})
662           get_source_file_property(__definitions "${fname}" COMPILE_DEFINITIONS)
663           if(__definitions)
664             list(APPEND __definitions "${CPU_DISPATCH_DEFINITIONS_${OPT}}")
665           else()
666             set(__definitions "${CPU_DISPATCH_DEFINITIONS_${OPT}}")
667           endif()
668           set_source_files_properties("${fname}" PROPERTIES COMPILE_DEFINITIONS "${__definitions}")
669           set_source_files_properties("${fname}" PROPERTIES COMPILE_FLAGS "${CPU_DISPATCH_FLAGS_${OPT}}")
670         endforeach()
671         list(APPEND __result ${__result_${OPT}})
672       endif()
673     endif()
674   endforeach()
675   set(${SOURCES_VAR_NAME} "${__result}")
676   list(APPEND ${LIBS_VAR_NAME} ${__result_libs})
677 endmacro()
678
679 macro(ocv_compiler_optimization_fill_cpu_config)
680   set(OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE "")
681   foreach(OPT ${CPU_BASELINE_FINAL})
682     set(OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE}
683 #define CV_CPU_COMPILE_${OPT} 1
684 #define CV_CPU_BASELINE_COMPILE_${OPT} 1
685 ")
686   endforeach()
687
688   set(OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE}
689 #define CV_CPU_BASELINE_FEATURES 0 \\")
690   foreach(OPT ${CPU_BASELINE_FINAL})
691     if(NOT DEFINED CPU_${OPT}_FEATURE_ALIAS OR NOT "x${CPU_${OPT}_FEATURE_ALIAS}" STREQUAL "x")
692       set(OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE}
693     , CV_CPU_${OPT} \\")
694     endif()
695   endforeach()
696   set(OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_BASELINE_DEFINITIONS_CONFIGMAKE}\n")
697
698   set(__dispatch_modes "")
699   foreach(OPT ${CPU_DISPATCH_FINAL})
700     list(APPEND __dispatch_modes ${CPU_DISPATCH_${OPT}_FORCE} ${OPT})
701   endforeach()
702   list(REMOVE_DUPLICATES __dispatch_modes)
703   set(OPENCV_CPU_DISPATCH_DEFINITIONS_CONFIGMAKE "")
704   foreach(OPT ${__dispatch_modes})
705     set(OPENCV_CPU_DISPATCH_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_DISPATCH_DEFINITIONS_CONFIGMAKE}
706 #define CV_CPU_DISPATCH_COMPILE_${OPT} 1")
707   endforeach()
708
709   set(OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE "// AUTOGENERATED, DO NOT EDIT\n")
710   foreach(OPT ${CPU_ALL_OPTIMIZATIONS})
711     if(NOT DEFINED CPU_${OPT}_FEATURE_ALIAS OR NOT "x${CPU_${OPT}_FEATURE_ALIAS}" STREQUAL "x")
712       set(OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE}
713 #if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_${OPT}
714 #  define CV_TRY_${OPT} 1
715 #  define CV_CPU_FORCE_${OPT} 1
716 #  define CV_CPU_HAS_SUPPORT_${OPT} 1
717 #  define CV_CPU_CALL_${OPT}(fn, args) return (cpu_baseline::fn args)
718 #  define CV_CPU_CALL_${OPT}_(fn, args) return (opt_${OPT}::fn args)
719 #elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_${OPT}
720 #  define CV_TRY_${OPT} 1
721 #  define CV_CPU_FORCE_${OPT} 0
722 #  define CV_CPU_HAS_SUPPORT_${OPT} (cv::checkHardwareSupport(CV_CPU_${OPT}))
723 #  define CV_CPU_CALL_${OPT}(fn, args) if (CV_CPU_HAS_SUPPORT_${OPT}) return (opt_${OPT}::fn args)
724 #  define CV_CPU_CALL_${OPT}_(fn, args) if (CV_CPU_HAS_SUPPORT_${OPT}) return (opt_${OPT}::fn args)
725 #else
726 #  define CV_TRY_${OPT} 0
727 #  define CV_CPU_FORCE_${OPT} 0
728 #  define CV_CPU_HAS_SUPPORT_${OPT} 0
729 #  define CV_CPU_CALL_${OPT}(fn, args)
730 #  define CV_CPU_CALL_${OPT}_(fn, args)
731 #endif
732 #define __CV_CPU_DISPATCH_CHAIN_${OPT}(fn, args, mode, ...)  CV_CPU_CALL_${OPT}(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__))
733 ")
734     endif()
735   endforeach()
736
737   set(OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE "${OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE}
738 #define CV_CPU_CALL_BASELINE(fn, args) return (cpu_baseline::fn args)
739 #define __CV_CPU_DISPATCH_CHAIN_BASELINE(fn, args, mode, ...)  CV_CPU_CALL_BASELINE(fn, args) /* last in sequence */
740 ")
741
742
743   set(__file "${OpenCV_SOURCE_DIR}/modules/core/include/opencv2/core/cv_cpu_helper.h")
744   if(EXISTS "${__file}")
745     file(READ "${__file}" __content)
746   endif()
747   if(__content STREQUAL OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE)
748     #message(STATUS "${__file} contains same content")
749   else()
750     file(WRITE "${__file}" "${OPENCV_CPU_CONTROL_DEFINITIONS_CONFIGMAKE}")
751     message(WARNING "${__file} is updated")
752   endif()
753 endmacro()
754
755 macro(ocv_add_dispatched_file filename)
756   if(NOT OPENCV_INITIAL_PASS)
757     set(__codestr "
758 #include \"${CMAKE_CURRENT_LIST_DIR}/src/precomp.hpp\"
759 #include \"${CMAKE_CURRENT_LIST_DIR}/src/${filename}.simd.hpp\"
760 ")
761
762     set(__declarations_str "#define CV_CPU_SIMD_FILENAME \"${CMAKE_CURRENT_LIST_DIR}/src/${filename}.simd.hpp\"")
763     set(__dispatch_modes "BASELINE")
764
765     set(__optimizations "${ARGN}")
766     if(CV_DISABLE_OPTIMIZATION OR NOT CV_ENABLE_INTRINSICS)
767       set(__optimizations "")
768     endif()
769
770     foreach(OPT ${__optimizations})
771       string(TOLOWER "${OPT}" OPT_LOWER)
772       set(__file "${CMAKE_CURRENT_BINARY_DIR}/${filename}.${OPT_LOWER}.cpp")
773       if(EXISTS "${__file}")
774         file(READ "${__file}" __content)
775       else()
776         set(__content "")
777       endif()
778       if(__content STREQUAL __codestr)
779         #message(STATUS "${__file} contains up-to-date content")
780       else()
781         file(WRITE "${__file}" "${__codestr}")
782       endif()
783
784       if(";${CPU_DISPATCH};" MATCHES "${OPT}" OR __CPU_DISPATCH_INCLUDE_ALL)
785         list(APPEND OPENCV_MODULE_${the_module}_SOURCES_DISPATCHED "${__file}")
786       endif()
787
788       set(__declarations_str "${__declarations_str}
789 #define CV_CPU_DISPATCH_MODE ${OPT}
790 #include \"opencv2/core/private/cv_cpu_include_simd_declarations.hpp\"
791 ")
792       set(__dispatch_modes "${OPT}, ${__dispatch_modes}")
793     endforeach()
794
795     set(__declarations_str "${__declarations_str}
796 #define CV_CPU_DISPATCH_MODES_ALL ${__dispatch_modes}
797 ")
798
799     set(__file "${CMAKE_CURRENT_BINARY_DIR}/${filename}.simd_declarations.hpp")
800     if(EXISTS "${__file}")
801       file(READ "${__file}" __content)
802     endif()
803     if(__content STREQUAL __declarations_str)
804       #message(STATUS "${__file} contains up-to-date content")
805     else()
806       file(WRITE "${__file}" "${__declarations_str}")
807     endif()
808   endif()
809 endmacro()
810
811 # Workaround to support code which always require all code paths
812 macro(ocv_add_dispatched_file_force_all)
813   set(__CPU_DISPATCH_INCLUDE_ALL 1)
814   ocv_add_dispatched_file(${ARGN})
815   unset(__CPU_DISPATCH_INCLUDE_ALL)
816 endmacro()
817
818
819 if(CV_DISABLE_OPTIMIZATION OR CV_ICC)
820   ocv_update(CV_ENABLE_UNROLLED 0)
821 else()
822   ocv_update(CV_ENABLE_UNROLLED 1)
823 endif()