Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSupportedArchitectures.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 L. E. Segovia <amy@amyspark.me>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <KConfigGroup>
10#include <KSharedConfig>
11#include <kis_debug.h>
12
14
16
18{
19 return xsimd::current_arch::name();
20}
21
22namespace detail
23{
25{
26 virtual ~ArchToStringBase() = default;
27 virtual QString name() const = 0;
28};
29
30template <typename arch>
32 QString name() const override {
33 return arch::name();
34 }
35};
36
37#if XSIMD_VERSION_MAJOR < 13
38template <>
40 QString name() const override {
41 return "generic";
42 }
43};
44#endif
45
47 template <typename arch>
49 return new ArchToString<arch>();
50 }
51};
52
53}
54
56{
57 detail::ArchToStringBase *archDetector = createOptimizedClass<detail::ArchToStringFactory>();
58 return archDetector->name();
59}
60
61#if (XSIMD_VERSION_MAJOR >= 14) \
62 || (XSIMD_VERSION_MAJOR == 13 && XSIMD_VERSION_MINOR >=1) \
63 || defined(XSIMD_HAS_ARCH_LIST_FIX_PR1032)
64#define XSIMD_SUPPORTS_NEW_ARCH_DETECTION
65#elif XSIMD_VERSION_MAJOR < 13
66#define XSIMD_SUPPORTS_OLD_ARCH_DETECTION
67#endif
68
69template<typename S>
72 : l(log)
73 {
74 }
75
76 template<typename A>
77 void operator()(A arch) const
78 {
79#ifdef XSIMD_SUPPORTS_NEW_ARCH_DETECTION
80 if (xsimd::available_architectures().has(arch)) {
81 l.append(A::name()).append(" ");
82 }
83#else
84 Q_UNUSED(arch)
85#endif
86 }
87
88 S &l;
89};
90
92{
93 static const QString archs = []() {
94 QString archs;
95#ifdef XSIMD_SUPPORTS_NEW_ARCH_DETECTION
96 xsimd::all_architectures::for_each(is_supported_arch<QString>{archs});
97#elif defined XSIMD_SUPPORTS_OLD_ARCH_DETECTION
98 QStringList archsList;
99 auto available = xsimd::available_architectures();
100#define CHECK_ARCH(arch) if (available.arch) archsList << #arch
101 CHECK_ARCH(sse2);
102 CHECK_ARCH(sse3);
103 CHECK_ARCH(ssse3);
104 CHECK_ARCH(sse4_1);
105 CHECK_ARCH(sse4_2);
106 CHECK_ARCH(sse4a);
107 CHECK_ARCH(fma3_sse);
108 CHECK_ARCH(fma4);
109 CHECK_ARCH(xop);
110 CHECK_ARCH(avx);
111 CHECK_ARCH(fma3_avx);
112 CHECK_ARCH(avx2);
113 CHECK_ARCH(fma3_avx2);
114 CHECK_ARCH(avx512f);
115 CHECK_ARCH(avx512cd);
116 CHECK_ARCH(avx512dq);
117 CHECK_ARCH(avx512bw);
118 CHECK_ARCH(neon);
119 CHECK_ARCH(neon64);
120#undef CHECK_ARCH
121 archs = archsList.join(' ');
122#endif
123 return archs;
124 }();
125 return archs;
126}
Eigen::Matrix< double, 4, 2 > S
#define CHECK_ARCH(arch)
virtual ~ArchToStringBase()=default
virtual QString name() const =0
static ArchToStringBase * create()
QString name() const override