summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@nokia.com>2011-03-19 09:47:14 (GMT)
committerThiago Macieira <thiago.macieira@nokia.com>2011-03-22 14:51:54 (GMT)
commitcd0518deb6cf07571f1331ca83d1b5a97b3ca47e (patch)
tree0ddcca1adc2bb728f40b41abefc4fbe75b8b388d
parent152f40fa41bae551dffd7b0ed72ed2008d7ff642 (diff)
downloadQt-cd0518deb6cf07571f1331ca83d1b5a97b3ca47e.zip
Qt-cd0518deb6cf07571f1331ca83d1b5a97b3ca47e.tar.gz
Qt-cd0518deb6cf07571f1331ca83d1b5a97b3ca47e.tar.bz2
Reduce the number of operations in the main loop
The more operations there are, the more time it takes. More importantly, the more variables we touch, the more the compiler may want to use the stack instead of registers.
-rw-r--r--tests/benchmarks/corelib/tools/qstring/main.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/tests/benchmarks/corelib/tools/qstring/main.cpp b/tests/benchmarks/corelib/tools/qstring/main.cpp
index 4e73f14..4a03e5a 100644
--- a/tests/benchmarks/corelib/tools/qstring/main.cpp
+++ b/tests/benchmarks/corelib/tools/qstring/main.cpp
@@ -1516,22 +1516,21 @@ static inline void fromLatin1_epilog(ushort *dst, const char *str, int size)
void fromLatin1_sse2_improved(ushort *dst, const char *str, int size)
{
const __m128i nullMask = _mm_set1_epi32(0);
- while (size >= 16) {
- const __m128i chunk = _mm_loadu_si128((__m128i*)str); // load
+ qptrdiff counter = 0;
+ while (size - counter >= 16) {
+ const __m128i chunk = _mm_loadu_si128((__m128i*)(str + counter)); // load
// unpack the first 8 bytes, padding with zeros
const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
- _mm_storeu_si128((__m128i*)dst, firstHalf); // store
+ _mm_storeu_si128((__m128i*)(dst + counter), firstHalf); // store
// unpack the last 8 bytes, padding with zeros
const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + 8), secondHalf); // store
+ _mm_storeu_si128((__m128i*)(dst + counter + 8), secondHalf); // store
- str += 16;
- dst += 16;
- size -= 16;
+ counter += 16;
}
- fromLatin1_epilog(dst, str, size);
+ fromLatin1_epilog(dst + counter, str + counter, size - counter);
}
void fromLatin1_prolog_unrolled(ushort *dst, const char *str, int size)