Merge commit 'a1a143adb0fd11c474221431417cff25db7d920f'
[ffmpeg.git] / libavcodec / mips / h264chroma_msa.c
1 /*
2  * Copyright (c) 2015 - 2017 Shivraj Patil (Shivraj.Patil@imgtec.com)
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "libavutil/mips/generic_macros_msa.h"
22 #include "h264chroma_mips.h"
23
24 static const uint8_t chroma_mask_arr[16 * 5] = {
25     0, 1, 1, 2, 2, 3, 3, 4, 16, 17, 17, 18, 18, 19, 19, 20,
26     0, 2, 2, 4, 4, 6, 6, 8, 16, 18, 18, 20, 20, 22, 22, 24,
27     0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
28     0, 1, 1, 2, 16, 17, 17, 18, 4, 5, 5, 6, 6, 7, 7, 8,
29     0, 1, 1, 2, 16, 17, 17, 18, 16, 17, 17, 18, 18, 19, 19, 20
30 };
31
32 static void avc_chroma_hz_2x2_msa(uint8_t *src, uint8_t *dst, int32_t stride,
33                                   uint32_t coeff0, uint32_t coeff1)
34 {
35     uint16_t out0, out1;
36     v16i8 src0, src1;
37     v8u16 res_r;
38     v8i16 res;
39     v16i8 mask;
40     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
41     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
42     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
43
44     mask = LD_SB(&chroma_mask_arr[0]);
45
46     LD_SB2(src, stride, src0, src1);
47
48     src0 = __msa_vshf_b(mask, src1, src0);
49     res_r = __msa_dotp_u_h((v16u8) src0, coeff_vec);
50     res_r <<= 3;
51     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
52     res_r = __msa_sat_u_h(res_r, 7);
53     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
54
55     out0 = __msa_copy_u_h(res, 0);
56     out1 = __msa_copy_u_h(res, 2);
57
58     SH(out0, dst);
59     dst += stride;
60     SH(out1, dst);
61 }
62
63 static void avc_chroma_hz_2x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
64                                   uint32_t coeff0, uint32_t coeff1)
65 {
66     v16u8 src0, src1, src2, src3;
67     v8u16 res_r;
68     v8i16 res;
69     v16i8 mask;
70     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
71     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
72     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
73
74     mask = LD_SB(&chroma_mask_arr[64]);
75
76     LD_UB4(src, stride, src0, src1, src2, src3);
77
78     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
79
80     src0 = (v16u8) __msa_ilvr_d((v2i64) src2, (v2i64) src0);
81
82     res_r = __msa_dotp_u_h(src0, coeff_vec);
83     res_r <<= 3;
84     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
85     res_r = __msa_sat_u_h(res_r, 7);
86     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
87
88     ST2x4_UB(res, 0, dst, stride);
89 }
90
91 static void avc_chroma_hz_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
92                                  uint32_t coeff0, uint32_t coeff1,
93                                  int32_t height)
94 {
95     if (2 == height) {
96         avc_chroma_hz_2x2_msa(src, dst, stride, coeff0, coeff1);
97     } else if (4 == height) {
98         avc_chroma_hz_2x4_msa(src, dst, stride, coeff0, coeff1);
99     }
100 }
101
102 static void avc_chroma_hz_4x2_msa(uint8_t *src, uint8_t *dst, int32_t stride,
103                                   uint32_t coeff0, uint32_t coeff1)
104 {
105     v16i8 src0, src1;
106     v8u16 res_r;
107     v4i32 res;
108     v16i8 mask;
109     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
110     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
111     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
112
113     mask = LD_SB(&chroma_mask_arr[0]);
114
115     LD_SB2(src, stride, src0, src1);
116
117     src0 = __msa_vshf_b(mask, src1, src0);
118     res_r = __msa_dotp_u_h((v16u8) src0, coeff_vec);
119     res_r <<= 3;
120     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
121     res_r = __msa_sat_u_h(res_r, 7);
122     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
123
124     ST4x2_UB(res, dst, stride);
125 }
126
127 static void avc_chroma_hz_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
128                                   uint32_t coeff0, uint32_t coeff1)
129 {
130     v16u8 src0, src1, src2, src3, out;
131     v8u16 res0_r, res1_r;
132     v16i8 mask;
133     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
134     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
135     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
136
137     mask = LD_SB(&chroma_mask_arr[0]);
138
139     LD_UB4(src, stride, src0, src1, src2, src3);
140     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
141     DOTP_UB2_UH(src0, src2, coeff_vec, coeff_vec, res0_r, res1_r);
142     res0_r <<= 3;
143     res1_r <<= 3;
144     SRARI_H2_UH(res0_r, res1_r, 6);
145     SAT_UH2_UH(res0_r, res1_r, 7);
146     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
147     ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
148 }
149
150 static void avc_chroma_hz_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
151                                   uint32_t coeff0, uint32_t coeff1)
152 {
153     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, out0, out1;
154     v16i8 mask;
155     v8u16 res0, res1, res2, res3;
156     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
157     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
158     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
159
160     mask = LD_SB(&chroma_mask_arr[0]);
161
162     LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
163     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
164     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, src4, src6);
165     DOTP_UB2_UH(src0, src2, coeff_vec, coeff_vec, res0, res1);
166     DOTP_UB2_UH(src4, src6, coeff_vec, coeff_vec, res2, res3);
167     SLLI_4V(res0, res1, res2, res3, 3);
168     SRARI_H4_UH(res0, res1, res2, res3, 6);
169     SAT_UH4_UH(res0, res1, res2, res3, 7);
170     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
171     ST4x8_UB(out0, out1, dst, stride);
172 }
173
174 static void avc_chroma_hz_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
175                                  uint32_t coeff0, uint32_t coeff1,
176                                  int32_t height)
177 {
178     if (2 == height) {
179         avc_chroma_hz_4x2_msa(src, dst, stride, coeff0, coeff1);
180     } else if (4 == height) {
181         avc_chroma_hz_4x4_msa(src, dst, stride, coeff0, coeff1);
182     } else if (8 == height) {
183         avc_chroma_hz_4x8_msa(src, dst, stride, coeff0, coeff1);
184     }
185 }
186
187 static void avc_chroma_hz_8x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
188                                   uint32_t coeff0, uint32_t coeff1)
189 {
190     v16u8 src0, src1, src2, src3, out0, out1;
191     v8u16 res0, res1, res2, res3;
192     v16i8 mask;
193     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
194     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
195     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
196
197     mask = LD_SB(&chroma_mask_arr[32]);
198     LD_UB4(src, stride, src0, src1, src2, src3);
199     VSHF_B2_UB(src0, src0, src1, src1, mask, mask, src0, src1);
200     VSHF_B2_UB(src2, src2, src3, src3, mask, mask, src2, src3);
201     DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
202                 coeff_vec, res0, res1, res2, res3);
203     SLLI_4V(res0, res1, res2, res3, 3);
204     SRARI_H4_UH(res0, res1, res2, res3, 6);
205     SAT_UH4_UH(res0, res1, res2, res3, 7);
206     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
207     ST8x4_UB(out0, out1, dst, stride);
208 }
209
210 static void avc_chroma_hz_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
211                                   uint32_t coeff0, uint32_t coeff1)
212 {
213     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
214     v16u8 out0, out1, out2, out3;
215     v8u16 res0, res1, res2, res3, res4, res5, res6, res7;
216     v16i8 mask;
217     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
218     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
219     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
220
221     mask = LD_SB(&chroma_mask_arr[32]);
222
223     LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
224     VSHF_B2_UB(src0, src0, src1, src1, mask, mask, src0, src1);
225     VSHF_B2_UB(src2, src2, src3, src3, mask, mask, src2, src3);
226     VSHF_B2_UB(src4, src4, src5, src5, mask, mask, src4, src5);
227     VSHF_B2_UB(src6, src6, src7, src7, mask, mask, src6, src7);
228     DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
229                 coeff_vec, res0, res1, res2, res3);
230     DOTP_UB4_UH(src4, src5, src6, src7, coeff_vec, coeff_vec, coeff_vec,
231                 coeff_vec, res4, res5, res6, res7);
232     SLLI_4V(res0, res1, res2, res3, 3);
233     SLLI_4V(res4, res5, res6, res7, 3);
234     SRARI_H4_UH(res0, res1, res2, res3, 6);
235     SRARI_H4_UH(res4, res5, res6, res7, 6);
236     SAT_UH4_UH(res0, res1, res2, res3, 7);
237     SAT_UH4_UH(res4, res5, res6, res7, 7);
238     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
239     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
240     ST8x8_UB(out0, out1, out2, out3, dst, stride);
241 }
242
243 static void avc_chroma_hz_nonmult_msa(uint8_t *src, uint8_t *dst,
244                                       int32_t stride, uint32_t coeff0,
245                                       uint32_t coeff1, int32_t height)
246 {
247     uint32_t row;
248     v16u8 src0, src1, src2, src3, out0, out1;
249     v8u16 res0, res1, res2, res3;
250     v16i8 mask;
251     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
252     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
253     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
254
255     mask = LD_SB(&chroma_mask_arr[32]);
256
257     for (row = height >> 2; row--;) {
258         LD_UB4(src, stride, src0, src1, src2, src3);
259         src += (4 * stride);
260
261         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, src0, src1);
262         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, src2, src3);
263         DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
264                     coeff_vec, res0, res1, res2, res3);
265         SLLI_4V(res0, res1, res2, res3, 3);
266         SRARI_H4_UH(res0, res1, res2, res3, 6);
267         SAT_UH4_UH(res0, res1, res2, res3, 7);
268         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
269         ST8x4_UB(out0, out1, dst, stride);
270         dst += (4 * stride);
271     }
272
273     if (0 != (height % 4)) {
274         for (row = (height % 4); row--;) {
275             src0 = LD_UB(src);
276             src += stride;
277
278             src0 = (v16u8) __msa_vshf_b(mask, (v16i8) src0, (v16i8) src0);
279
280             res0 = __msa_dotp_u_h(src0, coeff_vec);
281             res0 <<= 3;
282             res0 = (v8u16) __msa_srari_h((v8i16) res0, 6);
283             res0 = __msa_sat_u_h(res0, 7);
284             res0 = (v8u16) __msa_pckev_b((v16i8) res0, (v16i8) res0);
285
286             ST8x1_UB(res0, dst);
287             dst += stride;
288         }
289     }
290 }
291
292 static void avc_chroma_hz_8w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
293                                  uint32_t coeff0, uint32_t coeff1,
294                                  int32_t height)
295 {
296     if (4 == height) {
297         avc_chroma_hz_8x4_msa(src, dst, stride, coeff0, coeff1);
298     } else if (8 == height) {
299         avc_chroma_hz_8x8_msa(src, dst, stride, coeff0, coeff1);
300     } else {
301         avc_chroma_hz_nonmult_msa(src, dst, stride, coeff0, coeff1, height);
302     }
303 }
304
305 static void avc_chroma_vt_2x2_msa(uint8_t *src, int32_t src_stride,
306                                   uint8_t *dst, int32_t dst_stride,
307                                   uint32_t coeff0, uint32_t coeff1)
308 {
309     uint16_t out0, out1;
310     v16i8 src0, src1, src2;
311     v16u8 tmp0, tmp1;
312     v8i16 res;
313     v8u16 res_r;
314     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
315     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
316     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
317
318     LD_SB3(src, src_stride, src0, src1, src2);
319
320     ILVR_B2_UB(src1, src0, src2, src1, tmp0, tmp1);
321
322     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp1, (v2i64) tmp0);
323
324     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
325     res_r <<= 3;
326     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
327     res_r = __msa_sat_u_h(res_r, 7);
328     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
329
330     out0 = __msa_copy_u_h(res, 0);
331     out1 = __msa_copy_u_h(res, 2);
332
333     SH(out0, dst);
334     dst += dst_stride;
335     SH(out1, dst);
336 }
337
338 static void avc_chroma_vt_2x4_msa(uint8_t *src, int32_t src_stride,
339                                   uint8_t *dst, int32_t dst_stride,
340                                   uint32_t coeff0, uint32_t coeff1)
341 {
342     v16u8 src0, src1, src2, src3, src4;
343     v16u8 tmp0, tmp1, tmp2, tmp3;
344     v8i16 res;
345     v8u16 res_r;
346     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
347     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
348     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
349
350     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
351     ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
352                tmp0, tmp1, tmp2, tmp3);
353     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
354
355     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
356
357     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
358     res_r <<= 3;
359     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
360     res_r = __msa_sat_u_h(res_r, 7);
361
362     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
363
364     ST2x4_UB(res, 0, dst, dst_stride);
365 }
366
367 static void avc_chroma_vt_2x8_msa(uint8_t *src, int32_t src_stride,
368                                   uint8_t *dst, int32_t dst_stride,
369                                   uint32_t coeff0, uint32_t coeff1)
370 {
371     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
372     v16u8 tmp0, tmp1, tmp2, tmp3;
373     v8i16 res;
374     v8u16 res_r;
375     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
376     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
377     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
378
379     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
380     src += (5 * src_stride);
381     LD_UB4(src, src_stride, src5, src6, src7, src8);
382
383     ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
384                tmp0, tmp1, tmp2, tmp3);
385     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
386
387     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
388
389     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
390     res_r <<= 3;
391     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
392     res_r = __msa_sat_u_h(res_r, 7);
393
394     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
395
396     ST2x4_UB(res, 0, dst, dst_stride);
397     dst += (4 * dst_stride);
398
399     ILVR_B4_UB(src5, src4, src6, src5, src7, src6, src8, src7,
400                tmp0, tmp1, tmp2, tmp3);
401     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
402
403     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
404
405     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
406     res_r <<= 3;
407     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
408     res_r = __msa_sat_u_h(res_r, 7);
409
410     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
411
412     ST2x4_UB(res, 0, dst, dst_stride);
413     dst += (4 * dst_stride);
414 }
415
416 static void avc_chroma_vt_2w_msa(uint8_t *src, int32_t src_stride,
417                                  uint8_t *dst, int32_t dst_stride,
418                                  uint32_t coeff0, uint32_t coeff1,
419                                  int32_t height)
420 {
421     if (2 == height) {
422         avc_chroma_vt_2x2_msa(src, src_stride, dst, dst_stride, coeff0, coeff1);
423     } else if (4 == height) {
424         avc_chroma_vt_2x4_msa(src, src_stride, dst, dst_stride, coeff0, coeff1);
425     } else if (8 == height) {
426         avc_chroma_vt_2x8_msa(src, src_stride, dst, dst_stride, coeff0, coeff1);
427     }
428 }
429
430 static void avc_chroma_vt_4x2_msa(uint8_t *src, int32_t src_stride,
431                                   uint8_t *dst, int32_t dst_stride,
432                                   uint32_t coeff0, uint32_t coeff1)
433 {
434     v16u8 src0, src1, src2;
435     v16u8 tmp0, tmp1;
436     v4i32 res;
437     v8u16 res_r;
438     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
439     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
440     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
441
442     LD_UB3(src, src_stride, src0, src1, src2);
443     ILVR_B2_UB(src1, src0, src2, src1, tmp0, tmp1);
444
445     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp1, (v2i64) tmp0);
446     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
447     res_r <<= 3;
448     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
449     res_r = __msa_sat_u_h(res_r, 7);
450     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
451
452     ST4x2_UB(res, dst, dst_stride);
453 }
454
455 static void avc_chroma_vt_4x4multiple_msa(uint8_t *src, int32_t src_stride,
456                                           uint8_t *dst, int32_t dst_stride,
457                                           uint32_t coeff0, uint32_t coeff1,
458                                           int32_t height)
459 {
460     uint32_t row;
461     v16u8 src0, src1, src2, src3, src4;
462     v16u8 tmp0, tmp1, tmp2, tmp3;
463     v8u16 res0_r, res1_r;
464     v4i32 res0, res1;
465     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
466     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
467     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
468
469     src0 = LD_UB(src);
470     src += src_stride;
471
472     for (row = (height >> 2); row--;) {
473         LD_UB4(src, src_stride, src1, src2, src3, src4);
474         src += (4 * src_stride);
475
476         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
477                    tmp0, tmp1, tmp2, tmp3);
478         ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
479         DOTP_UB2_UH(tmp0, tmp2, coeff_vec, coeff_vec, res0_r, res1_r);
480
481         res0_r <<= 3;
482         res1_r <<= 3;
483
484         SRARI_H2_UH(res0_r, res1_r, 6);
485         SAT_UH2_UH(res0_r, res1_r, 7);
486         PCKEV_B2_SW(res0_r, res0_r, res1_r, res1_r, res0, res1);
487
488         ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
489         dst += (4 * dst_stride);
490         src0 = src4;
491     }
492 }
493
494 static void avc_chroma_vt_4w_msa(uint8_t *src, int32_t src_stride,
495                                  uint8_t *dst, int32_t dst_stride,
496                                  uint32_t coeff0, uint32_t coeff1,
497                                  int32_t height)
498 {
499     if (2 == height) {
500         avc_chroma_vt_4x2_msa(src, src_stride, dst, dst_stride, coeff0, coeff1);
501     } else {
502         avc_chroma_vt_4x4multiple_msa(src, src_stride, dst, dst_stride, coeff0,
503                                       coeff1, height);
504     }
505 }
506
507 static void avc_chroma_vt_8w_msa(uint8_t *src, int32_t src_stride,
508                                  uint8_t *dst, int32_t dst_stride,
509                                  uint32_t coeff0, uint32_t coeff1,
510                                  int32_t height)
511 {
512     uint32_t row;
513     v16u8 src0, src1, src2, src3, src4, out0, out1;
514     v8u16 res0, res1, res2, res3;
515     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
516     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
517     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
518
519     src0 = LD_UB(src);
520     src += src_stride;
521
522     for (row = height >> 2; row--;) {
523         LD_UB4(src, src_stride, src1, src2, src3, src4);
524         src += (4 * src_stride);
525
526         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
527                    src0, src1, src2, src3);
528         DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
529                     coeff_vec, res0, res1, res2, res3);
530         SLLI_4V(res0, res1, res2, res3, 3);
531         SRARI_H4_UH(res0, res1, res2, res3, 6);
532         SAT_UH4_UH(res0, res1, res2, res3, 7);
533         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
534
535         ST8x4_UB(out0, out1, dst, dst_stride);
536
537         dst += (4 * dst_stride);
538         src0 = src4;
539     }
540 }
541
542 static void avc_chroma_hv_2x2_msa(uint8_t *src, int32_t src_stride,
543                                   uint8_t *dst, int32_t dst_stride,
544                                   uint32_t coef_hor0, uint32_t coef_hor1,
545                                   uint32_t coef_ver0, uint32_t coef_ver1)
546 {
547     uint16_t out0, out1;
548     v16u8 src0, src1, src2;
549     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
550     v8i16 res_vert;
551     v16i8 mask;
552     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
553     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
554     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
555     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
556     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
557
558     mask = LD_SB(&chroma_mask_arr[48]);
559
560     LD_UB3(src, src_stride, src0, src1, src2);
561     VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
562     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
563     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
564
565     res_vt0 += res_vt1;
566     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
567     res_vt0 = __msa_sat_u_h(res_vt0, 7);
568     res_vert = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
569
570     out0 = __msa_copy_u_h(res_vert, 0);
571     out1 = __msa_copy_u_h(res_vert, 1);
572
573     SH(out0, dst);
574     dst += dst_stride;
575     SH(out1, dst);
576 }
577
578 static void avc_chroma_hv_2x4_msa(uint8_t *src, int32_t src_stride,
579                                   uint8_t *dst, int32_t dst_stride,
580                                   uint32_t coef_hor0, uint32_t coef_hor1,
581                                   uint32_t coef_ver0, uint32_t coef_ver1)
582 {
583     v16u8 src0, src1, src2, src3, src4;
584     v16u8 tmp0, tmp1, tmp2, tmp3;
585     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
586     v8i16 res;
587     v16i8 mask;
588     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
589     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
590     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
591     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
592     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
593
594     mask = LD_SB(&chroma_mask_arr[48]);
595
596     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
597
598     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, tmp0, tmp1);
599     VSHF_B2_UB(src1, src2, src3, src4, mask, mask, tmp2, tmp3);
600     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
601     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
602     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
603
604     res_vt0 += res_vt1;
605     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
606     res_vt0 = __msa_sat_u_h(res_vt0, 7);
607     res = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
608
609     ST2x4_UB(res, 0, dst, dst_stride);
610 }
611
612 static void avc_chroma_hv_2x8_msa(uint8_t *src, int32_t src_stride,
613                                   uint8_t *dst, int32_t dst_stride,
614                                   uint32_t coef_hor0, uint32_t coef_hor1,
615                                   uint32_t coef_ver0, uint32_t coef_ver1)
616 {
617     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
618     v16u8 tmp0, tmp1, tmp2, tmp3;
619     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
620     v8i16 res;
621     v16i8 mask;
622     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
623     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
624     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
625     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
626     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
627
628     mask = LD_SB(&chroma_mask_arr[48]);
629
630     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
631     src += (5 * src_stride);
632     LD_UB4(src, src_stride, src5, src6, src7, src8);
633
634     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, tmp0, tmp1);
635     VSHF_B2_UB(src1, src2, src3, src4, mask, mask, tmp2, tmp3);
636     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
637     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, tmp0, tmp1);
638     VSHF_B2_UB(src5, src6, src7, src8, mask, mask, tmp2, tmp3);
639     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src4, src5);
640     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
641     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
642
643     res_vt0 += res_vt1;
644     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
645     res_vt0 = __msa_sat_u_h(res_vt0, 7);
646
647     res = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
648
649     ST2x4_UB(res, 0, dst, dst_stride);
650     dst += (4 * dst_stride);
651
652     DOTP_UB2_UH(src4, src5, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
653     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
654
655     res_vt0 += res_vt1;
656     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
657     res_vt0 = __msa_sat_u_h(res_vt0, 7);
658
659     res = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
660
661     ST2x4_UB(res, 0, dst, dst_stride);
662 }
663
664 static void avc_chroma_hv_2w_msa(uint8_t *src, int32_t src_stride,
665                                  uint8_t *dst, int32_t dst_stride,
666                                  uint32_t coef_hor0, uint32_t coef_hor1,
667                                  uint32_t coef_ver0, uint32_t coef_ver1,
668                                  int32_t height)
669 {
670     if (2 == height) {
671         avc_chroma_hv_2x2_msa(src, src_stride, dst, dst_stride, coef_hor0,
672                               coef_hor1, coef_ver0, coef_ver1);
673     } else if (4 == height) {
674         avc_chroma_hv_2x4_msa(src, src_stride, dst, dst_stride, coef_hor0,
675                               coef_hor1, coef_ver0, coef_ver1);
676     } else if (8 == height) {
677         avc_chroma_hv_2x8_msa(src, src_stride, dst, dst_stride, coef_hor0,
678                               coef_hor1, coef_ver0, coef_ver1);
679     }
680 }
681
682 static void avc_chroma_hv_4x2_msa(uint8_t *src, int32_t src_stride,
683                                   uint8_t *dst, int32_t dst_stride,
684                                   uint32_t coef_hor0, uint32_t coef_hor1,
685                                   uint32_t coef_ver0, uint32_t coef_ver1)
686 {
687     v16u8 src0, src1, src2;
688     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
689     v16i8 mask;
690     v4i32 res;
691     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
692     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
693     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
694     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
695     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
696
697     mask = LD_SB(&chroma_mask_arr[0]);
698     LD_UB3(src, src_stride, src0, src1, src2);
699     VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
700     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
701     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
702
703     res_vt0 += res_vt1;
704     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
705     res_vt0 = __msa_sat_u_h(res_vt0, 7);
706     res = (v4i32) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
707
708     ST4x2_UB(res, dst, dst_stride);
709 }
710
711 static void avc_chroma_hv_4x4multiple_msa(uint8_t *src, int32_t src_stride,
712                                           uint8_t *dst, int32_t dst_stride,
713                                           uint32_t coef_hor0,
714                                           uint32_t coef_hor1,
715                                           uint32_t coef_ver0,
716                                           uint32_t coef_ver1,
717                                           int32_t height)
718 {
719     uint32_t row;
720     v16u8 src0, src1, src2, src3, src4;
721     v8u16 res_hz0, res_hz1, res_hz2, res_hz3;
722     v8u16 res_vt0, res_vt1, res_vt2, res_vt3;
723     v16i8 mask;
724     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
725     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
726     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
727     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
728     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
729     v4i32 res0, res1;
730
731     mask = LD_SB(&chroma_mask_arr[0]);
732
733     src0 = LD_UB(src);
734     src += src_stride;
735
736     for (row = (height >> 2); row--;) {
737         LD_UB4(src, src_stride, src1, src2, src3, src4);
738         src += (4 * src_stride);
739
740         VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
741         VSHF_B2_UB(src2, src3, src3, src4, mask, mask, src2, src3);
742         DOTP_UB4_UH(src0, src1, src2, src3, coeff_hz_vec, coeff_hz_vec,
743                     coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1, res_hz2,
744                     res_hz3);
745         MUL4(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_hz2,
746              coeff_vt_vec1, res_hz3, coeff_vt_vec0, res_vt0, res_vt1, res_vt2,
747              res_vt3);
748         ADD2(res_vt0, res_vt1, res_vt2, res_vt3, res_vt0, res_vt1);
749         SRARI_H2_UH(res_vt0, res_vt1, 6);
750         SAT_UH2_UH(res_vt0, res_vt1, 7);
751         PCKEV_B2_SW(res_vt0, res_vt0, res_vt1, res_vt1, res0, res1);
752
753         ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
754         dst += (4 * dst_stride);
755         src0 = src4;
756     }
757 }
758
759 static void avc_chroma_hv_4w_msa(uint8_t *src, int32_t src_stride,
760                                  uint8_t *dst, int32_t dst_stride,
761                                  uint32_t coef_hor0, uint32_t coef_hor1,
762                                  uint32_t coef_ver0, uint32_t coef_ver1,
763                                  int32_t height)
764 {
765     if (2 == height) {
766         avc_chroma_hv_4x2_msa(src, src_stride, dst, dst_stride, coef_hor0,
767                               coef_hor1, coef_ver0, coef_ver1);
768     } else {
769         avc_chroma_hv_4x4multiple_msa(src, src_stride, dst, dst_stride,
770                                       coef_hor0, coef_hor1, coef_ver0,
771                                       coef_ver1, height);
772     }
773 }
774
775 static void avc_chroma_hv_8w_msa(uint8_t *src, int32_t src_stride,
776                                  uint8_t *dst, int32_t dst_stride,
777                                  uint32_t coef_hor0, uint32_t coef_hor1,
778                                  uint32_t coef_ver0, uint32_t coef_ver1,
779                                  int32_t height)
780 {
781     uint32_t row;
782     v16u8 src0, src1, src2, src3, src4, out0, out1;
783     v8u16 res_hz0, res_hz1, res_hz2, res_hz3, res_hz4;
784     v8u16 res_vt0, res_vt1, res_vt2, res_vt3;
785     v16i8 mask;
786     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
787     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
788     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
789     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
790     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
791
792     mask = LD_SB(&chroma_mask_arr[32]);
793
794     src0 = LD_UB(src);
795     src += src_stride;
796
797     src0 = (v16u8) __msa_vshf_b(mask, (v16i8) src0, (v16i8) src0);
798     res_hz0 = __msa_dotp_u_h(src0, coeff_hz_vec);
799
800     for (row = (height >> 2); row--;) {
801         LD_UB4(src, src_stride, src1, src2, src3, src4);
802         src += (4 * src_stride);
803
804         VSHF_B2_UB(src1, src1, src2, src2, mask, mask, src1, src2);
805         VSHF_B2_UB(src3, src3, src4, src4, mask, mask, src3, src4);
806         DOTP_UB4_UH(src1, src2, src3, src4, coeff_hz_vec, coeff_hz_vec,
807                     coeff_hz_vec, coeff_hz_vec, res_hz1, res_hz2, res_hz3,
808                     res_hz4);
809         MUL4(res_hz1, coeff_vt_vec0, res_hz2, coeff_vt_vec0, res_hz3,
810              coeff_vt_vec0, res_hz4, coeff_vt_vec0, res_vt0, res_vt1, res_vt2,
811              res_vt3);
812
813         res_vt0 += (res_hz0 * coeff_vt_vec1);
814         res_vt1 += (res_hz1 * coeff_vt_vec1);
815         res_vt2 += (res_hz2 * coeff_vt_vec1);
816         res_vt3 += (res_hz3 * coeff_vt_vec1);
817
818         SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
819         SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
820         PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
821         ST8x4_UB(out0, out1, dst, dst_stride);
822
823         dst += (4 * dst_stride);
824
825         res_hz0 = res_hz4;
826     }
827 }
828
829 static void avc_chroma_hz_and_aver_dst_2x2_msa(uint8_t *src, int32_t src_stride,
830                                                uint8_t *dst, int32_t dst_stride,
831                                                uint32_t coeff0, uint32_t coeff1)
832 {
833     uint16_t out0, out1;
834     uint32_t load0, load1;
835     v16i8 src0, src1;
836     v16u8 dst_data = { 0 };
837     v8u16 res_r;
838     v16u8 res;
839     v16i8 mask;
840     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
841     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
842     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
843
844     mask = LD_SB(&chroma_mask_arr[0]);
845
846     LD_SB2(src, src_stride, src0, src1);
847
848     load0 = LW(dst);
849     load1 = LW(dst + dst_stride);
850
851     INSERT_W2_UB(load0, load1, dst_data);
852
853     src0 = __msa_vshf_b(mask, src1, src0);
854
855     res_r = __msa_dotp_u_h((v16u8) src0, coeff_vec);
856     res_r <<= 3;
857     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
858     res_r = __msa_sat_u_h(res_r, 7);
859
860     res = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
861     dst_data = __msa_aver_u_b(res, dst_data);
862
863     out0 = __msa_copy_u_h((v8i16) dst_data, 0);
864     out1 = __msa_copy_u_h((v8i16) dst_data, 2);
865
866     SH(out0, dst);
867     dst += dst_stride;
868     SH(out1, dst);
869 }
870
871 static void avc_chroma_hz_and_aver_dst_2x4_msa(uint8_t *src, int32_t src_stride,
872                                                uint8_t *dst, int32_t dst_stride,
873                                                uint32_t coeff0, uint32_t coeff1)
874 {
875     v16u8 src0, src1, src2, src3;
876     v16u8 dst0, dst1, dst2, dst3;
877     v8u16 res_r;
878     v16i8 res, mask;
879     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
880     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
881     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
882
883     mask = LD_SB(&chroma_mask_arr[64]);
884
885     LD_UB4(src, src_stride, src0, src1, src2, src3);
886     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
887
888     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 1, (v8i16) dst1);
889     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 2, (v8i16) dst2);
890     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 3, (v8i16) dst3);
891
892     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
893
894     src0 = (v16u8) __msa_ilvr_d((v2i64) src2, (v2i64) src0);
895
896     res_r = __msa_dotp_u_h(src0, coeff_vec);
897     res_r <<= 3;
898     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
899     res_r = __msa_sat_u_h(res_r, 7);
900
901     res = __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
902     dst0 = __msa_aver_u_b((v16u8) res, dst0);
903
904     ST2x4_UB(dst0, 0, dst, dst_stride);
905 }
906
907 static void avc_chroma_hz_and_aver_dst_2x8_msa(uint8_t *src, int32_t src_stride,
908                                                uint8_t *dst, int32_t dst_stride,
909                                                uint32_t coeff0, uint32_t coeff1)
910 {
911     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
912     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
913     v8u16 res0_r, res1_r;
914     v16u8 res0, res1, mask;
915     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
916     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
917     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
918
919     mask = LD_UB(&chroma_mask_arr[64]);
920
921     LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
922     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
923
924     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 1, (v8i16) dst1);
925     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 2, (v8i16) dst2);
926     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 3, (v8i16) dst3);
927
928     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 1, (v8i16) dst5);
929     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 2, (v8i16) dst6);
930     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 3, (v8i16) dst7);
931
932     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
933     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, src4, src6);
934     ILVR_D2_UB(src2, src0, src6, src4, src0, src4);
935     DOTP_UB2_UH(src0, src4, coeff_vec, coeff_vec, res0_r, res1_r);
936
937     res0_r <<= 3;
938     res1_r <<= 3;
939
940     SRARI_H2_UH(res0_r, res1_r, 6);
941     SAT_UH2_UH(res0_r, res1_r, 7);
942     PCKEV_B2_UB(res0_r, res0_r, res1_r, res1_r, res0, res1);
943     AVER_UB2_UB(res0, dst0, res1, dst4, dst0, dst4);
944
945     ST2x4_UB(dst0, 0, dst, dst_stride);
946     dst += (4 * dst_stride);
947     ST2x4_UB(dst4, 0, dst, dst_stride);
948 }
949
950 static void avc_chroma_hz_and_aver_dst_2w_msa(uint8_t *src, int32_t src_stride,
951                                               uint8_t *dst, int32_t dst_stride,
952                                               uint32_t coeff0, uint32_t coeff1,
953                                               int32_t height)
954 {
955     if (2 == height) {
956         avc_chroma_hz_and_aver_dst_2x2_msa(src, src_stride, dst, dst_stride,
957                                            coeff0, coeff1);
958     } else if (4 == height) {
959         avc_chroma_hz_and_aver_dst_2x4_msa(src, src_stride, dst, dst_stride,
960                                            coeff0, coeff1);
961     } else if (8 == height) {
962         avc_chroma_hz_and_aver_dst_2x8_msa(src, src_stride, dst, dst_stride,
963                                            coeff0, coeff1);
964     }
965 }
966
967 static void avc_chroma_hz_and_aver_dst_4x2_msa(uint8_t *src, int32_t src_stride,
968                                                uint8_t *dst, int32_t dst_stride,
969                                                uint32_t coeff0, uint32_t coeff1)
970 {
971     uint32_t load0, load1;
972     v16i8 src0, src1;
973     v16u8 dst_data = { 0 };
974     v8u16 res_r;
975     v16i8 res, mask;
976     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
977     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
978     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
979
980     mask = LD_SB(&chroma_mask_arr[0]);
981
982     LD_SB2(src, src_stride, src0, src1);
983
984     load0 = LW(dst);
985     load1 = LW(dst + dst_stride);
986
987     INSERT_W2_UB(load0, load1, dst_data);
988
989     src0 = __msa_vshf_b(mask, src1, src0);
990
991     res_r = __msa_dotp_u_h((v16u8) src0, coeff_vec);
992     res_r <<= 3;
993     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
994     res_r = __msa_sat_u_h(res_r, 7);
995     res = __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
996     dst_data = __msa_aver_u_b((v16u8) res, dst_data);
997
998     ST4x2_UB(dst_data, dst, dst_stride);
999 }
1000
1001 static void avc_chroma_hz_and_aver_dst_4x4multiple_msa(uint8_t *src,
1002                                                        int32_t src_stride,
1003                                                        uint8_t *dst,
1004                                                        int32_t dst_stride,
1005                                                        uint32_t coeff0,
1006                                                        uint32_t coeff1,
1007                                                        int32_t height)
1008 {
1009     uint32_t load0, load1;
1010     uint32_t row;
1011     v16u8 src0, src1, src2, src3;
1012     v16u8 dst0 = { 0 };
1013     v16u8 dst1 = { 0 };
1014     v8u16 res0_r, res1_r;
1015     v16u8 res0, res1, mask;
1016     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1017     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1018     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1019
1020     mask = LD_UB(&chroma_mask_arr[0]);
1021
1022     for (row = (height >> 2); row--;) {
1023         LD_UB4(src, src_stride, src0, src1, src2, src3);
1024         src += (4 * src_stride);
1025
1026         load0 = LW(dst);
1027         load1 = LW(dst + dst_stride);
1028
1029         INSERT_W2_UB(load0, load1, dst0);
1030
1031         load0 = LW(dst + 2 * dst_stride);
1032         load1 = LW(dst + 3 * dst_stride);
1033
1034         INSERT_W2_UB(load0, load1, dst1);
1035
1036         VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2);
1037         DOTP_UB2_UH(src0, src2, coeff_vec, coeff_vec, res0_r, res1_r);
1038
1039         res0_r <<= 3;
1040         res1_r <<= 3;
1041
1042         SRARI_H2_UH(res0_r, res1_r, 6);
1043         SAT_UH2_UH(res0_r, res1_r, 7);
1044         PCKEV_B2_UB(res0_r, res0_r, res1_r, res1_r, res0, res1);
1045         AVER_UB2_UB(res0, dst0, res1, dst1, dst0, dst1);
1046
1047         ST4x4_UB(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
1048         dst += (4 * dst_stride);
1049     }
1050 }
1051
1052 static void avc_chroma_hz_and_aver_dst_4w_msa(uint8_t *src, int32_t src_stride,
1053                                               uint8_t *dst, int32_t dst_stride,
1054                                               uint32_t coeff0, uint32_t coeff1,
1055                                               int32_t height)
1056 {
1057     if (2 == height) {
1058         avc_chroma_hz_and_aver_dst_4x2_msa(src, src_stride, dst, dst_stride,
1059                                            coeff0, coeff1);
1060     } else {
1061         avc_chroma_hz_and_aver_dst_4x4multiple_msa(src, src_stride,
1062                                                    dst, dst_stride,
1063                                                    coeff0, coeff1, height);
1064     }
1065 }
1066
1067 static void avc_chroma_hz_and_aver_dst_8w_msa(uint8_t *src, int32_t src_stride,
1068                                               uint8_t *dst, int32_t dst_stride,
1069                                               uint32_t coeff0, uint32_t coeff1,
1070                                               int32_t height)
1071 {
1072     uint32_t row;
1073     v16u8 src0, src1, src2, src3, out0, out1;
1074     v8u16 res0, res1, res2, res3;
1075     v16u8 dst0, dst1, dst2, dst3;
1076     v16i8 mask;
1077     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1078     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1079     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1080
1081     mask = LD_SB(&chroma_mask_arr[32]);
1082
1083     for (row = height >> 2; row--;) {
1084         LD_UB4(src, src_stride, src0, src1, src2, src3);
1085         src += (4 * src_stride);
1086         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1087         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, src0, src1);
1088         VSHF_B2_UB(src2, src2, src3, src3, mask, mask, src2, src3);
1089         DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
1090                     coeff_vec, res0, res1, res2, res3);
1091         SLLI_4V(res0, res1, res2, res3, 3);
1092         SRARI_H4_UH(res0, res1, res2, res3, 6);
1093         SAT_UH4_UH(res0, res1, res2, res3, 7);
1094         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
1095         PCKEV_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1096         AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
1097         ST8x4_UB(out0, out1, dst, dst_stride);
1098         dst += (4 * dst_stride);
1099     }
1100 }
1101
1102 static void avc_chroma_vt_and_aver_dst_2x2_msa(uint8_t *src, int32_t src_stride,
1103                                                uint8_t *dst, int32_t dst_stride,
1104                                                uint32_t coeff0, uint32_t coeff1)
1105 {
1106     uint16_t out0, out1;
1107     uint32_t load0, load1;
1108     v16i8 src0, src1, src2, tmp0, tmp1, res;
1109     v16u8 dst_data = { 0 };
1110     v8u16 res_r;
1111     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1112     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1113     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1114
1115     LD_SB3(src, src_stride, src0, src1, src2);
1116     load0 = LW(dst);
1117     load1 = LW(dst + dst_stride);
1118
1119     INSERT_W2_UB(load0, load1, dst_data);
1120
1121     ILVR_B2_SB(src1, src0, src2, src1, tmp0, tmp1);
1122
1123     tmp0 = (v16i8) __msa_ilvr_d((v2i64) tmp1, (v2i64) tmp0);
1124     res_r = __msa_dotp_u_h((v16u8) tmp0, coeff_vec);
1125     res_r <<= 3;
1126     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
1127     res_r = __msa_sat_u_h(res_r, 7);
1128     res = __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
1129     dst_data = __msa_aver_u_b((v16u8) res, dst_data);
1130     out0 = __msa_copy_u_h((v8i16) dst_data, 0);
1131     out1 = __msa_copy_u_h((v8i16) dst_data, 2);
1132
1133     SH(out0, dst);
1134     dst += dst_stride;
1135     SH(out1, dst);
1136 }
1137
1138 static void avc_chroma_vt_and_aver_dst_2x4_msa(uint8_t *src, int32_t src_stride,
1139                                                uint8_t *dst, int32_t dst_stride,
1140                                                uint32_t coeff0, uint32_t coeff1)
1141 {
1142     uint32_t load0, load1;
1143     v16i8 src0, src1, src2, src3, src4;
1144     v16u8 tmp0, tmp1, tmp2, tmp3;
1145     v8u16 res_r;
1146     v8i16 res;
1147     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1148     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1149     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1150     v16u8 dst_data = { 0 };
1151
1152     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1153
1154     load0 = LW(dst);
1155     load1 = LW(dst + dst_stride);
1156
1157     dst_data = (v16u8) __msa_insert_h((v8i16) dst_data, 0, load0);
1158     dst_data = (v16u8) __msa_insert_h((v8i16) dst_data, 1, load1);
1159
1160     load0 = LW(dst + 2 * dst_stride);
1161     load1 = LW(dst + 3 * dst_stride);
1162
1163     dst_data = (v16u8) __msa_insert_h((v8i16) dst_data, 2, load0);
1164     dst_data = (v16u8) __msa_insert_h((v8i16) dst_data, 3, load1);
1165
1166     ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
1167                tmp0, tmp1, tmp2, tmp3);
1168     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
1169
1170     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
1171
1172     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
1173     res_r <<= 3;
1174     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
1175     res_r = __msa_sat_u_h(res_r, 7);
1176
1177     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
1178     res = (v8i16) __msa_aver_u_b((v16u8) res, dst_data);
1179
1180     ST2x4_UB(res, 0, dst, dst_stride);
1181     dst += (4 * dst_stride);
1182 }
1183
1184 static void avc_chroma_vt_and_aver_dst_2x8_msa(uint8_t *src, int32_t src_stride,
1185                                                uint8_t *dst, int32_t dst_stride,
1186                                                uint32_t coeff0, uint32_t coeff1)
1187 {
1188     uint32_t load0, load1, load2, load3;
1189     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1190     v16u8 tmp0, tmp1, tmp2, tmp3;
1191     v8i16 res;
1192     v8u16 res_r;
1193     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1194     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1195     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1196     v16u8 dst_data0 = { 0 };
1197     v16u8 dst_data1 = { 0 };
1198
1199     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1200     src += (5 * src_stride);
1201     LD_SB4(src, src_stride, src5, src6, src7, src8);
1202
1203     LW4(dst, dst_stride, load0, load1, load2, load3);
1204
1205     dst_data0 = (v16u8) __msa_insert_h((v8i16) dst_data0, 0, load0);
1206     dst_data0 = (v16u8) __msa_insert_h((v8i16) dst_data0, 1, load1);
1207     dst_data0 = (v16u8) __msa_insert_h((v8i16) dst_data0, 2, load2);
1208     dst_data0 = (v16u8) __msa_insert_h((v8i16) dst_data0, 3, load3);
1209
1210     LW4(dst + 4 * dst_stride, dst_stride, load0, load1, load2, load3);
1211
1212     dst_data1 = (v16u8) __msa_insert_h((v8i16) dst_data1, 0, load0);
1213     dst_data1 = (v16u8) __msa_insert_h((v8i16) dst_data1, 1, load1);
1214     dst_data1 = (v16u8) __msa_insert_h((v8i16) dst_data1, 2, load2);
1215     dst_data1 = (v16u8) __msa_insert_h((v8i16) dst_data1, 3, load3);
1216
1217     ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
1218                tmp0, tmp1, tmp2, tmp3);
1219
1220     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
1221
1222     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
1223
1224     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
1225     res_r <<= 3;
1226     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
1227     res_r = __msa_sat_u_h(res_r, 7);
1228
1229     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
1230     res = (v8i16) __msa_aver_u_b((v16u8) res, dst_data0);
1231
1232     ST2x4_UB(res, 0, dst, dst_stride);
1233     dst += (4 * dst_stride);
1234
1235     ILVR_B4_UB(src5, src4, src6, src5, src7, src6, src8, src7,
1236                tmp0, tmp1, tmp2, tmp3);
1237
1238     ILVR_W2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
1239
1240     tmp0 = (v16u8) __msa_ilvr_d((v2i64) tmp2, (v2i64) tmp0);
1241
1242     res_r = __msa_dotp_u_h(tmp0, coeff_vec);
1243     res_r <<= 3;
1244     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
1245     res_r = __msa_sat_u_h(res_r, 7);
1246
1247     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
1248     res = (v8i16) __msa_aver_u_b((v16u8) res, dst_data1);
1249
1250     ST2x4_UB(res, 0, dst, dst_stride);
1251 }
1252
1253 static void avc_chroma_vt_and_aver_dst_2w_msa(uint8_t *src, int32_t src_stride,
1254                                               uint8_t *dst, int32_t dst_stride,
1255                                               uint32_t coeff0, uint32_t coeff1,
1256                                               int32_t height)
1257 {
1258     if (2 == height) {
1259         avc_chroma_vt_and_aver_dst_2x2_msa(src, src_stride, dst, dst_stride,
1260                                            coeff0, coeff1);
1261     } else if (4 == height) {
1262         avc_chroma_vt_and_aver_dst_2x4_msa(src, src_stride, dst, dst_stride,
1263                                            coeff0, coeff1);
1264     } else if (8 == height) {
1265         avc_chroma_vt_and_aver_dst_2x8_msa(src, src_stride, dst, dst_stride,
1266                                            coeff0, coeff1);
1267     }
1268 }
1269
1270 static void avc_chroma_vt_and_aver_dst_4x2_msa(uint8_t *src, int32_t src_stride,
1271                                                uint8_t *dst, int32_t dst_stride,
1272                                                uint32_t coeff0, uint32_t coeff1)
1273 {
1274     uint32_t load0, load1;
1275     v16i8 src0, src1, src2, tmp0, tmp1;
1276     v16u8 dst_data = { 0 };
1277     v8u16 res_r;
1278     v16u8 res;
1279     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1280     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1281     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1282
1283     LD_SB3(src, src_stride, src0, src1, src2);
1284
1285     load0 = LW(dst);
1286     load1 = LW(dst + dst_stride);
1287
1288     INSERT_W2_UB(load0, load1, dst_data);
1289     ILVR_B2_SB(src1, src0, src2, src1, tmp0, tmp1);
1290
1291     tmp0 = (v16i8) __msa_ilvr_d((v2i64) tmp1, (v2i64) tmp0);
1292
1293     res_r = __msa_dotp_u_h((v16u8) tmp0, coeff_vec);
1294     res_r <<= 3;
1295     res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6);
1296     res_r = __msa_sat_u_h(res_r, 7);
1297     res = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
1298     res = __msa_aver_u_b(res, dst_data);
1299
1300     ST4x2_UB(res, dst, dst_stride);
1301 }
1302
1303 static void avc_chroma_vt_and_aver_dst_4x4mul_msa(uint8_t *src,
1304                                                   int32_t src_stride,
1305                                                   uint8_t *dst,
1306                                                   int32_t dst_stride,
1307                                                   uint32_t coeff0,
1308                                                   uint32_t coeff1,
1309                                                   int32_t height)
1310 {
1311     uint32_t load0, load1, row;
1312     v16i8 src0, src1, src2, src3, src4;
1313     v16u8 tmp0, tmp1, tmp2, tmp3;
1314     v16u8 dst0 = { 0 };
1315     v16u8 dst1 = { 0 };
1316     v8u16 res0_r, res1_r;
1317     v16u8 res0, res1;
1318     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1319     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1320     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1321
1322     src0 = LD_SB(src);
1323     src += src_stride;
1324
1325     for (row = (height >> 2); row--;) {
1326         LD_SB4(src, src_stride, src1, src2, src3, src4);
1327         src += (4 * src_stride);
1328
1329         load0 = LW(dst);
1330         load1 = LW(dst + dst_stride);
1331
1332         INSERT_W2_UB(load0, load1, dst0);
1333         load0 = LW(dst + 2 * dst_stride);
1334         load1 = LW(dst + 3 * dst_stride);
1335         INSERT_W2_UB(load0, load1, dst1);
1336
1337         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
1338                    tmp0, tmp1, tmp2, tmp3);
1339         ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, tmp0, tmp2);
1340         DOTP_UB2_UH(tmp0, tmp2, coeff_vec, coeff_vec, res0_r, res1_r);
1341
1342         res0_r <<= 3;
1343         res1_r <<= 3;
1344
1345         SRARI_H2_UH(res0_r, res1_r, 6);
1346         SAT_UH2_UH(res0_r, res1_r, 7);
1347         PCKEV_B2_UB(res0_r, res0_r, res1_r, res1_r, res0, res1);
1348         AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
1349
1350         ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
1351         dst += (4 * dst_stride);
1352         src0 = src4;
1353     }
1354 }
1355
1356 static void avc_chroma_vt_and_aver_dst_4w_msa(uint8_t *src, int32_t src_stride,
1357                                               uint8_t *dst, int32_t dst_stride,
1358                                               uint32_t coeff0, uint32_t coeff1,
1359                                               int32_t height)
1360 {
1361     if (2 == height) {
1362         avc_chroma_vt_and_aver_dst_4x2_msa(src, src_stride, dst, dst_stride,
1363                                            coeff0, coeff1);
1364     } else {
1365         avc_chroma_vt_and_aver_dst_4x4mul_msa(src, src_stride, dst, dst_stride,
1366                                               coeff0, coeff1, height);
1367     }
1368 }
1369
1370 static void avc_chroma_vt_and_aver_dst_8w_msa(uint8_t *src, int32_t src_stride,
1371                                               uint8_t *dst, int32_t dst_stride,
1372                                               uint32_t coeff0, uint32_t coeff1,
1373                                               int32_t height)
1374 {
1375     uint32_t row;
1376     v16u8 src0, src1, src2, src3, src4;
1377     v16u8 out0, out1;
1378     v8u16 res0, res1, res2, res3;
1379     v16u8 dst0, dst1, dst2, dst3;
1380     v16i8 coeff_vec0 = __msa_fill_b(coeff0);
1381     v16i8 coeff_vec1 = __msa_fill_b(coeff1);
1382     v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1);
1383
1384     src0 = LD_UB(src);
1385     src += src_stride;
1386
1387     for (row = height >> 2; row--;) {
1388         LD_UB4(src, src_stride, src1, src2, src3, src4);
1389         src += (4 * src_stride);
1390         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1391         ILVR_B4_UB(src1, src0, src2, src1, src3, src2, src4, src3,
1392                    src0, src1, src2, src3);
1393         DOTP_UB4_UH(src0, src1, src2, src3, coeff_vec, coeff_vec, coeff_vec,
1394                     coeff_vec, res0, res1, res2, res3);
1395         SLLI_4V(res0, res1, res2, res3, 3);
1396         SRARI_H4_UH(res0, res1, res2, res3, 6);
1397         SAT_UH4_UH(res0, res1, res2, res3, 7);
1398         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
1399         PCKEV_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1400         AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
1401         ST8x4_UB(out0, out1, dst, dst_stride);
1402
1403         dst += (4 * dst_stride);
1404         src0 = src4;
1405     }
1406 }
1407
1408 static void avc_chroma_hv_and_aver_dst_2x2_msa(uint8_t *src, int32_t src_stride,
1409                                                uint8_t *dst, int32_t dst_stride,
1410                                                uint32_t coef_hor0,
1411                                                uint32_t coef_hor1,
1412                                                uint32_t coef_ver0,
1413                                                uint32_t coef_ver1)
1414 {
1415     uint16_t out0, out1;
1416     v16u8 dst0, dst1;
1417     v16u8 src0, src1, src2;
1418     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
1419     v16i8 res, mask;
1420     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1421     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1422     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1423     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1424     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1425
1426     mask = LD_SB(&chroma_mask_arr[48]);
1427
1428     LD_UB3(src, src_stride, src0, src1, src2);
1429     LD_UB2(dst, dst_stride, dst0, dst1);
1430     VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
1431     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
1432     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
1433
1434     res_vt0 += res_vt1;
1435     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
1436     res_vt0 = __msa_sat_u_h(res_vt0, 7);
1437     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
1438     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 1, (v8i16) dst1);
1439     dst0 = __msa_aver_u_b((v16u8) res, dst0);
1440     out0 = __msa_copy_u_h((v8i16) dst0, 0);
1441     out1 = __msa_copy_u_h((v8i16) dst0, 1);
1442
1443     SH(out0, dst);
1444     dst += dst_stride;
1445     SH(out1, dst);
1446 }
1447
1448 static void avc_chroma_hv_and_aver_dst_2x4_msa(uint8_t *src, int32_t src_stride,
1449                                                uint8_t *dst, int32_t dst_stride,
1450                                                uint32_t coef_hor0,
1451                                                uint32_t coef_hor1,
1452                                                uint32_t coef_ver0,
1453                                                uint32_t coef_ver1)
1454 {
1455     v16u8 src0, src1, src2, src3, src4;
1456     v16u8 tmp0, tmp1, tmp2, tmp3;
1457     v16u8 dst0, dst1, dst2, dst3;
1458     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
1459     v16i8 res, mask;
1460     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1461     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1462     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1463     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1464     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1465
1466     mask = LD_SB(&chroma_mask_arr[48]);
1467
1468     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
1469     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1470     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, tmp0, tmp1);
1471     VSHF_B2_UB(src1, src2, src3, src4, mask, mask, tmp2, tmp3);
1472     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
1473     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
1474     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
1475
1476     res_vt0 += res_vt1;
1477     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
1478     res_vt0 = __msa_sat_u_h(res_vt0, 7);
1479     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
1480
1481     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 1, (v8i16) dst1);
1482     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 2, (v8i16) dst2);
1483     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 3, (v8i16) dst3);
1484     dst0 = __msa_aver_u_b((v16u8) res, dst0);
1485
1486     ST2x4_UB(dst0, 0, dst, dst_stride);
1487 }
1488
1489 static void avc_chroma_hv_and_aver_dst_2x8_msa(uint8_t *src, int32_t src_stride,
1490                                                uint8_t *dst, int32_t dst_stride,
1491                                                uint32_t coef_hor0,
1492                                                uint32_t coef_hor1,
1493                                                uint32_t coef_ver0,
1494                                                uint32_t coef_ver1)
1495 {
1496     v16u8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1497     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
1498     v16u8 tmp0, tmp1, tmp2, tmp3;
1499     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
1500     v16i8 res, mask;
1501     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1502     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1503     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1504     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1505     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1506
1507     mask = LD_SB(&chroma_mask_arr[48]);
1508
1509     LD_UB5(src, src_stride, src0, src1, src2, src3, src4);
1510     src += (5 * src_stride);
1511     LD_UB4(src, src_stride, src5, src6, src7, src8);
1512
1513     LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
1514
1515     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 1, (v8i16) dst1);
1516     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 2, (v8i16) dst2);
1517     dst0 = (v16u8) __msa_insve_h((v8i16) dst0, 3, (v8i16) dst3);
1518
1519     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 1, (v8i16) dst5);
1520     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 2, (v8i16) dst6);
1521     dst4 = (v16u8) __msa_insve_h((v8i16) dst4, 3, (v8i16) dst7);
1522
1523     VSHF_B2_UB(src0, src1, src2, src3, mask, mask, tmp0, tmp1);
1524     VSHF_B2_UB(src1, src2, src3, src4, mask, mask, tmp2, tmp3);
1525     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
1526     VSHF_B2_UB(src4, src5, src6, src7, mask, mask, tmp0, tmp1);
1527     VSHF_B2_UB(src5, src6, src7, src8, mask, mask, tmp2, tmp3);
1528     ILVR_D2_UB(tmp1, tmp0, tmp3, tmp2, src4, src5);
1529     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
1530     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
1531
1532     res_vt0 += res_vt1;
1533     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
1534     res_vt0 = __msa_sat_u_h(res_vt0, 7);
1535     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
1536     dst0 = __msa_aver_u_b((v16u8) res, dst0);
1537
1538     ST2x4_UB(dst0, 0, dst, dst_stride);
1539     dst += (4 * dst_stride);
1540
1541     DOTP_UB2_UH(src4, src5, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
1542     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
1543
1544     res_vt0 += res_vt1;
1545     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
1546     res_vt0 = __msa_sat_u_h(res_vt0, 7);
1547     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
1548     dst4 = __msa_aver_u_b((v16u8) res, dst4);
1549
1550     ST2x4_UB(dst4, 0, dst, dst_stride);
1551 }
1552
1553 static void avc_chroma_hv_and_aver_dst_2w_msa(uint8_t *src, int32_t src_stride,
1554                                               uint8_t *dst, int32_t dst_stride,
1555                                               uint32_t coef_hor0,
1556                                               uint32_t coef_hor1,
1557                                               uint32_t coef_ver0,
1558                                               uint32_t coef_ver1,
1559                                               int32_t height)
1560 {
1561     if (2 == height) {
1562         avc_chroma_hv_and_aver_dst_2x2_msa(src, src_stride, dst, dst_stride,
1563                                            coef_hor0, coef_hor1,
1564                                            coef_ver0, coef_ver1);
1565     } else if (4 == height) {
1566         avc_chroma_hv_and_aver_dst_2x4_msa(src, src_stride, dst, dst_stride,
1567                                            coef_hor0, coef_hor1,
1568                                            coef_ver0, coef_ver1);
1569     } else if (8 == height) {
1570         avc_chroma_hv_and_aver_dst_2x8_msa(src, src_stride, dst, dst_stride,
1571                                            coef_hor0, coef_hor1,
1572                                            coef_ver0, coef_ver1);
1573     }
1574 }
1575
1576 static void avc_chroma_hv_and_aver_dst_4x2_msa(uint8_t *src, int32_t src_stride,
1577                                                uint8_t *dst, int32_t dst_stride,
1578                                                uint32_t coef_hor0,
1579                                                uint32_t coef_hor1,
1580                                                uint32_t coef_ver0,
1581                                                uint32_t coef_ver1)
1582 {
1583     v16u8 src0, src1, src2;
1584     v16u8 dst0, dst1;
1585     v8u16 res_hz0, res_hz1, res_vt0, res_vt1;
1586     v16i8 res, mask;
1587     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1588     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1589     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1590     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1591     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1592
1593     mask = LD_SB(&chroma_mask_arr[0]);
1594
1595     LD_UB3(src, src_stride, src0, src1, src2);
1596     LD_UB2(dst, dst_stride, dst0, dst1);
1597     VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
1598     DOTP_UB2_UH(src0, src1, coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1);
1599     MUL2(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_vt0, res_vt1);
1600
1601     res_vt0 += res_vt1;
1602     res_vt0 = (v8u16) __msa_srari_h((v8i16) res_vt0, 6);
1603     res_vt0 = __msa_sat_u_h(res_vt0, 7);
1604     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
1605     dst0 = (v16u8) __msa_insve_w((v4i32) dst0, 1, (v4i32) dst1);
1606     dst0 = __msa_aver_u_b((v16u8) res, dst0);
1607
1608     ST4x2_UB(dst0, dst, dst_stride);
1609 }
1610
1611 static void avc_chroma_hv_and_aver_dst_4x4mul_msa(uint8_t *src,
1612                                                   int32_t src_stride,
1613                                                   uint8_t *dst,
1614                                                   int32_t dst_stride,
1615                                                   uint32_t coef_hor0,
1616                                                   uint32_t coef_hor1,
1617                                                   uint32_t coef_ver0,
1618                                                   uint32_t coef_ver1,
1619                                                   int32_t height)
1620 {
1621     uint32_t row;
1622     v16u8 src0, src1, src2, src3, src4;
1623     v16u8 dst0, dst1, dst2, dst3;
1624     v8u16 res_hz0, res_hz1, res_hz2, res_hz3;
1625     v8u16 res_vt0, res_vt1, res_vt2, res_vt3;
1626     v16i8 mask;
1627     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1628     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1629     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1630     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1631     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1632     v16u8 res0, res1;
1633
1634     mask = LD_SB(&chroma_mask_arr[0]);
1635
1636     src0 = LD_UB(src);
1637     src += src_stride;
1638
1639     for (row = (height >> 2); row--;) {
1640         LD_UB4(src, src_stride, src1, src2, src3, src4);
1641         src += (4 * src_stride);
1642
1643         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1644
1645         VSHF_B2_UB(src0, src1, src1, src2, mask, mask, src0, src1);
1646         VSHF_B2_UB(src2, src3, src3, src4, mask, mask, src2, src3);
1647         DOTP_UB4_UH(src0, src1, src2, src3, coeff_hz_vec, coeff_hz_vec,
1648                     coeff_hz_vec, coeff_hz_vec, res_hz0, res_hz1, res_hz2,
1649                     res_hz3);
1650         MUL4(res_hz0, coeff_vt_vec1, res_hz1, coeff_vt_vec0, res_hz2,
1651              coeff_vt_vec1, res_hz3, coeff_vt_vec0, res_vt0, res_vt1, res_vt2,
1652              res_vt3);
1653         ADD2(res_vt0, res_vt1, res_vt2, res_vt3, res_vt0, res_vt1);
1654         SRARI_H2_UH(res_vt0, res_vt1, 6);
1655         SAT_UH2_UH(res_vt0, res_vt1, 7);
1656         PCKEV_B2_UB(res_vt0, res_vt0, res_vt1, res_vt1, res0, res1);
1657
1658         dst0 = (v16u8) __msa_insve_w((v4i32) dst0, 1, (v4i32) dst1);
1659         dst1 = (v16u8) __msa_insve_w((v4i32) dst2, 1, (v4i32) dst3);
1660
1661         AVER_UB2_UB(res0, dst0, res1, dst1, dst0, dst1);
1662
1663         ST4x4_UB(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
1664         dst += (4 * dst_stride);
1665         src0 = src4;
1666     }
1667 }
1668
1669 static void avc_chroma_hv_and_aver_dst_4w_msa(uint8_t *src, int32_t src_stride,
1670                                               uint8_t *dst, int32_t dst_stride,
1671                                               uint32_t coef_hor0,
1672                                               uint32_t coef_hor1,
1673                                               uint32_t coef_ver0,
1674                                               uint32_t coef_ver1,
1675                                               int32_t height)
1676 {
1677     if (2 == height) {
1678         avc_chroma_hv_and_aver_dst_4x2_msa(src, src_stride, dst, dst_stride,
1679                                            coef_hor0, coef_hor1,
1680                                            coef_ver0, coef_ver1);
1681     } else {
1682         avc_chroma_hv_and_aver_dst_4x4mul_msa(src, src_stride, dst, dst_stride,
1683                                               coef_hor0, coef_hor1,
1684                                               coef_ver0, coef_ver1, height);
1685     }
1686 }
1687
1688 static void avc_chroma_hv_and_aver_dst_8w_msa(uint8_t *src, int32_t src_stride,
1689                                               uint8_t *dst, int32_t dst_stride,
1690                                               uint32_t coef_hor0,
1691                                               uint32_t coef_hor1,
1692                                               uint32_t coef_ver0,
1693                                               uint32_t coef_ver1,
1694                                               int32_t height)
1695 {
1696     uint32_t row;
1697     v16u8 src0, src1, src2, src3, src4, out0, out1;
1698     v8u16 res_hz0, res_hz1, res_hz2;
1699     v8u16 res_hz3, res_hz4;
1700     v8u16 res_vt0, res_vt1, res_vt2, res_vt3;
1701     v16u8 dst0, dst1, dst2, dst3;
1702     v16i8 mask;
1703     v16i8 coeff_hz_vec0 = __msa_fill_b(coef_hor0);
1704     v16i8 coeff_hz_vec1 = __msa_fill_b(coef_hor1);
1705     v16u8 coeff_hz_vec = (v16u8) __msa_ilvr_b(coeff_hz_vec0, coeff_hz_vec1);
1706     v8u16 coeff_vt_vec0 = (v8u16) __msa_fill_h(coef_ver0);
1707     v8u16 coeff_vt_vec1 = (v8u16) __msa_fill_h(coef_ver1);
1708
1709     mask = LD_SB(&chroma_mask_arr[32]);
1710
1711     src0 = LD_UB(src);
1712     src += src_stride;
1713
1714     src0 = (v16u8) __msa_vshf_b(mask, (v16i8) src0, (v16i8) src0);
1715     res_hz0 = __msa_dotp_u_h(src0, coeff_hz_vec);
1716
1717     for (row = (height >> 2); row--;) {
1718         LD_UB4(src, src_stride, src1, src2, src3, src4);
1719         src += (4 * src_stride);
1720
1721         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1722         VSHF_B2_UB(src1, src1, src2, src2, mask, mask, src1, src2);
1723         VSHF_B2_UB(src3, src3, src4, src4, mask, mask, src3, src4);
1724         DOTP_UB4_UH(src1, src2, src3, src4, coeff_hz_vec, coeff_hz_vec,
1725                     coeff_hz_vec, coeff_hz_vec, res_hz1, res_hz2, res_hz3,
1726                     res_hz4);
1727         MUL4(res_hz1, coeff_vt_vec0, res_hz2, coeff_vt_vec0, res_hz3,
1728              coeff_vt_vec0, res_hz4, coeff_vt_vec0, res_vt0, res_vt1, res_vt2,
1729              res_vt3);
1730
1731         res_vt0 += (res_hz0 * coeff_vt_vec1);
1732         res_vt1 += (res_hz1 * coeff_vt_vec1);
1733         res_vt2 += (res_hz2 * coeff_vt_vec1);
1734         res_vt3 += (res_hz3 * coeff_vt_vec1);
1735
1736         SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
1737         SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
1738
1739         PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
1740         PCKEV_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1741         AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
1742         ST8x4_UB(out0, out1, dst, dst_stride);
1743         dst += (4 * dst_stride);
1744
1745         res_hz0 = res_hz4;
1746     }
1747 }
1748
1749 static void copy_width8_msa(uint8_t *src, int32_t src_stride,
1750                             uint8_t *dst, int32_t dst_stride,
1751                             int32_t height)
1752 {
1753     int32_t cnt;
1754     uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
1755     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
1756
1757     if (0 == height % 12) {
1758         for (cnt = (height / 12); cnt--;) {
1759             LD_UB8(src, src_stride,
1760                    src0, src1, src2, src3, src4, src5, src6, src7);
1761             src += (8 * src_stride);
1762
1763             out0 = __msa_copy_u_d((v2i64) src0, 0);
1764             out1 = __msa_copy_u_d((v2i64) src1, 0);
1765             out2 = __msa_copy_u_d((v2i64) src2, 0);
1766             out3 = __msa_copy_u_d((v2i64) src3, 0);
1767             out4 = __msa_copy_u_d((v2i64) src4, 0);
1768             out5 = __msa_copy_u_d((v2i64) src5, 0);
1769             out6 = __msa_copy_u_d((v2i64) src6, 0);
1770             out7 = __msa_copy_u_d((v2i64) src7, 0);
1771
1772             SD4(out0, out1, out2, out3, dst, dst_stride);
1773             dst += (4 * dst_stride);
1774             SD4(out4, out5, out6, out7, dst, dst_stride);
1775             dst += (4 * dst_stride);
1776
1777             LD_UB4(src, src_stride, src0, src1, src2, src3);
1778             src += (4 * src_stride);
1779
1780             out0 = __msa_copy_u_d((v2i64) src0, 0);
1781             out1 = __msa_copy_u_d((v2i64) src1, 0);
1782             out2 = __msa_copy_u_d((v2i64) src2, 0);
1783             out3 = __msa_copy_u_d((v2i64) src3, 0);
1784
1785             SD4(out0, out1, out2, out3, dst, dst_stride);
1786             dst += (4 * dst_stride);
1787         }
1788     } else if (0 == height % 8) {
1789         for (cnt = height >> 3; cnt--;) {
1790             LD_UB8(src, src_stride,
1791                    src0, src1, src2, src3, src4, src5, src6, src7);
1792             src += (8 * src_stride);
1793
1794             out0 = __msa_copy_u_d((v2i64) src0, 0);
1795             out1 = __msa_copy_u_d((v2i64) src1, 0);
1796             out2 = __msa_copy_u_d((v2i64) src2, 0);
1797             out3 = __msa_copy_u_d((v2i64) src3, 0);
1798             out4 = __msa_copy_u_d((v2i64) src4, 0);
1799             out5 = __msa_copy_u_d((v2i64) src5, 0);
1800             out6 = __msa_copy_u_d((v2i64) src6, 0);
1801             out7 = __msa_copy_u_d((v2i64) src7, 0);
1802
1803             SD4(out0, out1, out2, out3, dst, dst_stride);
1804             dst += (4 * dst_stride);
1805             SD4(out4, out5, out6, out7, dst, dst_stride);
1806             dst += (4 * dst_stride);
1807         }
1808     } else if (0 == height % 4) {
1809         for (cnt = (height / 4); cnt--;) {
1810             LD_UB4(src, src_stride, src0, src1, src2, src3);
1811             src += (4 * src_stride);
1812             out0 = __msa_copy_u_d((v2i64) src0, 0);
1813             out1 = __msa_copy_u_d((v2i64) src1, 0);
1814             out2 = __msa_copy_u_d((v2i64) src2, 0);
1815             out3 = __msa_copy_u_d((v2i64) src3, 0);
1816
1817             SD4(out0, out1, out2, out3, dst, dst_stride);
1818             dst += (4 * dst_stride);
1819         }
1820     } else if (0 == height % 2) {
1821         for (cnt = (height / 2); cnt--;) {
1822             LD_UB2(src, src_stride, src0, src1);
1823             src += (2 * src_stride);
1824             out0 = __msa_copy_u_d((v2i64) src0, 0);
1825             out1 = __msa_copy_u_d((v2i64) src1, 0);
1826
1827             SD(out0, dst);
1828             dst += dst_stride;
1829             SD(out1, dst);
1830             dst += dst_stride;
1831         }
1832     }
1833 }
1834
1835 static void avg_width4_msa(uint8_t *src, int32_t src_stride,
1836                            uint8_t *dst, int32_t dst_stride,
1837                            int32_t height)
1838 {
1839     int32_t cnt;
1840     uint32_t out0, out1, out2, out3;
1841     v16u8 src0, src1, src2, src3;
1842     v16u8 dst0, dst1, dst2, dst3;
1843
1844     if (0 == (height % 4)) {
1845         for (cnt = (height / 4); cnt--;) {
1846             LD_UB4(src, src_stride, src0, src1, src2, src3);
1847             src += (4 * src_stride);
1848
1849             LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1850
1851             AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
1852                         dst0, dst1, dst2, dst3);
1853
1854             out0 = __msa_copy_u_w((v4i32) dst0, 0);
1855             out1 = __msa_copy_u_w((v4i32) dst1, 0);
1856             out2 = __msa_copy_u_w((v4i32) dst2, 0);
1857             out3 = __msa_copy_u_w((v4i32) dst3, 0);
1858             SW4(out0, out1, out2, out3, dst, dst_stride);
1859             dst += (4 * dst_stride);
1860         }
1861     } else if (0 == (height % 2)) {
1862         for (cnt = (height / 2); cnt--;) {
1863             LD_UB2(src, src_stride, src0, src1);
1864             src += (2 * src_stride);
1865
1866             LD_UB2(dst, dst_stride, dst0, dst1);
1867
1868             AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
1869
1870             out0 = __msa_copy_u_w((v4i32) dst0, 0);
1871             out1 = __msa_copy_u_w((v4i32) dst1, 0);
1872             SW(out0, dst);
1873             dst += dst_stride;
1874             SW(out1, dst);
1875             dst += dst_stride;
1876         }
1877     }
1878 }
1879
1880 static void avg_width8_msa(uint8_t *src, int32_t src_stride,
1881                            uint8_t *dst, int32_t dst_stride,
1882                            int32_t height)
1883 {
1884     int32_t cnt;
1885     uint64_t out0, out1, out2, out3;
1886     v16u8 src0, src1, src2, src3;
1887     v16u8 dst0, dst1, dst2, dst3;
1888
1889     for (cnt = (height / 4); cnt--;) {
1890         LD_UB4(src, src_stride, src0, src1, src2, src3);
1891         src += (4 * src_stride);
1892         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1893
1894         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
1895                     dst0, dst1, dst2, dst3);
1896
1897         out0 = __msa_copy_u_d((v2i64) dst0, 0);
1898         out1 = __msa_copy_u_d((v2i64) dst1, 0);
1899         out2 = __msa_copy_u_d((v2i64) dst2, 0);
1900         out3 = __msa_copy_u_d((v2i64) dst3, 0);
1901         SD4(out0, out1, out2, out3, dst, dst_stride);
1902         dst += (4 * dst_stride);
1903     }
1904 }
1905
1906 void ff_put_h264_chroma_mc8_msa(uint8_t *dst, uint8_t *src,
1907                                 ptrdiff_t stride, int height, int x, int y)
1908 {
1909     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
1910
1911     if (x && y) {
1912         avc_chroma_hv_8w_msa(src, stride, dst,
1913                              stride, x, (8 - x), y, (8 - y), height);
1914     } else if (x) {
1915         avc_chroma_hz_8w_msa(src, dst, stride, x, (8 - x), height);
1916     } else if (y) {
1917         avc_chroma_vt_8w_msa(src, stride, dst, stride, y, (8 - y), height);
1918     } else {
1919         copy_width8_msa(src, stride, dst, stride, height);
1920     }
1921 }
1922
1923 void ff_put_h264_chroma_mc4_msa(uint8_t *dst, uint8_t *src,
1924                                 ptrdiff_t stride, int height, int x, int y)
1925 {
1926     int32_t cnt;
1927
1928     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
1929
1930     if (x && y) {
1931         avc_chroma_hv_4w_msa(src, stride, dst,
1932                              stride, x, (8 - x), y, (8 - y), height);
1933     } else if (x) {
1934         avc_chroma_hz_4w_msa(src, dst, stride, x, (8 - x), height);
1935     } else if (y) {
1936         avc_chroma_vt_4w_msa(src, stride, dst, stride, y, (8 - y), height);
1937     } else {
1938         for (cnt = height; cnt--;) {
1939             *((uint32_t *) dst) = *((uint32_t *) src);
1940
1941             src += stride;
1942             dst += stride;
1943         }
1944     }
1945 }
1946
1947 void ff_put_h264_chroma_mc2_msa(uint8_t *dst, uint8_t *src,
1948                                 ptrdiff_t stride, int height, int x, int y)
1949 {
1950     int32_t cnt;
1951
1952     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
1953
1954     if (x && y) {
1955         avc_chroma_hv_2w_msa(src, stride, dst,
1956                              stride, x, (8 - x), y, (8 - y), height);
1957     } else if (x) {
1958         avc_chroma_hz_2w_msa(src, dst, stride, x, (8 - x), height);
1959     } else if (y) {
1960         avc_chroma_vt_2w_msa(src, stride, dst, stride, y, (8 - y), height);
1961     } else {
1962         for (cnt = height; cnt--;) {
1963             *((uint16_t *) dst) = *((uint16_t *) src);
1964
1965             src += stride;
1966             dst += stride;
1967         }
1968     }
1969 }
1970
1971 void ff_avg_h264_chroma_mc8_msa(uint8_t *dst, uint8_t *src,
1972                                 ptrdiff_t stride, int height, int x, int y)
1973 {
1974     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
1975
1976
1977     if (x && y) {
1978         avc_chroma_hv_and_aver_dst_8w_msa(src, stride, dst,
1979                                           stride, x, (8 - x), y,
1980                                           (8 - y), height);
1981     } else if (x) {
1982         avc_chroma_hz_and_aver_dst_8w_msa(src, stride, dst,
1983                                           stride, x, (8 - x), height);
1984     } else if (y) {
1985         avc_chroma_vt_and_aver_dst_8w_msa(src, stride, dst,
1986                                           stride, y, (8 - y), height);
1987     } else {
1988         avg_width8_msa(src, stride, dst, stride, height);
1989     }
1990 }
1991
1992 void ff_avg_h264_chroma_mc4_msa(uint8_t *dst, uint8_t *src,
1993                                 ptrdiff_t stride, int height, int x, int y)
1994 {
1995     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
1996
1997     if (x && y) {
1998         avc_chroma_hv_and_aver_dst_4w_msa(src, stride, dst,
1999                                           stride, x, (8 - x), y,
2000                                           (8 - y), height);
2001     } else if (x) {
2002         avc_chroma_hz_and_aver_dst_4w_msa(src, stride, dst,
2003                                           stride, x, (8 - x), height);
2004     } else if (y) {
2005         avc_chroma_vt_and_aver_dst_4w_msa(src, stride, dst,
2006                                           stride, y, (8 - y), height);
2007     } else {
2008         avg_width4_msa(src, stride, dst, stride, height);
2009     }
2010 }
2011
2012 void ff_avg_h264_chroma_mc2_msa(uint8_t *dst, uint8_t *src,
2013                                 ptrdiff_t stride, int height, int x, int y)
2014 {
2015     int32_t cnt;
2016
2017     av_assert2(x < 8 && y < 8 && x >= 0 && y >= 0);
2018
2019     if (x && y) {
2020         avc_chroma_hv_and_aver_dst_2w_msa(src, stride, dst,
2021                                           stride, x, (8 - x), y,
2022                                           (8 - y), height);
2023     } else if (x) {
2024         avc_chroma_hz_and_aver_dst_2w_msa(src, stride, dst,
2025                                           stride, x, (8 - x), height);
2026     } else if (y) {
2027         avc_chroma_vt_and_aver_dst_2w_msa(src, stride, dst,
2028                                           stride, y, (8 - y), height);
2029     } else {
2030         for (cnt = height; cnt--;) {
2031             dst[0] = (dst[0] + src[0] + 1) >> 1;
2032             dst[1] = (dst[1] + src[1] + 1) >> 1;
2033
2034             src += stride;
2035             dst += stride;
2036         }
2037     }
2038 }