19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qsimd.h>
27#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
28 for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
30#define ALIGNMENT_PROLOGUE_32BYTES(ptr, i, length) \
31 for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((8 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x7)) & 0x7))); ++i)
33#define SIMD_EPILOGUE(i, length, max) \
34 for (int _i = 0; _i < max && i < length; ++i, ++_i)
96#if defined(__MINGW64_VERSION_MAJOR) || defined(Q_CC_MSVC)
100#define QT_COMPILER_SUPPORTS(x) (QT_COMPILER_SUPPORTS_ ## x - 0)
102#if defined(Q_PROCESSOR_ARM)
103# define QT_COMPILER_SUPPORTS_HERE(x) ((__ARM_FEATURE_ ## x) || (__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
104# if defined(Q_CC_GNU)
106# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
108# define QT_FUNCTION_TARGET(x)
110#elif defined(Q_PROCESSOR_MIPS)
111# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
112# define QT_FUNCTION_TARGET(x)
113# if !defined(__MIPS_DSP__) && defined(__mips_dsp) && defined(Q_PROCESSOR_MIPS_32)
116# if !defined(__MIPS_DSPR2__) && defined(__mips_dspr2) && defined(Q_PROCESSOR_MIPS_32)
117# define __MIPS_DSPR2__
119#elif defined(Q_PROCESSOR_X86)
120# if defined(Q_CC_CLANG) && defined(Q_CC_MSVC)
121# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
123# define QT_COMPILER_SUPPORTS_HERE(x) ((__ ## x ## __) || QT_COMPILER_SUPPORTS(x))
125# if defined(Q_CC_GNU)
127# define QT_FUNCTION_TARGET(x) __attribute__((__target__(QT_FUNCTION_TARGET_STRING_ ## x)))
129# define QT_FUNCTION_TARGET(x)
132# define QT_COMPILER_SUPPORTS_HERE(x) (__ ## x ## __)
133# define QT_FUNCTION_TARGET(x)
136#if defined(__SSE2__) && !defined(QT_COMPILER_SUPPORTS_SSE2) && !defined(QT_BOOTSTRAPPED)
162# undef __AVX512IFMA__
163# undef __AVX512VBMI__
165# undef __AVX512VBMI2__
166# undef __AVX512BITALG__
167# undef __AVX512VNNI__
168# undef __AVX512VPOPCNTDQ__
173#ifdef Q_PROCESSOR_X86
176# if defined(QT_COMPILER_SUPPORTS_RDSEED) && defined(Q_OS_QNX)
178# undef QT_COMPILER_SUPPORTS_RDSEED
180# if defined(Q_CC_MSVC) && (defined(_M_X64) || _M_IX86_FP >= 2)
185# if defined(Q_OS_WIN) && defined(Q_CC_GNU) && !defined(Q_CC_CLANG)
190 ".macro vmovapd args:vararg\n"
193 ".macro vmovaps args:vararg\n"
196 ".macro vmovdqa args:vararg\n"
199 ".macro vmovdqa32 args:vararg\n"
200 " vmovdqu32 \\args\n"
202 ".macro vmovdqa64 args:vararg\n"
203 " vmovdqu64 \\args\n"
208# if defined(Q_CC_GNU) && !defined(Q_OS_WASM)
210# include <x86intrin.h>
213# include <immintrin.h>
216# include <QtCore/private/qsimd_x86_p.h>
229# define ARCH_HASWELL_MACROS (__AVX2__ + __FMA__)
230# if ARCH_HASWELL_MACROS != 0
231# if ARCH_HASWELL_MACROS != 2
232# error "Please enable all x86-64-v3 extensions; you probably want to use -march=haswell or -march=x86-64-v3 instead of -mavx2"
234static_assert(ARCH_HASWELL_MACROS,
"Undeclared identifiers indicate which features are missing.");
235# define __haswell__ 1
237# undef ARCH_HASWELL_MACROS
245# define ARCH_SKX_MACROS (__AVX512F__ + __AVX512BW__ + __AVX512CD__ + __AVX512DQ__ + __AVX512VL__)
246# if ARCH_SKX_MACROS != 0
247# if ARCH_SKX_MACROS != 5
248# error "Please enable all x86-64-v4 extensions; you probably want to use -march=skylake-avx512 or -march=x86-64-v4 instead of -mavx512f"
250static_assert(ARCH_SKX_MACROS,
"Undeclared identifiers indicate which features are missing.");
251# define __skylake_avx512__ 1
253# undef ARCH_SKX_MACROS
258#if defined(__ARM_NEON) || defined(__ARM_NEON__)
259#if defined(Q_CC_CLANG)
260#define QT_FUNCTION_TARGET_STRING_NEON "neon"
262#define QT_FUNCTION_TARGET_STRING_NEON "+neon"
269#ifndef Q_PROCESSOR_ARM_64
270inline uint16_t vaddvq_u16(uint16x8_t v8)
272 const uint64x2_t
v2 = vpaddlq_u32(vpaddlq_u16(v8));
273 const uint64x1_t
v1 = vadd_u64(vget_low_u64(
v2), vget_high_u64(
v2));
274 return vget_lane_u16(vreinterpret_u16_u64(
v1), 0);
277inline uint8_t vaddv_u8(uint8x8_t v8)
279 const uint64x1_t
v1 = vpaddl_u32(vpaddl_u16(vpaddl_u8(v8)));
280 return vget_lane_u8(vreinterpret_u8_u64(
v1), 0);
286#if defined(Q_PROCESSOR_ARM) && defined(__ARM_FEATURE_CRC32)
287# include <arm_acle.h>
290#if defined(Q_PROCESSOR_ARM_64)
291#if defined(Q_CC_CLANG)
292#define QT_FUNCTION_TARGET_STRING_AES "crypto"
293#define QT_FUNCTION_TARGET_STRING_CRC32 "crc"
294#elif defined(Q_CC_GNU)
295#define QT_FUNCTION_TARGET_STRING_AES "+crypto"
296#define QT_FUNCTION_TARGET_STRING_CRC32 "+crc"
298#elif defined(Q_PROCESSOR_ARM_32)
299#if defined(Q_CC_CLANG)
300#define QT_FUNCTION_TARGET_STRING_AES "armv8-a,crypto"
301#define QT_FUNCTION_TARGET_STRING_CRC32 "armv8-a,crc"
302#elif defined(Q_CC_GNU)
303#define QT_FUNCTION_TARGET_STRING_AES "arch=armv8-a+crypto"
304#define QT_FUNCTION_TARGET_STRING_CRC32 "arch=armv8-a+crc"
308#ifndef Q_PROCESSOR_X86
310#if defined(Q_PROCESSOR_ARM)
312 CpuFeatureARM_NEON = CpuFeatureNEON,
315 CpuFeatureARM_CRYPTO = CpuFeatureAES,
316#elif defined(Q_PROCESSOR_MIPS)
323#if defined __ARM_NEON__
326#if defined __ARM_FEATURE_CRC32
329#if defined __ARM_FEATURE_CRYPTO
332#if defined __mips_dsp
335#if defined __mips_dspr2
343# define Q_ATOMIC(T) std::atomic<T>
345using std::atomic_load_explicit;
346static constexpr auto memory_order_relaxed = std::memory_order_relaxed;
349# include <stdatomic.h>
350# define Q_ATOMIC(T) _Atomic(T)
353#ifdef Q_PROCESSOR_X86
366#ifdef QT_BOOTSTRAPPED
378#define qCpuHasFeature(feature) (((qCompilerCpuFeatures & CpuFeature ## feature) == CpuFeature ## feature) \
379 || ((qCpuFeatures() & CpuFeature ## feature) == CpuFeature ## feature))
405#if defined(Q_PROCESSOR_X86)
407#elif defined(Q_PROCESSOR_ARM) && Q_PROCESSOR_ARM >= 7
408# if __has_builtin(__builtin_arm_yield)
409 __builtin_arm_yield();
410# elif defined(Q_OS_INTEGRITY) || defined(Q_CC_GNU_ONLY)
417 asm volatile(
"yield");
427# if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
430static inline bool qHasHwrng()
439static inline bool qHasHwrng()
Combined button and popup list for selecting options.
#define QT_WARNING_DISABLE_INTEL(number)
#define QT_WARNING_DISABLE_GCC(text)
#define QT_WARNING_DISABLE_CLANG(text)
#define QT_SUPPORTS_INIT_PRIORITY
GLint GLfloat GLfloat GLfloat v2
#define qCpuHasFeature(feature)
Q_CORE_EXPORT uint64_t QT_MANGLE_NAMESPACE() qDetectCpuFeatures()
static const uint64_t qCompilerCpuFeatures
static uint64_t qCpuFeatures()
static const uint64_t _compilerCpuFeatures
#define cpu_skylake_avx512
#define QT_MANGLE_NAMESPACE(name)
unsigned long long quint64