diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-12-16 15:26:57 -0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-12-18 23:45:21 +0000 |
commit | 9b114e569afea5201d7d4ed094454f979de444f4 (patch) | |
tree | 07caa648f6663f3b9402769d8595b42fa0d16d98 /src | |
parent | b441acc1df7a1932289ed3cf73f494ea2aca022f (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.cpp | 6 |
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)); |