summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-12-16 15:26:57 -0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-12-18 23:45:21 +0000
commit9b114e569afea5201d7d4ed094454f979de444f4 (patch)
tree07caa648f6663f3b9402769d8595b42fa0d16d98 /src
parentb441acc1df7a1932289ed3cf73f494ea2aca022f (diff)
QString: don't let the compiler emit unnecessary looping
When AVX2 was enabled, we know we don't need to loop in qt_is_ascii() (QtPrivate::isAscii(QLatin1String)). Change-Id: Ib42b3adc93bf4d43bd55fffd16c14f8f95ae8678 Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit 1a9e7a3aad58426d6162e3ab4aad21b48d004e25) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/text/qstring.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 03373638a6..04cc5cb080 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -469,6 +469,7 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
{
#if defined(__SSE2__)
// Testing for the high bit can be done efficiently with just PMOVMSKB
+ bool loops = true;
# if defined(__AVX2__)
while (ptr + 32 <= end) {
__m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
@@ -480,7 +481,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
}
ptr += 32;
}
+ loops = false;
# endif
+
while (ptr + 16 <= end) {
__m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
quint32 mask = _mm_movemask_epi8(data);
@@ -490,6 +493,9 @@ bool qt_is_ascii(const char *&ptr, const char *end) noexcept
return false;
}
ptr += 16;
+
+ if (!loops)
+ break;
}
if (ptr + 8 <= end) {
__m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));