qt_is_ascii: improve isAscii a little further (QUrl, QLatin1String)
Turns out that the non-AVX2 code was beating the performance of the AVX2 because the simdTestMask function did a little too much. So just use the same VPMOVMSKB technique for it. Change-Id: I0825ff5b5f6f4c85939ffffd152f3b636ab998db Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
This commit is contained in:
parent
8d19afcc81
commit
c780434ba2
@ -311,12 +311,19 @@ bool QtPrivate::isAscii(QLatin1String s) Q_DECL_NOTHROW
|
|||||||
const char *ptr = s.begin();
|
const char *ptr = s.begin();
|
||||||
const char *end = s.end();
|
const char *end = s.end();
|
||||||
|
|
||||||
#if defined(__AVX2__)
|
#if defined(__SSE2__)
|
||||||
if (!simdTestMask(ptr, end, 0x80808080))
|
|
||||||
return false;
|
|
||||||
#elif defined(__SSE2__)
|
|
||||||
// Testing for the high bit can be done efficiently with just PMOVMSKB
|
// Testing for the high bit can be done efficiently with just PMOVMSKB
|
||||||
while (ptr + 16 < end) {
|
# if defined(__AVX2__)
|
||||||
|
while (ptr + 32 <= end) {
|
||||||
|
__m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
|
||||||
|
quint32 mask = _mm256_movemask_epi8(data);
|
||||||
|
if (mask)
|
||||||
|
return false;
|
||||||
|
ptr += 32;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
while (ptr + 16 <= end) {
|
||||||
__m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
|
__m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
|
||||||
quint32 mask = _mm_movemask_epi8(data);
|
quint32 mask = _mm_movemask_epi8(data);
|
||||||
if (mask)
|
if (mask)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user