93 {
95 __m128i src_scale = _mm_set1_epi16(alpha);
96
97 __m128i dst_scale = _mm_srli_epi32(
src, 24);
98
99 dst_scale = _mm_mullo_epi16(dst_scale, src_scale);
100 dst_scale = _mm_sub_epi32(_mm_set1_epi32(0xFFFF), dst_scale);
101 dst_scale = _mm_add_epi32(dst_scale, _mm_srli_epi32(dst_scale, 8));
102 dst_scale = _mm_srli_epi32(dst_scale, 8);
103
104 dst_scale = _mm_shufflelo_epi16(dst_scale, _MM_SHUFFLE(2, 2, 0, 0));
105 dst_scale = _mm_shufflehi_epi16(dst_scale, _MM_SHUFFLE(2, 2, 0, 0));
106
107 const __m128i mask = _mm_set1_epi32(0x00FF00FF);
108
109
110 __m128i src_rb = _mm_and_si128(mask,
src);
111 __m128i src_ag = _mm_srli_epi16(
src, 8);
112 __m128i dst_rb = _mm_and_si128(mask,
dst);
113 __m128i dst_ag = _mm_srli_epi16(
dst, 8);
114
115
116 src_rb = _mm_mullo_epi16(src_rb, src_scale);
117 src_ag = _mm_mullo_epi16(src_ag, src_scale);
118 dst_rb = _mm_mullo_epi16(dst_rb, dst_scale);
119 dst_ag = _mm_mullo_epi16(dst_ag, dst_scale);
120
121
122 dst_rb = _mm_add_epi16(src_rb, dst_rb);
123 dst_ag = _mm_add_epi16(src_ag, dst_ag);
124
125
126 dst_rb = _mm_srli_epi16(dst_rb, 8);
127 dst_ag = _mm_andnot_si128(mask, dst_ag);
128 return _mm_or_si128(dst_rb, dst_ag);
129 }