23{
24 bool useVectorization = true;
25 bool disableAVXOptimizations = false;
26
27 std::tie(useVectorization, disableAVXOptimizations) =
29
30 if (!useVectorization) {
31 qWarning() << "WARNING: vector instructions disabled by the "
32 "\'amdDisableVectorWorkaround\' option!";
33 return FactoryType::template create<xsimd::generic>(
34 std::forward<Args>(param)...);
35 }
36
37 if (disableAVXOptimizations
38 && (xsimd::available_architectures().fma3_avx2
39 || xsimd::available_architectures().avx)) {
40 qWarning() << "WARNING: AVX and AVX2 optimizations are disabled by the "
41 "\'disableAVXOptimizations\' option!";
42 }
43
44#ifdef Q_PROCESSOR_X86
45
46 if (!disableAVXOptimizations &&
47 xsimd::available_architectures().fma3_avx2) {
48
49 return FactoryType::template create<xsimd::fma3<xsimd::avx2>>(
50 std::forward<Args>(param)...);
51
52 } else if (!disableAVXOptimizations &&
53 xsimd::available_architectures().avx) {
54
55 return FactoryType::template create<xsimd::avx>(
56 std::forward<Args>(param)...);
57
58 } else if (xsimd::available_architectures().sse4_1) {
59 return FactoryType::template create<xsimd::sse4_1>(
60 std::forward<Args>(param)...);
61 } else if (xsimd::available_architectures().ssse3) {
62 return FactoryType::template create<xsimd::ssse3>(
63 std::forward<Args>(param)...);
64 } else if (xsimd::available_architectures().sse2) {
65 return FactoryType::template create<xsimd::sse2>(
66 std::forward<Args>(param)...);
67 }
68#elif XSIMD_WITH_NEON64
69 if (xsimd::available_architectures().neon64) {
70 return FactoryType::template create<xsimd::neon64>(
71 std::forward<Args>(param)...);
72 }
73#elif XSIMD_WITH_NEON
74 if (xsimd::available_architectures().neon) {
75 return FactoryType::template create<xsimd::neon>(
76 std::forward<Args>(param)...);
77 }
78#endif
79
80 return FactoryType::template create<xsimd::generic>(
81 std::forward<Args>(param)...);
82}
KRITAMULTIARCH_EXPORT std::tuple< bool, bool > vectorizationConfiguration()