summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qdrawhelper_avx2.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-01-31 16:13:16 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-07 14:27:47 +0000
commit60addee9384cb8c589f7abf9020f7d6d7a6f4d63 (patch)
tree2a55252db920f78421c03e9130a2080cba7793c3 /src/gui/painting/qdrawhelper_avx2.cpp
parent928cab5ff1d931d00074d8930c41537109814371 (diff)
Improve ARGB32ToRGBA64 conversions
Improves the precision so 255 values map to 65535 exactly. Change-Id: I366f408e8c6047d52acbed35e9d665249bbaba2b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/gui/painting/qdrawhelper_avx2.cpp')
-rw-r--r--src/gui/painting/qdrawhelper_avx2.cpp28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/gui/painting/qdrawhelper_avx2.cpp b/src/gui/painting/qdrawhelper_avx2.cpp
index f05cc0926e..2b3cc9b226 100644
--- a/src/gui/painting/qdrawhelper_avx2.cpp
+++ b/src/gui/painting/qdrawhelper_avx2.cpp
@@ -1135,14 +1135,12 @@ static void convertARGBToRGBA64PM_avx2(QRgba64 *buffer, const uint *src, qsizety
const __m256i src1 = _mm256_unpacklo_epi8(srcVector, srcVector);
const __m256i src2 = _mm256_unpackhi_epi8(srcVector, srcVector);
if (!cf) {
- dst1 = _mm256_unpacklo_epi8(srcVector, zero);
- dst2 = _mm256_unpackhi_epi8(srcVector, zero);
- const __m256i alpha1 = _mm256_shuffle_epi8(dst1, shuffleMask);
- const __m256i alpha2 = _mm256_shuffle_epi8(dst2, shuffleMask);
- dst1 = _mm256_mullo_epi16(dst1, alpha1);
- dst2 = _mm256_mullo_epi16(dst2, alpha2);
- dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 7));
- dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 7));
+ const __m256i alpha1 = _mm256_shuffle_epi8(src1, shuffleMask);
+ const __m256i alpha2 = _mm256_shuffle_epi8(src2, shuffleMask);
+ dst1 = _mm256_mulhi_epu16(src1, alpha1);
+ dst2 = _mm256_mulhi_epu16(src2, alpha2);
+ dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 15));
+ dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 15));
dst1 = _mm256_blend_epi16(dst1, src1, 0x88);
dst2 = _mm256_blend_epi16(dst2, src2, 0x88);
} else {
@@ -1171,14 +1169,12 @@ static void convertARGBToRGBA64PM_avx2(QRgba64 *buffer, const uint *src, qsizety
const __m256i src1 = _mm256_unpacklo_epi8(srcVector, srcVector);
const __m256i src2 = _mm256_unpackhi_epi8(srcVector, srcVector);
if (!cf) {
- dst1 = _mm256_unpacklo_epi8(srcVector, zero);
- dst2 = _mm256_unpackhi_epi8(srcVector, zero);
- const __m256i alpha1 = _mm256_shuffle_epi8(dst1, shuffleMask);
- const __m256i alpha2 = _mm256_shuffle_epi8(dst2, shuffleMask);
- dst1 = _mm256_mullo_epi16(dst1, alpha1);
- dst2 = _mm256_mullo_epi16(dst2, alpha2);
- dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 7));
- dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 7));
+ const __m256i alpha1 = _mm256_shuffle_epi8(src1, shuffleMask);
+ const __m256i alpha2 = _mm256_shuffle_epi8(src2, shuffleMask);
+ dst1 = _mm256_mulhi_epu16(src1, alpha1);
+ dst2 = _mm256_mulhi_epu16(src2, alpha2);
+ dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 15));
+ dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 15));
dst1 = _mm256_blend_epi16(dst1, src1, 0x88);
dst2 = _mm256_blend_epi16(dst2, src2, 0x88);
} else {