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 */