File indexing completed on 2024-05-19 04:27:07
0001 /* 0002 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com> 0003 * SPDX-FileCopyrightText: 2022 L. E. Segovia <amy@amyspark.me> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.1-or-later 0006 */ 0007 0008 #ifndef KO_MULTI_ARCH_BUILD_SUPPORT_H 0009 #define KO_MULTI_ARCH_BUILD_SUPPORT_H 0010 0011 #include <utility> 0012 #include <xsimd_extensions/xsimd.hpp> 0013 0014 #include "KisSupportedArchitectures.h" 0015 0016 template<class FactoryType, class... Args> 0017 auto createOptimizedClass(Args &&...param) 0018 { 0019 #ifdef HAVE_XSIMD 0020 const unsigned int best_arch = KisSupportedArchitectures::bestArch(); 0021 0022 #ifdef Q_PROCESSOR_X86 0023 if (xsimd::fma3<xsimd::avx2>::version() <= best_arch) { 0024 return FactoryType::template create<xsimd::fma3<xsimd::avx2>>( 0025 std::forward<Args>(param)...); 0026 } else if (xsimd::avx::version() <= best_arch) { 0027 return FactoryType::template create<xsimd::avx>( 0028 std::forward<Args>(param)...); 0029 } else if (xsimd::sse4_1::version() <= best_arch) { 0030 return FactoryType::template create<xsimd::sse4_1>( 0031 std::forward<Args>(param)...); 0032 } else if (xsimd::ssse3::version() <= best_arch) { 0033 return FactoryType::template create<xsimd::ssse3>( 0034 std::forward<Args>(param)...); 0035 } else if (xsimd::sse2::version() <= best_arch) { 0036 return FactoryType::template create<xsimd::sse2>( 0037 std::forward<Args>(param)...); 0038 } 0039 #elif XSIMD_WITH_NEON64 0040 if (xsimd::neon64::version() <= best_arch) { 0041 return FactoryType::template create<xsimd::neon64>( 0042 std::forward<Args>(param)...); 0043 } 0044 #elif XSIMD_WITH_NEON 0045 if (xsimd::neon::version() <= best_arch) { 0046 return FactoryType::template create<xsimd::neon>( 0047 std::forward<Args>(param)...); 0048 } 0049 #endif // XSIMD_WITH_SSE2 0050 #endif // HAVE_XSIMD 0051 0052 return FactoryType::template create<xsimd::generic>( 0053 std::forward<Args>(param)...); 0054 } 0055 0056 template<class FactoryType, class... Args> 0057 auto createScalarClass(Args &&...params) 0058 { 0059 return FactoryType::template create<xsimd::generic>( 0060 std::forward<Args>(params)...); 0061 } 0062 0063 #endif /* KO_MULTI_ARCH_BUILD_SUPPORT_H */