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 >= 13 && XSIMD_VERSION_MINOR >=1) \
62 || defined(XSIMD_HAS_ARCH_LIST_FIX_PR1032)
63#define XSIMD_SUPPORTS_NEW_ARCH_DETECTION
64#elif XSIMD_VERSION_MAJOR < 13
65#define XSIMD_SUPPORTS_OLD_ARCH_DETECTION
66#endif
67
68template<typename S>
71 : l(log)
72 {
73 }
74
75 template<typename A>
76 void operator()(A arch) const
77 {
78#ifdef XSIMD_SUPPORTS_NEW_ARCH_DETECTION
79 if (xsimd::available_architectures().has(arch)) {
80 l.append(A::name()).append(" ");
81 }
82#else
83 Q_UNUSED(arch)
84#endif
85 }
86
87 S &l;
88};
89
91{
92 static const QString archs = []() {
93 QString archs;
94#ifdef XSIMD_SUPPORTS_NEW_ARCH_DETECTION
95 xsimd::all_architectures::for_each(is_supported_arch<QString>{archs});
96#elif defined XSIMD_SUPPORTS_OLD_ARCH_DETECTION
97 QStringList archsList;
98 auto available = xsimd::available_architectures();
99#define CHECK_ARCH(arch) if (available.arch) archsList << #arch
100 CHECK_ARCH(sse2);
101 CHECK_ARCH(sse3);
102 CHECK_ARCH(ssse3);
103 CHECK_ARCH(sse4_1);
104 CHECK_ARCH(sse4_2);
105 CHECK_ARCH(sse4a);
106 CHECK_ARCH(fma3_sse);
107 CHECK_ARCH(fma4);
108 CHECK_ARCH(xop);
109 CHECK_ARCH(avx);
110 CHECK_ARCH(fma3_avx);
111 CHECK_ARCH(avx2);
112 CHECK_ARCH(fma3_avx2);
113 CHECK_ARCH(avx512f);
114 CHECK_ARCH(avx512cd);
115 CHECK_ARCH(avx512dq);
116 CHECK_ARCH(avx512bw);
117 CHECK_ARCH(neon);
118 CHECK_ARCH(neon64);
119#undef CHECK_ARCH
120 archs = archsList.join(' ');
121#endif
122 return archs;
123 }();
124 return archs;
125}
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