summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/painting/qdrawhelper_sse2.cpp30
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;
- }
}
}