diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-09-17 08:32:43 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-09-17 08:32:43 +0200 |
commit | d49d076431d7579ecb33147187fe07eb148112ba (patch) | |
tree | 668370fb9a2eec50000e371125136921ef4518ab /src/gui/painting/qdrawhelper_ssse3.cpp | |
parent | b01e69684b9b36492cc43472edeb72058be9f706 (diff) | |
parent | 35cdcddd605d8823b7b57129e8d7279133a3ca89 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Change-Id: Ic1fd51143f903b7e9086fc19ca960dfd9654ee00
Diffstat (limited to 'src/gui/painting/qdrawhelper_ssse3.cpp')
-rw-r--r-- | src/gui/painting/qdrawhelper_ssse3.cpp | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/gui/painting/qdrawhelper_ssse3.cpp b/src/gui/painting/qdrawhelper_ssse3.cpp index 35d61c3e6c..14d7047bb6 100644 --- a/src/gui/painting/qdrawhelper_ssse3.cpp +++ b/src/gui/painting/qdrawhelper_ssse3.cpp @@ -40,7 +40,7 @@ #include <private/qdrawhelper_x86_p.h> -#ifdef QT_COMPILER_SUPPORTS_SSSE3 +#if defined(QT_COMPILER_SUPPORTS_SSSE3) #include <private/qdrawingprimitive_sse2_p.h> @@ -254,6 +254,49 @@ void qt_memfill24_ssse3(quint24 *dest, quint24 color, qsizetype count) } } +void QT_FASTCALL rbSwap_888_ssse3(uchar *dst, const uchar *src, int count) +{ + int i = 0; + + const static __m128i shuffleMask1 = _mm_setr_epi8(2, 1, 0, 5, 4, 3, 8, 7, 6, 11, 10, 9, 14, 13, 12, /*!!*/15); + const static __m128i shuffleMask2 = _mm_setr_epi8(0, /*!!*/1, 4, 3, 2, 7, 6, 5, 10, 9, 8, 13, 12, 11, /*!!*/14, 15); + const static __m128i shuffleMask3 = _mm_setr_epi8(/*!!*/0, 3, 2, 1, 6, 5, 4, 9, 8, 7, 12, 11, 10, 15, 14, 13); + + for (; i + 15 < count; i += 16) { + __m128i s1 = _mm_loadu_si128((const __m128i *)src); + __m128i s2 = _mm_loadu_si128((const __m128i *)(src + 16)); + __m128i s3 = _mm_loadu_si128((const __m128i *)(src + 32)); + s1 = _mm_shuffle_epi8(s1, shuffleMask1); + s2 = _mm_shuffle_epi8(s2, shuffleMask2); + s3 = _mm_shuffle_epi8(s3, shuffleMask3); + _mm_storeu_si128((__m128i *)dst, s1); + _mm_storeu_si128((__m128i *)(dst + 16), s2); + _mm_storeu_si128((__m128i *)(dst + 32), s3); + + // Now fix the last four misplaced values + std::swap(dst[15], dst[17]); + std::swap(dst[30], dst[32]); + + src += 48; + dst += 48; + } + + if (src != dst) { + SIMD_EPILOGUE(i, count, 15) { + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + dst += 3; + src += 3; + } + } else { + SIMD_EPILOGUE(i, count, 15) { + std::swap(dst[0], dst[2]); + dst += 3; + } + } +} + QT_END_NAMESPACE #endif // QT_COMPILER_SUPPORTS_SSSE3 |