From dcb2ea1344a08c397dbdd125c2787d33ebfd4fc7 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 18 Mar 2011 16:29:27 +0100 Subject: Add the SSE2 code we have in Qt 4.7 to the benchmark --- tests/benchmarks/corelib/tools/qstring/main.cpp | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/benchmarks/corelib/tools/qstring/main.cpp b/tests/benchmarks/corelib/tools/qstring/main.cpp index f957eee..5513724 100644 --- a/tests/benchmarks/corelib/tools/qstring/main.cpp +++ b/tests/benchmarks/corelib/tools/qstring/main.cpp @@ -1449,6 +1449,31 @@ void fromLatin1_regular(QChar *dst, const char *str, int size) *dst++ = (uchar)*str++; } +void fromLatin1_sse2_qt47(QChar *dst, const char *str, int size) +{ + if (size >= 16) { + int chunkCount = size >> 4; // divided by 16 + const __m128i nullMask = _mm_set1_epi32(0); + for (int i = 0; i < chunkCount; ++i) { + const __m128i chunk = _mm_loadu_si128((__m128i*)str); // load + str += 16; + + // unpack the first 8 bytes, padding with zeros + const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask); + _mm_storeu_si128((__m128i*)dst, firstHalf); // store + dst += 8; + + // unpack the last 8 bytes, padding with zeros + const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask); + _mm_storeu_si128((__m128i*)dst, secondHalf); // store + dst += 8; + } + size = size % 16; + } + while (size--) + *dst++ = (uchar)*str++; +} + typedef void (* FromLatin1Function)(QChar *, const char *, int); Q_DECLARE_METATYPE(FromLatin1Function) @@ -1456,6 +1481,7 @@ void tst_QString::fromLatin1Alternatives_data() const { QTest::addColumn("function"); QTest::newRow("regular") << &fromLatin1_regular; + QTest::newRow("sse2-qt4.7") << &fromLatin1_sse2_qt47; } static void fromLatin1Alternatives_internal(FromLatin1Function function, bool doVerify) -- cgit v0.12