// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #if defined __OPENCV_BUILD \ #include "cv_cpu_config.h" #include "cv_cpu_helper.h" #ifdef CV_CPU_DISPATCH_MODE #define CV_CPU_OPTIMIZATION_NAMESPACE __CV_CAT(opt_, CV_CPU_DISPATCH_MODE) #define CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN namespace __CV_CAT(opt_, CV_CPU_DISPATCH_MODE) { #define CV_CPU_OPTIMIZATION_NAMESPACE_END } #else #define CV_CPU_OPTIMIZATION_NAMESPACE cpu_baseline #define CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN namespace cpu_baseline { #define CV_CPU_OPTIMIZATION_NAMESPACE_END } #endif #define __CV_CPU_DISPATCH_CHAIN_END(fn, args, mode, ...) /* done */ #define __CV_CPU_DISPATCH(fn, args, mode, ...) __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) #define __CV_CPU_DISPATCH_EXPAND(fn, args, ...) __CV_EXPAND(__CV_CPU_DISPATCH(fn, args, __VA_ARGS__)) #define CV_CPU_DISPATCH(fn, args, ...) __CV_CPU_DISPATCH_EXPAND(fn, args, __VA_ARGS__, END) // expand macros #if defined CV_ENABLE_INTRINSICS \ && !defined CV_DISABLE_OPTIMIZATION \ && !defined __CUDACC__ /* do not include SSE/AVX/NEON headers for NVCC compiler */ \ #ifdef CV_CPU_COMPILE_SSE2 # include # define CV_MMX 1 # define CV_SSE 1 # define CV_SSE2 1 #endif #ifdef CV_CPU_COMPILE_SSE3 # include # define CV_SSE3 1 #endif #ifdef CV_CPU_COMPILE_SSSE3 # include # define CV_SSSE3 1 #endif #ifdef CV_CPU_COMPILE_SSE4_1 # include # define CV_SSE4_1 1 #endif #ifdef CV_CPU_COMPILE_SSE4_2 # include # define CV_SSE4_2 1 #endif #ifdef CV_CPU_COMPILE_POPCNT # ifdef _MSC_VER # include # if defined(_M_X64) # define CV_POPCNT_U64 _mm_popcnt_u64 # endif # define CV_POPCNT_U32 _mm_popcnt_u32 # else # include # if defined(__x86_64__) # define CV_POPCNT_U64 __builtin_popcountll # endif # define CV_POPCNT_U32 __builtin_popcount # endif # define CV_POPCNT 1 #endif #ifdef CV_CPU_COMPILE_AVX # include # define CV_AVX 1 #endif #ifdef CV_CPU_COMPILE_FP16 # if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) # include # else # include # endif # define CV_FP16 1 #endif #ifdef CV_CPU_COMPILE_AVX2 # include # define CV_AVX2 1 #endif #ifdef CV_CPU_COMPILE_FMA3 # define CV_FMA3 1 #endif #if defined _WIN32 && defined(_M_ARM) # include # include # define CV_NEON 1 #elif defined(__ARM_NEON__) || (defined (__ARM_NEON) && defined(__aarch64__)) # include # define CV_NEON 1 #endif #if defined(__ARM_NEON__) || defined(__aarch64__) # include #endif #if defined(__VSX__) && defined(__PPC64__) && defined(__LITTLE_ENDIAN__) # include # undef vector # undef pixel # undef bool # define CV_VSX 1 #endif #endif // CV_ENABLE_INTRINSICS && !CV_DISABLE_OPTIMIZATION && !__CUDACC__ #if defined CV_CPU_COMPILE_AVX && !defined CV_CPU_BASELINE_COMPILE_AVX struct VZeroUpperGuard { #ifdef __GNUC__ __attribute__((always_inline)) #endif inline ~VZeroUpperGuard() { _mm256_zeroupper(); } }; #define __CV_AVX_GUARD VZeroUpperGuard __vzeroupper_guard; (void)__vzeroupper_guard; #endif #ifdef __CV_AVX_GUARD #define CV_AVX_GUARD __CV_AVX_GUARD #else #define CV_AVX_GUARD #endif #endif // __OPENCV_BUILD #if !defined __OPENCV_BUILD /* Compatibility code */ \ && !defined __CUDACC__ /* do not include SSE/AVX/NEON headers for NVCC compiler */ #if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2) # include # define CV_MMX 1 # define CV_SSE 1 # define CV_SSE2 1 #elif defined _WIN32 && defined(_M_ARM) # include # include # define CV_NEON 1 #elif defined(__ARM_NEON__) || (defined (__ARM_NEON) && defined(__aarch64__)) # include # define CV_NEON 1 #elif defined(__VSX__) && defined(__PPC64__) && defined(__LITTLE_ENDIAN__) # include # undef vector # undef pixel # undef bool # define CV_VSX 1 #endif #endif // !__OPENCV_BUILD && !__CUDACC (Compatibility code) #ifndef CV_MMX # define CV_MMX 0 #endif #ifndef CV_SSE # define CV_SSE 0 #endif #ifndef CV_SSE2 # define CV_SSE2 0 #endif #ifndef CV_SSE3 # define CV_SSE3 0 #endif #ifndef CV_SSSE3 # define CV_SSSE3 0 #endif #ifndef CV_SSE4_1 # define CV_SSE4_1 0 #endif #ifndef CV_SSE4_2 # define CV_SSE4_2 0 #endif #ifndef CV_POPCNT # define CV_POPCNT 0 #endif #ifndef CV_AVX # define CV_AVX 0 #endif #ifndef CV_FP16 # define CV_FP16 0 #endif #ifndef CV_AVX2 # define CV_AVX2 0 #endif #ifndef CV_FMA3 # define CV_FMA3 0 #endif #ifndef CV_AVX_512F # define CV_AVX_512F 0 #endif #ifndef CV_AVX_512BW # define CV_AVX_512BW 0 #endif #ifndef CV_AVX_512CD # define CV_AVX_512CD 0 #endif #ifndef CV_AVX_512DQ # define CV_AVX_512DQ 0 #endif #ifndef CV_AVX_512ER # define CV_AVX_512ER 0 #endif #ifndef CV_AVX_512IFMA512 # define CV_AVX_512IFMA512 0 #endif #ifndef CV_AVX_512PF # define CV_AVX_512PF 0 #endif #ifndef CV_AVX_512VBMI # define CV_AVX_512VBMI 0 #endif #ifndef CV_AVX_512VL # define CV_AVX_512VL 0 #endif #ifndef CV_NEON # define CV_NEON 0 #endif #ifndef CV_VSX # define CV_VSX 0 #endif