Index: src/opts/SkColor_opts_SSE2.h |
diff --git a/src/opts/SkColor_opts_SSE2.h b/src/opts/SkColor_opts_SSE2.h |
index 741d1ab77732cdfb41c1a8f8a4aa2f8ca426484b..c14b9ada900f6e26cabac1c2ef6b52c0ab993a74 100644 |
--- a/src/opts/SkColor_opts_SSE2.h |
+++ b/src/opts/SkColor_opts_SSE2.h |
@@ -63,6 +63,23 @@ static inline __m128i SkAlphaMulQ_SSE2(const __m128i& c, const __m128i& scale) { |
return _mm_or_si128(rb, ag); |
} |
+// Fast path for colors scale the same factor. |
mtklein
2014/11/24 16:48:23
Maybe // Fast path for SkAlphaMulQ_SSE2 with a co
qiankun
2014/11/25 05:33:52
Done.
|
+static inline __m128i SkAlphaMulQ_SSE2(const __m128i& c, const unsigned scale) { |
+ __m128i mask = _mm_set1_epi32(0xFF00FF); |
+ __m128i s = _mm_set1_epi16(scale << 8); // Move scale factor to upper byte of word. |
+ |
+ // With mulhi, red and blue values are already in the right place and |
+ // don't need to be divided by 256. |
+ __m128i rb = _mm_and_si128(mask, c); |
+ rb = _mm_mulhi_epu16(rb, s); |
+ |
+ __m128i ag = _mm_srli_epi16(c, 8); |
+ ag = _mm_mulhi_epu16(ag, s); // Alpha and green values are in the lower byte of each word. |
+ ag = _mm_slli_epi16(ag, 8); // Shift alpha and green to higher byte of each word. |
+ |
+ return _mm_or_si128(rb, ag); |
+} |
+ |
static inline __m128i SkGetPackedA32_SSE2(const __m128i& src) { |
__m128i a = _mm_slli_epi32(src, (24 - SK_A32_SHIFT)); |
return _mm_srli_epi32(a, 24); |