diff options
-rw-r--r-- | src/corelib/tools/qsimd.cpp | 33 | ||||
-rw-r--r-- | src/gui/painting/qdrawhelper.cpp | 5 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp index 331a699..4ba8901 100644 --- a/src/corelib/tools/qsimd.cpp +++ b/src/corelib/tools/qsimd.cpp @@ -46,12 +46,18 @@ QT_BEGIN_NAMESPACE uint qDetectCPUFeatures() { + static uint features = 0xffffffff; + if (features != 0xffffffff) + return features; + #if defined (Q_OS_WINCE) #if defined (ARM) - if (IsProcessorFeaturePresent(PF_ARM_INTEL_WMMX)) - return IWMMXT; + if (IsProcessorFeaturePresent(PF_ARM_INTEL_WMMX)) { + features = IWMMXT; + return features; + } #elif defined(_X86_) - uint features = 0; + features = 0; #if defined QT_HAVE_MMX if (IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE)) features |= MMX; @@ -62,16 +68,19 @@ uint qDetectCPUFeatures() #endif return features; #endif - return 0; + features = 0; + return features; #elif defined(QT_HAVE_IWMMXT) // runtime detection only available when running as a previlegied process static const bool doIWMMXT = !qgetenv("QT_NO_IWMMXT").toInt(); - return doIWMMXT ? IWMMXT : 0; + features = doIWMMXT ? IWMMXT : 0 + return features; #elif defined(QT_HAVE_NEON) static const bool doNEON = !qgetenv("QT_NO_NEON").toInt(); - return doNEON ? NEON : 0; + features = doNEON ? NEON : 0 + return features; #else - uint features = 0; + features = 0; #if defined(__x86_64__) || defined(Q_OS_WIN64) features = MMX|SSE|SSE2|CMOV; #elif defined(__ia64__) @@ -207,18 +216,28 @@ uint qDetectCPUFeatures() features |= SSE2; #endif // i386 +#if defined(QT_HAVE_MMX) if (qgetenv("QT_NO_MMX").toInt()) features ^= MMX; +#endif if (qgetenv("QT_NO_MMXEXT").toInt()) features ^= MMXEXT; + +#if defined(QT_HAVE_3DNOW) if (qgetenv("QT_NO_3DNOW").toInt()) features ^= MMX3DNOW; +#endif if (qgetenv("QT_NO_3DNOWEXT").toInt()) features ^= MMX3DNOWEXT; + +#if defined(QT_HAVE_SSE) if (qgetenv("QT_NO_SSE").toInt()) features ^= SSE; +#endif +#if defined(QT_HAVE_SSE2) if (qgetenv("QT_NO_SSE2").toInt()) features ^= SSE2; +#endif return features; #endif diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index b9aa9ce..40fe499 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -7813,10 +7813,7 @@ static void qt_blend_color_argb_armv6(int count, const QSpan *spans, void *userD void qInitDrawhelperAsm() { - static uint features = 0xffffffff; - if (features != 0xffffffff) - return; - features = qDetectCPUFeatures(); + const uint features = qDetectCPUFeatures(); qt_memfill32 = qt_memfill_template<quint32, quint32>; qt_memfill16 = qt_memfill_quint16; //qt_memfill_template<quint16, quint16>; |