diff options
-rw-r--r-- | src/gui/painting/qdrawhelper_sse2.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/gui/painting/qdrawhelper_sse2.cpp b/src/gui/painting/qdrawhelper_sse2.cpp index d11ba0b26c..f5523f7113 100644 --- a/src/gui/painting/qdrawhelper_sse2.cpp +++ b/src/gui/painting/qdrawhelper_sse2.cpp @@ -259,26 +259,32 @@ void qt_memfill32(quint32 *dest, quint32 value, int count) case 12: *dest++ = value; --count; } + const int rest = count & 0x3; + if (rest) { + switch (rest) { + case 3: dest[count - 3] = value; + case 2: dest[count - 2] = value; + case 1: dest[count - 1] = value; + } + } + int count128 = count / 4; __m128i *dst128 = reinterpret_cast<__m128i*>(dest); + __m128i *end128 = dst128 + count128; const __m128i value128 = _mm_set_epi32(value, value, value, value); - int n = (count128 + 3) / 4; + while (dst128 + 3 < end128) { + _mm_stream_si128(dst128 + 0, value128); + _mm_stream_si128(dst128 + 1, value128); + _mm_stream_si128(dst128 + 2, value128); + _mm_stream_si128(dst128 + 3, value128); + dst128 += 4; + } + switch (count128 & 0x3) { - case 0: do { _mm_stream_si128(dst128++, value128); case 3: _mm_stream_si128(dst128++, value128); case 2: _mm_stream_si128(dst128++, value128); case 1: _mm_stream_si128(dst128++, value128); - } while (--n > 0); - } - - const int rest = count & 0x3; - if (rest) { - switch (rest) { - case 3: dest[count - 3] = value; - case 2: dest[count - 2] = value; - case 1: dest[count - 1] = value; - } } } |