Chromium Code Reviews| 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); |