]> git.sesse.net Git - ffmpeg/blob - libavcodec/mips/h264qpel_msa.c
Merge commit 'd154bdd3d053128c908a994bb26e14bbc17f0e53'
[ffmpeg] / libavcodec / mips / h264qpel_msa.c
1 /*
2  * Copyright (c) 2015 -2017 Parag Salasakar (Parag.Salasakar@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 "h264dsp_mips.h"
23
24 #define AVC_CALC_DPADD_H_6PIX_2COEFF_SH(in0, in1, in2, in3, in4, in5)    \
25 ( {                                                                      \
26     v4i32 tmp0_m, tmp1_m;                                                \
27     v8i16 out0_m, out1_m, out2_m, out3_m;                                \
28     v8i16 minus5h_m = __msa_ldi_h(-5);                                   \
29     v8i16 plus20h_m = __msa_ldi_h(20);                                   \
30                                                                          \
31     ILVRL_H2_SW(in5, in0, tmp0_m, tmp1_m);                               \
32                                                                          \
33     tmp0_m = __msa_hadd_s_w((v8i16) tmp0_m, (v8i16) tmp0_m);             \
34     tmp1_m = __msa_hadd_s_w((v8i16) tmp1_m, (v8i16) tmp1_m);             \
35                                                                          \
36     ILVRL_H2_SH(in1, in4, out0_m, out1_m);                               \
37     DPADD_SH2_SW(out0_m, out1_m, minus5h_m, minus5h_m, tmp0_m, tmp1_m);  \
38     ILVRL_H2_SH(in2, in3, out2_m, out3_m);                               \
39     DPADD_SH2_SW(out2_m, out3_m, plus20h_m, plus20h_m, tmp0_m, tmp1_m);  \
40                                                                          \
41     SRARI_W2_SW(tmp0_m, tmp1_m, 10);                                     \
42     SAT_SW2_SW(tmp0_m, tmp1_m, 7);                                       \
43     out0_m = __msa_pckev_h((v8i16) tmp1_m, (v8i16) tmp0_m);              \
44                                                                          \
45     out0_m;                                                              \
46 } )
47
48 #define AVC_HORZ_FILTER_SH(in, mask0, mask1, mask2)     \
49 ( {                                                     \
50     v8i16 out0_m, out1_m;                               \
51     v16i8 tmp0_m, tmp1_m;                               \
52     v16i8 minus5b = __msa_ldi_b(-5);                    \
53     v16i8 plus20b = __msa_ldi_b(20);                    \
54                                                         \
55     tmp0_m = __msa_vshf_b((v16i8) mask0, in, in);       \
56     out0_m = __msa_hadd_s_h(tmp0_m, tmp0_m);            \
57                                                         \
58     tmp0_m = __msa_vshf_b((v16i8) mask1, in, in);       \
59     out0_m = __msa_dpadd_s_h(out0_m, minus5b, tmp0_m);  \
60                                                         \
61     tmp1_m = __msa_vshf_b((v16i8) (mask2), in, in);     \
62     out1_m = __msa_dpadd_s_h(out0_m, plus20b, tmp1_m);  \
63                                                         \
64     out1_m;                                             \
65 } )
66
67 static const uint8_t luma_mask_arr[16 * 8] = {
68     /* 8 width cases */
69     0, 5, 1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 6, 11, 7, 12,
70     1, 4, 2, 5, 3, 6, 4, 7, 5, 8, 6, 9, 7, 10, 8, 11,
71     2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
72
73     /* 4 width cases */
74     0, 5, 1, 6, 2, 7, 3, 8, 16, 21, 17, 22, 18, 23, 19, 24,
75     1, 4, 2, 5, 3, 6, 4, 7, 17, 20, 18, 21, 19, 22, 20, 23,
76     2, 3, 3, 4, 4, 5, 5, 6, 18, 19, 19, 20, 20, 21, 21, 22,
77
78     2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 25,
79     3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26
80 };
81
82 #define AVC_CALC_DPADD_B_6PIX_2COEFF_SH(vec0, vec1, vec2, vec3, vec4, vec5,  \
83                                         out1, out2)                          \
84 {                                                                            \
85     v16i8 tmp0_m, tmp1_m;                                                    \
86     v16i8 minus5b_m = __msa_ldi_b(-5);                                       \
87     v16i8 plus20b_m = __msa_ldi_b(20);                                       \
88                                                                              \
89     ILVRL_B2_SB(vec5, vec0, tmp0_m, tmp1_m);                                 \
90     HADD_SB2_SH(tmp0_m, tmp1_m, out1, out2);                                 \
91     ILVRL_B2_SB(vec4, vec1, tmp0_m, tmp1_m);                                 \
92     DPADD_SB2_SH(tmp0_m, tmp1_m, minus5b_m, minus5b_m, out1, out2);          \
93     ILVRL_B2_SB(vec3, vec2, tmp0_m, tmp1_m);                                 \
94     DPADD_SB2_SH(tmp0_m, tmp1_m, plus20b_m, plus20b_m, out1, out2);          \
95 }
96
97 #define AVC_CALC_DPADD_B_6PIX_2COEFF_R_SH(vec0, vec1, vec2, vec3, vec4, vec5)  \
98 ( {                                                                            \
99     v8i16 tmp1_m;                                                              \
100     v16i8 tmp0_m, tmp2_m;                                                      \
101     v16i8 minus5b_m = __msa_ldi_b(-5);                                         \
102     v16i8 plus20b_m = __msa_ldi_b(20);                                         \
103                                                                                \
104     tmp1_m = (v8i16) __msa_ilvr_b((v16i8) vec5, (v16i8) vec0);                 \
105     tmp1_m = __msa_hadd_s_h((v16i8) tmp1_m, (v16i8) tmp1_m);                   \
106                                                                                \
107     ILVR_B2_SB(vec4, vec1, vec3, vec2, tmp0_m, tmp2_m);                        \
108     DPADD_SB2_SH(tmp0_m, tmp2_m, minus5b_m, plus20b_m, tmp1_m, tmp1_m);        \
109                                                                                \
110     tmp1_m;                                                                    \
111 } )
112
113 #define AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(vec0, vec1, vec2, vec3, vec4, vec5)  \
114 ( {                                                                            \
115     v4i32 tmp1_m;                                                              \
116     v8i16 tmp2_m, tmp3_m;                                                      \
117     v8i16 minus5h_m = __msa_ldi_h(-5);                                         \
118     v8i16 plus20h_m = __msa_ldi_h(20);                                         \
119                                                                                \
120     tmp1_m = (v4i32) __msa_ilvr_h((v8i16) vec5, (v8i16) vec0);                 \
121     tmp1_m = __msa_hadd_s_w((v8i16) tmp1_m, (v8i16) tmp1_m);                   \
122                                                                                \
123     ILVR_H2_SH(vec1, vec4, vec2, vec3, tmp2_m, tmp3_m);                        \
124     DPADD_SH2_SW(tmp2_m, tmp3_m, minus5h_m, plus20h_m, tmp1_m, tmp1_m);        \
125                                                                                \
126     tmp1_m = __msa_srari_w(tmp1_m, 10);                                        \
127     tmp1_m = __msa_sat_s_w(tmp1_m, 7);                                         \
128                                                                                \
129     tmp2_m = __msa_pckev_h((v8i16) tmp1_m, (v8i16) tmp1_m);                    \
130                                                                                \
131     tmp2_m;                                                                    \
132 } )
133
134 #define AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,              \
135                                                     mask0, mask1, mask2)     \
136 ( {                                                                          \
137     v8i16 hz_out_m;                                                          \
138     v16i8 vec0_m, vec1_m, vec2_m;                                            \
139     v16i8 minus5b_m = __msa_ldi_b(-5);                                       \
140     v16i8 plus20b_m = __msa_ldi_b(20);                                       \
141                                                                              \
142     vec0_m = __msa_vshf_b((v16i8) mask0, (v16i8) src1, (v16i8) src0);        \
143     hz_out_m = __msa_hadd_s_h(vec0_m, vec0_m);                               \
144                                                                              \
145     VSHF_B2_SB(src0, src1, src0, src1, mask1, mask2, vec1_m, vec2_m);        \
146     DPADD_SB2_SH(vec1_m, vec2_m, minus5b_m, plus20b_m, hz_out_m, hz_out_m);  \
147                                                                              \
148     hz_out_m;                                                                \
149 } )
150
151 #define AVC_DOT_SH3_SH(in0, in1, in2, coeff0, coeff1, coeff2)       \
152 ( {                                                                 \
153     v8i16 out0_m;                                                   \
154                                                                     \
155     out0_m = __msa_dotp_s_h((v16i8) in0, (v16i8) coeff0);           \
156     out0_m = __msa_dpadd_s_h(out0_m, (v16i8) in1, (v16i8) coeff1);  \
157     out0_m = __msa_dpadd_s_h(out0_m, (v16i8) in2, (v16i8) coeff2);  \
158                                                                     \
159     out0_m;                                                         \
160 } )
161
162 static void avc_luma_hz_4w_msa(const uint8_t *src, int32_t src_stride,
163                                uint8_t *dst, int32_t dst_stride,
164                                int32_t height)
165 {
166     uint32_t loop_cnt;
167     v16i8 src0, src1, src2, src3;
168     v8i16 res0, res1;
169     v16u8 out;
170     v16i8 mask0, mask1, mask2;
171     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
172     v16i8 minus5b = __msa_ldi_b(-5);
173     v16i8 plus20b = __msa_ldi_b(20);
174
175     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
176     for (loop_cnt = (height >> 2); loop_cnt--;) {
177         LD_SB4(src, src_stride, src0, src1, src2, src3);
178         src += (4 * src_stride);
179
180         XORI_B4_128_SB(src0, src1, src2, src3);
181         VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
182         HADD_SB2_SH(vec0, vec1, res0, res1);
183         VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
184         DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
185         VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
186         DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
187         SRARI_H2_SH(res0, res1, 5);
188         SAT_SH2_SH(res0, res1, 7);
189         out = PCKEV_XORI128_UB(res0, res1);
190         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
191         dst += (4 * dst_stride);
192     }
193 }
194
195 static void avc_luma_hz_8w_msa(const uint8_t *src, int32_t src_stride,
196                                uint8_t *dst, int32_t dst_stride,
197                                int32_t height)
198 {
199     uint32_t loop_cnt;
200     v16i8 src0, src1, src2, src3;
201     v8i16 res0, res1, res2, res3;
202     v16i8 mask0, mask1, mask2;
203     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
204     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
205     v16i8 minus5b = __msa_ldi_b(-5);
206     v16i8 plus20b = __msa_ldi_b(20);
207     v16u8 out0, out1;
208
209     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
210
211     for (loop_cnt = (height >> 2); loop_cnt--;) {
212         LD_SB4(src, src_stride, src0, src1, src2, src3);
213         src += (4 * src_stride);
214
215         XORI_B4_128_SB(src0, src1, src2, src3);
216         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
217         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
218         HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
219         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
220         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
221         DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
222                      res0, res1, res2, res3);
223         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
224         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
225         DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
226                      plus20b, res0, res1, res2, res3);
227         SRARI_H4_SH(res0, res1, res2, res3, 5);
228         SAT_SH4_SH(res0, res1, res2, res3, 7);
229         out0 = PCKEV_XORI128_UB(res0, res1);
230         out1 = PCKEV_XORI128_UB(res2, res3);
231         ST8x4_UB(out0, out1, dst, dst_stride);
232         dst += (4 * dst_stride);
233     }
234 }
235
236 static void avc_luma_hz_16w_msa(const uint8_t *src, int32_t src_stride,
237                                 uint8_t *dst, int32_t dst_stride,
238                                 int32_t height)
239 {
240     uint32_t loop_cnt;
241     v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
242     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
243     v16i8 mask0, mask1, mask2;
244     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
245     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
246     v16i8 minus5b = __msa_ldi_b(-5);
247     v16i8 plus20b = __msa_ldi_b(20);
248
249     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
250
251     for (loop_cnt = (height >> 2); loop_cnt--;) {
252         LD_SB2(src, 8, src0, src1);
253         src += src_stride;
254         LD_SB2(src, 8, src2, src3);
255         src += src_stride;
256
257         XORI_B4_128_SB(src0, src1, src2, src3);
258         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec3);
259         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec9);
260         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec1, vec4);
261         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec7, vec10);
262         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec2, vec5);
263         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec8, vec11);
264         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
265         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
266                      minus5b, res0, res1, res2, res3);
267         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
268                      plus20b, res0, res1, res2, res3);
269
270         LD_SB2(src, 8, src4, src5);
271         src += src_stride;
272         LD_SB2(src, 8, src6, src7);
273         src += src_stride;
274
275         XORI_B4_128_SB(src4, src5, src6, src7);
276         VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec3);
277         VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec6, vec9);
278         VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec1, vec4);
279         VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec7, vec10);
280         VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec2, vec5);
281         VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec8, vec11);
282         HADD_SB4_SH(vec0, vec3, vec6, vec9, res4, res5, res6, res7);
283         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
284                      minus5b, res4, res5, res6, res7);
285         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
286                      plus20b, res4, res5, res6, res7);
287         SRARI_H4_SH(res0, res1, res2, res3, 5);
288         SRARI_H4_SH(res4, res5, res6, res7, 5);
289         SAT_SH4_SH(res0, res1, res2, res3, 7);
290         SAT_SH4_SH(res4, res5, res6, res7, 7);
291         PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
292                     vec0, vec1, vec2, vec3);
293         XORI_B4_128_SB(vec0, vec1, vec2, vec3);
294
295         ST_SB4(vec0, vec1, vec2, vec3, dst, dst_stride);
296         dst += (4 * dst_stride);
297     }
298 }
299
300 static void avc_luma_hz_qrt_4w_msa(const uint8_t *src, int32_t src_stride,
301                                    uint8_t *dst, int32_t dst_stride,
302                                    int32_t height, uint8_t hor_offset)
303 {
304     uint8_t slide;
305     uint32_t loop_cnt;
306     v16i8 src0, src1, src2, src3;
307     v8i16 res0, res1;
308     v16i8 res, mask0, mask1, mask2;
309     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
310     v16i8 minus5b = __msa_ldi_b(-5);
311     v16i8 plus20b = __msa_ldi_b(20);
312
313     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
314     slide = 2 + hor_offset;
315
316     for (loop_cnt = (height >> 2); loop_cnt--;) {
317         LD_SB4(src, src_stride, src0, src1, src2, src3);
318         src += (4 * src_stride);
319
320         XORI_B4_128_SB(src0, src1, src2, src3);
321         VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
322         HADD_SB2_SH(vec0, vec1, res0, res1);
323         VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
324         DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
325         VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
326         DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
327         SRARI_H2_SH(res0, res1, 5);
328         SAT_SH2_SH(res0, res1, 7);
329
330         res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
331         src0 = __msa_sld_b(src0, src0, slide);
332         src1 = __msa_sld_b(src1, src1, slide);
333         src2 = __msa_sld_b(src2, src2, slide);
334         src3 = __msa_sld_b(src3, src3, slide);
335         src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
336         src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
337         src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
338         res = __msa_aver_s_b(res, src0);
339         res = (v16i8) __msa_xori_b((v16u8) res, 128);
340
341         ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
342         dst += (4 * dst_stride);
343     }
344 }
345
346 static void avc_luma_hz_qrt_8w_msa(const uint8_t *src, int32_t src_stride,
347                                    uint8_t *dst, int32_t dst_stride,
348                                    int32_t height, uint8_t hor_offset)
349 {
350     uint8_t slide;
351     uint32_t loop_cnt;
352     v16i8 src0, src1, src2, src3;
353     v16i8 tmp0, tmp1;
354     v8i16 res0, res1, res2, res3;
355     v16i8 mask0, mask1, mask2;
356     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
357     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
358     v16i8 minus5b = __msa_ldi_b(-5);
359     v16i8 plus20b = __msa_ldi_b(20);
360
361     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
362     slide = 2 + hor_offset;
363
364     for (loop_cnt = height >> 2; loop_cnt--;) {
365         LD_SB4(src, src_stride, src0, src1, src2, src3);
366         src += (4 * src_stride);
367
368         XORI_B4_128_SB(src0, src1, src2, src3);
369         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
370         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
371         HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
372         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
373         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
374         DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
375                      res0, res1, res2, res3);
376         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
377         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
378         DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
379                      plus20b, res0, res1, res2, res3);
380
381         src0 = __msa_sld_b(src0, src0, slide);
382         src1 = __msa_sld_b(src1, src1, slide);
383         src2 = __msa_sld_b(src2, src2, slide);
384         src3 = __msa_sld_b(src3, src3, slide);
385
386         SRARI_H4_SH(res0, res1, res2, res3, 5);
387         SAT_SH4_SH(res0, res1, res2, res3, 7);
388         PCKEV_B2_SB(res1, res0, res3, res2, tmp0, tmp1);
389         PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
390
391         tmp0 = __msa_aver_s_b(tmp0, src0);
392         tmp1 = __msa_aver_s_b(tmp1, src1);
393
394         XORI_B2_128_SB(tmp0, tmp1);
395         ST8x4_UB(tmp0, tmp1, dst, dst_stride);
396
397         dst += (4 * dst_stride);
398     }
399 }
400
401 static void avc_luma_hz_qrt_16w_msa(const uint8_t *src, int32_t src_stride,
402                                     uint8_t *dst, int32_t dst_stride,
403                                     int32_t height, uint8_t hor_offset)
404 {
405     uint32_t loop_cnt;
406     v16i8 dst0, dst1;
407     v16i8 src0, src1, src2, src3;
408     v16i8 mask0, mask1, mask2, vshf;
409     v8i16 res0, res1, res2, res3;
410     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
411     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
412     v16i8 minus5b = __msa_ldi_b(-5);
413     v16i8 plus20b = __msa_ldi_b(20);
414
415     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
416
417     if (hor_offset) {
418         vshf = LD_SB(&luma_mask_arr[16 + 96]);
419     } else {
420         vshf = LD_SB(&luma_mask_arr[96]);
421     }
422
423     for (loop_cnt = height >> 1; loop_cnt--;) {
424         LD_SB2(src, 8, src0, src1);
425         src += src_stride;
426         LD_SB2(src, 8, src2, src3);
427         src += src_stride;
428
429         XORI_B4_128_SB(src0, src1, src2, src3);
430         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec3);
431         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec9);
432         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec1, vec4);
433         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec7, vec10);
434         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec2, vec5);
435         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec8, vec11);
436         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
437         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
438                      minus5b, res0, res1, res2, res3);
439         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
440                      plus20b, res0, res1, res2, res3);
441         VSHF_B2_SB(src0, src1, src2, src3, vshf, vshf, src0, src2);
442         SRARI_H4_SH(res0, res1, res2, res3, 5);
443         SAT_SH4_SH(res0, res1, res2, res3, 7);
444         PCKEV_B2_SB(res1, res0, res3, res2, dst0, dst1);
445
446         dst0 = __msa_aver_s_b(dst0, src0);
447         dst1 = __msa_aver_s_b(dst1, src2);
448
449         XORI_B2_128_SB(dst0, dst1);
450
451         ST_SB2(dst0, dst1, dst, dst_stride);
452         dst += (2 * dst_stride);
453     }
454 }
455
456 static void avc_luma_vt_4w_msa(const uint8_t *src, int32_t src_stride,
457                                uint8_t *dst, int32_t dst_stride,
458                                int32_t height)
459 {
460     int32_t loop_cnt;
461     int16_t filt_const0 = 0xfb01;
462     int16_t filt_const1 = 0x1414;
463     int16_t filt_const2 = 0x1fb;
464     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
465     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
466     v16i8 src87_r, src2110, src4332, src6554, src8776;
467     v16i8 filt0, filt1, filt2;
468     v8i16 out10, out32;
469     v16u8 out;
470
471     filt0 = (v16i8) __msa_fill_h(filt_const0);
472     filt1 = (v16i8) __msa_fill_h(filt_const1);
473     filt2 = (v16i8) __msa_fill_h(filt_const2);
474
475     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
476     src += (5 * src_stride);
477
478     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
479                src10_r, src21_r, src32_r, src43_r);
480     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
481     XORI_B2_128_SB(src2110, src4332);
482
483     for (loop_cnt = (height >> 2); loop_cnt--;) {
484         LD_SB4(src, src_stride, src5, src6, src7, src8);
485         src += (4 * src_stride);
486
487         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
488                    src54_r, src65_r, src76_r, src87_r);
489         ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
490         XORI_B2_128_SB(src6554, src8776);
491         out10 = DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
492         out32 = DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
493         SRARI_H2_SH(out10, out32, 5);
494         SAT_SH2_SH(out10, out32, 7);
495         out = PCKEV_XORI128_UB(out10, out32);
496         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
497
498         dst += (4 * dst_stride);
499         src2110 = src6554;
500         src4332 = src8776;
501         src4 = src8;
502     }
503 }
504
505 static void avc_luma_vt_8w_msa(const uint8_t *src, int32_t src_stride,
506                                uint8_t *dst, int32_t dst_stride,
507                                int32_t height)
508 {
509     int32_t loop_cnt;
510     int16_t filt_const0 = 0xfb01;
511     int16_t filt_const1 = 0x1414;
512     int16_t filt_const2 = 0x1fb;
513     v16i8 src0, src1, src2, src3, src4, src7, src8, src9, src10;
514     v16i8 src10_r, src32_r, src76_r, src98_r;
515     v16i8 src21_r, src43_r, src87_r, src109_r;
516     v8i16 out0_r, out1_r, out2_r, out3_r;
517     v16i8 filt0, filt1, filt2;
518     v16u8 out0, out1;
519
520     filt0 = (v16i8) __msa_fill_h(filt_const0);
521     filt1 = (v16i8) __msa_fill_h(filt_const1);
522     filt2 = (v16i8) __msa_fill_h(filt_const2);
523
524     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
525     src += (5 * src_stride);
526
527     XORI_B5_128_SB(src0, src1, src2, src3, src4);
528     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
529                src10_r, src21_r, src32_r, src43_r);
530
531     for (loop_cnt = (height >> 2); loop_cnt--;) {
532         LD_SB4(src, src_stride, src7, src8, src9, src10);
533         src += (4 * src_stride);
534
535         XORI_B4_128_SB(src7, src8, src9, src10);
536         ILVR_B4_SB(src7, src4, src8, src7, src9, src8, src10, src9,
537                    src76_r, src87_r, src98_r, src109_r);
538         out0_r = DPADD_SH3_SH(src10_r, src32_r, src76_r, filt0, filt1, filt2);
539         out1_r = DPADD_SH3_SH(src21_r, src43_r, src87_r, filt0, filt1, filt2);
540         out2_r = DPADD_SH3_SH(src32_r, src76_r, src98_r, filt0, filt1, filt2);
541         out3_r = DPADD_SH3_SH(src43_r, src87_r, src109_r, filt0, filt1, filt2);
542         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
543         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
544         out0 = PCKEV_XORI128_UB(out0_r, out1_r);
545         out1 = PCKEV_XORI128_UB(out2_r, out3_r);
546         ST8x4_UB(out0, out1, dst, dst_stride);
547         dst += (4 * dst_stride);
548
549         src10_r = src76_r;
550         src32_r = src98_r;
551         src21_r = src87_r;
552         src43_r = src109_r;
553         src4 = src10;
554     }
555 }
556
557 static void avc_luma_vt_16w_msa(const uint8_t *src, int32_t src_stride,
558                                 uint8_t *dst, int32_t dst_stride,
559                                 int32_t height)
560 {
561     int32_t loop_cnt;
562     int16_t filt_const0 = 0xfb01;
563     int16_t filt_const1 = 0x1414;
564     int16_t filt_const2 = 0x1fb;
565     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
566     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
567     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
568     v16i8 src65_l, src87_l;
569     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
570     v16u8 res0, res1, res2, res3;
571     v16i8 filt0, filt1, filt2;
572
573     filt0 = (v16i8) __msa_fill_h(filt_const0);
574     filt1 = (v16i8) __msa_fill_h(filt_const1);
575     filt2 = (v16i8) __msa_fill_h(filt_const2);
576
577     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
578     src += (5 * src_stride);
579
580     XORI_B5_128_SB(src0, src1, src2, src3, src4);
581     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
582                src10_r, src21_r, src32_r, src43_r);
583     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
584                src10_l, src21_l, src32_l, src43_l);
585
586     for (loop_cnt = (height >> 2); loop_cnt--;) {
587         LD_SB4(src, src_stride, src5, src6, src7, src8);
588         src += (4 * src_stride);
589
590         XORI_B4_128_SB(src5, src6, src7, src8);
591         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
592                    src54_r, src65_r, src76_r, src87_r);
593         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
594                    src54_l, src65_l, src76_l, src87_l);
595         out0_r = DPADD_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
596         out1_r = DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
597         out2_r = DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
598         out3_r = DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
599         out0_l = DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
600         out1_l = DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
601         out2_l = DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
602         out3_l = DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
603         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
604         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
605         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
606         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
607         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
608                     out3_r, res0, res1, res2, res3);
609         XORI_B4_128_UB(res0, res1, res2, res3);
610
611         ST_UB4(res0, res1, res2, res3, dst, dst_stride);
612         dst += (4 * dst_stride);
613
614         src10_r = src54_r;
615         src32_r = src76_r;
616         src21_r = src65_r;
617         src43_r = src87_r;
618         src10_l = src54_l;
619         src32_l = src76_l;
620         src21_l = src65_l;
621         src43_l = src87_l;
622         src4 = src8;
623     }
624 }
625
626 static void avc_luma_vt_qrt_4w_msa(const uint8_t *src, int32_t src_stride,
627                                    uint8_t *dst, int32_t dst_stride,
628                                    int32_t height, uint8_t ver_offset)
629 {
630     int32_t loop_cnt;
631     int16_t filt_const0 = 0xfb01;
632     int16_t filt_const1 = 0x1414;
633     int16_t filt_const2 = 0x1fb;
634     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
635     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
636     v16i8 src87_r, src2110, src4332, src6554, src8776;
637     v8i16 out10, out32;
638     v16i8 filt0, filt1, filt2;
639     v16u8 out;
640
641     filt0 = (v16i8) __msa_fill_h(filt_const0);
642     filt1 = (v16i8) __msa_fill_h(filt_const1);
643     filt2 = (v16i8) __msa_fill_h(filt_const2);
644
645     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
646     src += (5 * src_stride);
647
648     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
649                src10_r, src21_r, src32_r, src43_r);
650     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
651     XORI_B2_128_SB(src2110, src4332);
652
653     for (loop_cnt = (height >> 2); loop_cnt--;) {
654         LD_SB4(src, src_stride, src5, src6, src7, src8);
655         src += (4 * src_stride);
656
657         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
658                    src54_r, src65_r, src76_r, src87_r);
659         ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
660         XORI_B2_128_SB(src6554, src8776);
661         out10 = DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
662         out32 = DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
663         SRARI_H2_SH(out10, out32, 5);
664         SAT_SH2_SH(out10, out32, 7);
665
666         out = PCKEV_XORI128_UB(out10, out32);
667
668         if (ver_offset) {
669             src32_r = (v16i8) __msa_insve_w((v4i32) src3, 1, (v4i32) src4);
670             src54_r = (v16i8) __msa_insve_w((v4i32) src5, 1, (v4i32) src6);
671         } else {
672             src32_r = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
673             src54_r = (v16i8) __msa_insve_w((v4i32) src4, 1, (v4i32) src5);
674         }
675
676         src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
677         out = __msa_aver_u_b(out, (v16u8) src32_r);
678
679         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
680         dst += (4 * dst_stride);
681         src2110 = src6554;
682         src4332 = src8776;
683         src2 = src6;
684         src3 = src7;
685         src4 = src8;
686     }
687 }
688
689 static void avc_luma_vt_qrt_8w_msa(const uint8_t *src, int32_t src_stride,
690                                    uint8_t *dst, int32_t dst_stride,
691                                    int32_t height, uint8_t ver_offset)
692 {
693     int32_t loop_cnt;
694     int16_t filt_const0 = 0xfb01;
695     int16_t filt_const1 = 0x1414;
696     int16_t filt_const2 = 0x1fb;
697     v16i8 src0, src1, src2, src3, src4, src7, src8, src9, src10;
698     v16i8 src10_r, src32_r, src76_r, src98_r;
699     v16i8 src21_r, src43_r, src87_r, src109_r;
700     v8i16 out0_r, out1_r, out2_r, out3_r;
701     v16i8 res0, res1;
702     v16i8 filt0, filt1, filt2;
703
704     filt0 = (v16i8) __msa_fill_h(filt_const0);
705     filt1 = (v16i8) __msa_fill_h(filt_const1);
706     filt2 = (v16i8) __msa_fill_h(filt_const2);
707
708     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
709     src += (5 * src_stride);
710
711     XORI_B5_128_SB(src0, src1, src2, src3, src4);
712     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
713                src10_r, src21_r, src32_r, src43_r);
714
715     for (loop_cnt = (height >> 2); loop_cnt--;) {
716         LD_SB4(src, src_stride, src7, src8, src9, src10);
717         src += (4 * src_stride);
718
719         XORI_B4_128_SB(src7, src8, src9, src10);
720         ILVR_B4_SB(src7, src4, src8, src7, src9, src8, src10, src9,
721                    src76_r, src87_r, src98_r, src109_r);
722         out0_r = DPADD_SH3_SH(src10_r, src32_r, src76_r, filt0, filt1, filt2);
723         out1_r = DPADD_SH3_SH(src21_r, src43_r, src87_r, filt0, filt1, filt2);
724         out2_r = DPADD_SH3_SH(src32_r, src76_r, src98_r, filt0, filt1, filt2);
725         out3_r = DPADD_SH3_SH(src43_r, src87_r, src109_r, filt0, filt1, filt2);
726         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
727         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
728         PCKEV_B2_SB(out1_r, out0_r, out3_r, out2_r, res0, res1);
729
730         if (ver_offset) {
731             PCKEV_D2_SB(src4, src3, src8, src7, src10_r, src32_r);
732         } else {
733             PCKEV_D2_SB(src3, src2, src7, src4, src10_r, src32_r);
734         }
735
736         res0 = __msa_aver_s_b(res0, (v16i8) src10_r);
737         res1 = __msa_aver_s_b(res1, (v16i8) src32_r);
738
739         XORI_B2_128_SB(res0, res1);
740         ST8x4_UB(res0, res1, dst, dst_stride);
741
742         dst += (4 * dst_stride);
743         src10_r = src76_r;
744         src32_r = src98_r;
745         src21_r = src87_r;
746         src43_r = src109_r;
747         src2 = src8;
748         src3 = src9;
749         src4 = src10;
750     }
751 }
752
753 static void avc_luma_vt_qrt_16w_msa(const uint8_t *src, int32_t src_stride,
754                                     uint8_t *dst, int32_t dst_stride,
755                                     int32_t height, uint8_t ver_offset)
756 {
757     int32_t loop_cnt;
758     int16_t filt_const0 = 0xfb01;
759     int16_t filt_const1 = 0x1414;
760     int16_t filt_const2 = 0x1fb;
761     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
762     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
763     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
764     v16i8 src65_l, src87_l;
765     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
766     v16u8 res0, res1, res2, res3;
767     v16i8 filt0, filt1, filt2;
768
769     filt0 = (v16i8) __msa_fill_h(filt_const0);
770     filt1 = (v16i8) __msa_fill_h(filt_const1);
771     filt2 = (v16i8) __msa_fill_h(filt_const2);
772
773     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
774     src += (5 * src_stride);
775
776     XORI_B5_128_SB(src0, src1, src2, src3, src4);
777     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
778                src10_r, src21_r, src32_r, src43_r);
779     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
780                src10_l, src21_l, src32_l, src43_l);
781
782     for (loop_cnt = (height >> 2); loop_cnt--;) {
783         LD_SB4(src, src_stride, src5, src6, src7, src8);
784         src += (4 * src_stride);
785
786         XORI_B4_128_SB(src5, src6, src7, src8);
787         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
788                    src54_r, src65_r, src76_r, src87_r);
789         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
790                    src54_l, src65_l, src76_l, src87_l);
791         out0_r = DPADD_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
792         out1_r = DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
793         out2_r = DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
794         out3_r = DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
795         out0_l = DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
796         out1_l = DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
797         out2_l = DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
798         out3_l = DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
799         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
800         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
801         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
802         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
803         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
804                     out3_r, res0, res1, res2, res3);
805
806         if (ver_offset) {
807             res0 = (v16u8) __msa_aver_s_b((v16i8) res0, src3);
808             res1 = (v16u8) __msa_aver_s_b((v16i8) res1, src4);
809             res2 = (v16u8) __msa_aver_s_b((v16i8) res2, src5);
810             res3 = (v16u8) __msa_aver_s_b((v16i8) res3, src6);
811         } else {
812             res0 = (v16u8) __msa_aver_s_b((v16i8) res0, src2);
813             res1 = (v16u8) __msa_aver_s_b((v16i8) res1, src3);
814             res2 = (v16u8) __msa_aver_s_b((v16i8) res2, src4);
815             res3 = (v16u8) __msa_aver_s_b((v16i8) res3, src5);
816         }
817
818         XORI_B4_128_UB(res0, res1, res2, res3);
819         ST_UB4(res0, res1, res2, res3, dst, dst_stride);
820
821         dst += (4 * dst_stride);
822
823         src10_r = src54_r;
824         src32_r = src76_r;
825         src21_r = src65_r;
826         src43_r = src87_r;
827         src10_l = src54_l;
828         src32_l = src76_l;
829         src21_l = src65_l;
830         src43_l = src87_l;
831         src2 = src6;
832         src3 = src7;
833         src4 = src8;
834     }
835 }
836
837 static void avc_luma_mid_4w_msa(const uint8_t *src, int32_t src_stride,
838                                 uint8_t *dst, int32_t dst_stride,
839                                 int32_t height)
840 {
841     uint32_t loop_cnt;
842     v16i8 src0, src1, src2, src3, src4;
843     v16i8 mask0, mask1, mask2;
844     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
845     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
846     v8i16 dst0, dst1, dst2, dst3;
847
848     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
849     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
850     src += (5 * src_stride);
851
852     XORI_B5_128_SB(src0, src1, src2, src3, src4);
853
854     hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
855                                                           mask0, mask1, mask2);
856     hz_out2 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
857                                                           mask0, mask1, mask2);
858
859     PCKOD_D2_SH(hz_out0, hz_out0, hz_out2, hz_out2, hz_out1, hz_out3);
860
861     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
862
863     for (loop_cnt = (height >> 2); loop_cnt--;) {
864         LD_SB4(src, src_stride, src0, src1, src2, src3);
865         src += (4 * src_stride);
866
867         XORI_B4_128_SB(src0, src1, src2, src3);
868
869         hz_out5 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
870                                                               mask0, mask1,
871                                                               mask2);
872         hz_out7 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
873                                                               mask0, mask1,
874                                                               mask2);
875
876         PCKOD_D2_SH(hz_out5, hz_out5, hz_out7, hz_out7, hz_out6, hz_out8);
877
878         dst0 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out0, hz_out1, hz_out2,
879                                                  hz_out3, hz_out4, hz_out5);
880         dst1 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out1, hz_out2, hz_out3,
881                                                  hz_out4, hz_out5, hz_out6);
882         dst2 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out2, hz_out3, hz_out4,
883                                                  hz_out5, hz_out6, hz_out7);
884         dst3 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out3, hz_out4, hz_out5,
885                                                  hz_out6, hz_out7, hz_out8);
886
887         PCKEV_B2_SB(dst1, dst0, dst3, dst2, src0, src1);
888         XORI_B2_128_SB(src0, src1);
889
890         ST4x4_UB(src0, src1, 0, 2, 0, 2, dst, dst_stride);
891
892         dst += (4 * dst_stride);
893
894         hz_out0 = hz_out4;
895         hz_out1 = hz_out5;
896         hz_out2 = hz_out6;
897         hz_out3 = hz_out7;
898         hz_out4 = hz_out8;
899     }
900 }
901
902 static void avc_luma_mid_8w_msa(const uint8_t *src, int32_t src_stride,
903                                 uint8_t *dst, int32_t dst_stride,
904                                 int32_t height)
905 {
906     uint32_t loop_cnt;
907     v16i8 src0, src1, src2, src3, src4;
908     v16i8 mask0, mask1, mask2;
909     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
910     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
911     v8i16 dst0, dst1, dst2, dst3;
912     v16u8 out0, out1;
913
914     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
915
916     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
917     XORI_B5_128_SB(src0, src1, src2, src3, src4);
918     src += (5 * src_stride);
919
920     hz_out0 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
921     hz_out1 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
922     hz_out2 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
923     hz_out3 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
924     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
925
926     for (loop_cnt = (height >> 2); loop_cnt--;) {
927         LD_SB4(src, src_stride, src0, src1, src2, src3);
928         XORI_B4_128_SB(src0, src1, src2, src3);
929         src += (4 * src_stride);
930
931         hz_out5 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
932         hz_out6 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
933         hz_out7 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
934         hz_out8 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
935         dst0 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out0, hz_out1, hz_out2,
936                                                hz_out3, hz_out4, hz_out5);
937         dst1 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out1, hz_out2, hz_out3,
938                                                hz_out4, hz_out5, hz_out6);
939         dst2 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out2, hz_out3, hz_out4,
940                                                hz_out5, hz_out6, hz_out7);
941         dst3 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out3, hz_out4, hz_out5,
942                                                hz_out6, hz_out7, hz_out8);
943         out0 = PCKEV_XORI128_UB(dst0, dst1);
944         out1 = PCKEV_XORI128_UB(dst2, dst3);
945         ST8x4_UB(out0, out1, dst, dst_stride);
946
947         dst += (4 * dst_stride);
948         hz_out3 = hz_out7;
949         hz_out1 = hz_out5;
950         hz_out5 = hz_out4;
951         hz_out4 = hz_out8;
952         hz_out2 = hz_out6;
953         hz_out0 = hz_out5;
954     }
955 }
956
957 static void avc_luma_mid_16w_msa(const uint8_t *src, int32_t src_stride,
958                                  uint8_t *dst, int32_t dst_stride,
959                                  int32_t height)
960 {
961     uint32_t multiple8_cnt;
962
963     for (multiple8_cnt = 2; multiple8_cnt--;) {
964         avc_luma_mid_8w_msa(src, src_stride, dst, dst_stride, height);
965         src += 8;
966         dst += 8;
967     }
968 }
969
970 static void avc_luma_midh_qrt_4w_msa(const uint8_t *src, int32_t src_stride,
971                                      uint8_t *dst, int32_t dst_stride,
972                                      int32_t height, uint8_t horiz_offset)
973 {
974     uint32_t row;
975     v16i8 src0, src1, src2, src3, src4, src5, src6;
976     v8i16 vt_res0, vt_res1, vt_res2, vt_res3;
977     v4i32 hz_res0, hz_res1;
978     v8i16 dst0, dst1;
979     v8i16 shf_vec0, shf_vec1, shf_vec2, shf_vec3, shf_vec4, shf_vec5;
980     v8i16 mask0 = { 0, 5, 1, 6, 2, 7, 3, 8 };
981     v8i16 mask1 = { 1, 4, 2, 5, 3, 6, 4, 7 };
982     v8i16 mask2 = { 2, 3, 3, 4, 4, 5, 5, 6 };
983     v8i16 minus5h = __msa_ldi_h(-5);
984     v8i16 plus20h = __msa_ldi_h(20);
985     v8i16 zeros = { 0 };
986     v16u8 out;
987
988     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
989     src += (5 * src_stride);
990     XORI_B5_128_SB(src0, src1, src2, src3, src4);
991
992     for (row = (height >> 1); row--;) {
993         LD_SB2(src, src_stride, src5, src6);
994         src += (2 * src_stride);
995
996         XORI_B2_128_SB(src5, src6);
997         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src0, src1, src2, src3, src4, src5,
998                                         vt_res0, vt_res1);
999         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src1, src2, src3, src4, src5, src6,
1000                                         vt_res2, vt_res3);
1001         VSHF_H3_SH(vt_res0, vt_res1, vt_res0, vt_res1, vt_res0, vt_res1,
1002                    mask0, mask1, mask2, shf_vec0, shf_vec1, shf_vec2);
1003         VSHF_H3_SH(vt_res2, vt_res3, vt_res2, vt_res3, vt_res2, vt_res3,
1004                    mask0, mask1, mask2, shf_vec3, shf_vec4, shf_vec5);
1005         hz_res0 = __msa_hadd_s_w(shf_vec0, shf_vec0);
1006         DPADD_SH2_SW(shf_vec1, shf_vec2, minus5h, plus20h, hz_res0, hz_res0);
1007         hz_res1 = __msa_hadd_s_w(shf_vec3, shf_vec3);
1008         DPADD_SH2_SW(shf_vec4, shf_vec5, minus5h, plus20h, hz_res1, hz_res1);
1009
1010         SRARI_W2_SW(hz_res0, hz_res1, 10);
1011         SAT_SW2_SW(hz_res0, hz_res1, 7);
1012
1013         dst0 = __msa_srari_h(shf_vec2, 5);
1014         dst1 = __msa_srari_h(shf_vec5, 5);
1015
1016         SAT_SH2_SH(dst0, dst1, 7);
1017
1018         if (horiz_offset) {
1019             dst0 = __msa_ilvod_h(zeros, dst0);
1020             dst1 = __msa_ilvod_h(zeros, dst1);
1021         } else {
1022             ILVEV_H2_SH(dst0, zeros, dst1, zeros, dst0, dst1);
1023         }
1024
1025         hz_res0 = __msa_aver_s_w(hz_res0, (v4i32) dst0);
1026         hz_res1 = __msa_aver_s_w(hz_res1, (v4i32) dst1);
1027         dst0 = __msa_pckev_h((v8i16) hz_res1, (v8i16) hz_res0);
1028
1029         out = PCKEV_XORI128_UB(dst0, dst0);
1030         ST4x2_UB(out, dst, dst_stride);
1031
1032         dst += (2 * dst_stride);
1033
1034         src0 = src2;
1035         src1 = src3;
1036         src2 = src4;
1037         src3 = src5;
1038         src4 = src6;
1039     }
1040 }
1041
1042 static void avc_luma_midh_qrt_8w_msa(const uint8_t *src, int32_t src_stride,
1043                                      uint8_t *dst, int32_t dst_stride,
1044                                      int32_t height, uint8_t horiz_offset)
1045 {
1046     uint32_t multiple8_cnt;
1047
1048     for (multiple8_cnt = 2; multiple8_cnt--;) {
1049         avc_luma_midh_qrt_4w_msa(src, src_stride, dst, dst_stride, height,
1050                                  horiz_offset);
1051
1052         src += 4;
1053         dst += 4;
1054     }
1055 }
1056
1057 static void avc_luma_midh_qrt_16w_msa(const uint8_t *src, int32_t src_stride,
1058                                       uint8_t *dst, int32_t dst_stride,
1059                                       int32_t height, uint8_t horiz_offset)
1060 {
1061     uint32_t multiple8_cnt;
1062
1063     for (multiple8_cnt = 4; multiple8_cnt--;) {
1064         avc_luma_midh_qrt_4w_msa(src, src_stride, dst, dst_stride, height,
1065                                  horiz_offset);
1066
1067         src += 4;
1068         dst += 4;
1069     }
1070 }
1071
1072 static void avc_luma_midv_qrt_4w_msa(const uint8_t *src, int32_t src_stride,
1073                                      uint8_t *dst, int32_t dst_stride,
1074                                      int32_t height, uint8_t ver_offset)
1075 {
1076     uint32_t loop_cnt;
1077     v16i8 src0, src1, src2, src3, src4;
1078     v16i8 mask0, mask1, mask2;
1079     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
1080     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
1081     v8i16 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
1082
1083     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
1084     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1085     src += (5 * src_stride);
1086
1087     XORI_B5_128_SB(src0, src1, src2, src3, src4);
1088
1089     hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
1090                                                           mask0, mask1, mask2);
1091     hz_out2 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
1092                                                           mask0, mask1, mask2);
1093
1094     PCKOD_D2_SH(hz_out0, hz_out0, hz_out2, hz_out2, hz_out1, hz_out3);
1095
1096     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
1097
1098     for (loop_cnt = (height >> 2); loop_cnt--;) {
1099         LD_SB4(src, src_stride, src0, src1, src2, src3);
1100         src += (4 * src_stride);
1101         XORI_B4_128_SB(src0, src1, src2, src3);
1102
1103         hz_out5 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
1104                                                               mask0, mask1,
1105                                                               mask2);
1106         hz_out7 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
1107                                                               mask0, mask1,
1108                                                               mask2);
1109
1110         PCKOD_D2_SH(hz_out5, hz_out5, hz_out7, hz_out7, hz_out6, hz_out8);
1111
1112         dst0 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out0, hz_out1, hz_out2,
1113                                                hz_out3, hz_out4, hz_out5);
1114         dst2 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out1, hz_out2, hz_out3,
1115                                                hz_out4, hz_out5, hz_out6);
1116         dst4 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out2, hz_out3, hz_out4,
1117                                                hz_out5, hz_out6, hz_out7);
1118         dst6 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out3, hz_out4, hz_out5,
1119                                                hz_out6, hz_out7, hz_out8);
1120
1121         if (ver_offset) {
1122             dst1 = __msa_srari_h(hz_out3, 5);
1123             dst3 = __msa_srari_h(hz_out4, 5);
1124             dst5 = __msa_srari_h(hz_out5, 5);
1125             dst7 = __msa_srari_h(hz_out6, 5);
1126         } else {
1127             dst1 = __msa_srari_h(hz_out2, 5);
1128             dst3 = __msa_srari_h(hz_out3, 5);
1129             dst5 = __msa_srari_h(hz_out4, 5);
1130             dst7 = __msa_srari_h(hz_out5, 5);
1131         }
1132
1133         SAT_SH4_SH(dst1, dst3, dst5, dst7, 7);
1134
1135         dst0 = __msa_aver_s_h(dst0, dst1);
1136         dst1 = __msa_aver_s_h(dst2, dst3);
1137         dst2 = __msa_aver_s_h(dst4, dst5);
1138         dst3 = __msa_aver_s_h(dst6, dst7);
1139
1140         PCKEV_B2_SB(dst1, dst0, dst3, dst2, src0, src1);
1141         XORI_B2_128_SB(src0, src1);
1142
1143         ST4x4_UB(src0, src1, 0, 2, 0, 2, dst, dst_stride);
1144
1145         dst += (4 * dst_stride);
1146         hz_out0 = hz_out4;
1147         hz_out1 = hz_out5;
1148         hz_out2 = hz_out6;
1149         hz_out3 = hz_out7;
1150         hz_out4 = hz_out8;
1151     }
1152 }
1153
1154 static void avc_luma_midv_qrt_8w_msa(const uint8_t *src, int32_t src_stride,
1155                                      uint8_t *dst, int32_t dst_stride,
1156                                      int32_t height, uint8_t ver_offset)
1157 {
1158     uint32_t loop_cnt;
1159     v16i8 src0, src1, src2, src3, src4;
1160     v16i8 mask0, mask1, mask2;
1161     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
1162     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
1163     v8i16 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
1164     v16u8 out;
1165
1166     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1167
1168     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1169     XORI_B5_128_SB(src0, src1, src2, src3, src4);
1170     src += (5 * src_stride);
1171
1172     hz_out0 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
1173     hz_out1 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
1174     hz_out2 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
1175     hz_out3 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
1176     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
1177
1178     for (loop_cnt = (height >> 2); loop_cnt--;) {
1179         LD_SB4(src, src_stride, src0, src1, src2, src3);
1180         XORI_B4_128_SB(src0, src1, src2, src3);
1181         src += (4 * src_stride);
1182
1183         hz_out5 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
1184         hz_out6 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
1185         hz_out7 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
1186         hz_out8 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
1187
1188         dst0 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out0, hz_out1, hz_out2,
1189                                                hz_out3, hz_out4, hz_out5);
1190         dst2 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out1, hz_out2, hz_out3,
1191                                                hz_out4, hz_out5, hz_out6);
1192         dst4 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out2, hz_out3, hz_out4,
1193                                                hz_out5, hz_out6, hz_out7);
1194         dst6 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out3, hz_out4, hz_out5,
1195                                                hz_out6, hz_out7, hz_out8);
1196
1197         if (ver_offset) {
1198             dst1 = __msa_srari_h(hz_out3, 5);
1199             dst3 = __msa_srari_h(hz_out4, 5);
1200             dst5 = __msa_srari_h(hz_out5, 5);
1201             dst7 = __msa_srari_h(hz_out6, 5);
1202         } else {
1203             dst1 = __msa_srari_h(hz_out2, 5);
1204             dst3 = __msa_srari_h(hz_out3, 5);
1205             dst5 = __msa_srari_h(hz_out4, 5);
1206             dst7 = __msa_srari_h(hz_out5, 5);
1207         }
1208
1209         SAT_SH4_SH(dst1, dst3, dst5, dst7, 7);
1210
1211         dst0 = __msa_aver_s_h(dst0, dst1);
1212         dst1 = __msa_aver_s_h(dst2, dst3);
1213         dst2 = __msa_aver_s_h(dst4, dst5);
1214         dst3 = __msa_aver_s_h(dst6, dst7);
1215
1216         out = PCKEV_XORI128_UB(dst0, dst0);
1217         ST8x1_UB(out, dst);
1218         dst += dst_stride;
1219         out = PCKEV_XORI128_UB(dst1, dst1);
1220         ST8x1_UB(out, dst);
1221         dst += dst_stride;
1222         out = PCKEV_XORI128_UB(dst2, dst2);
1223         ST8x1_UB(out, dst);
1224         dst += dst_stride;
1225         out = PCKEV_XORI128_UB(dst3, dst3);
1226         ST8x1_UB(out, dst);
1227         dst += dst_stride;
1228
1229         hz_out0 = hz_out4;
1230         hz_out1 = hz_out5;
1231         hz_out2 = hz_out6;
1232         hz_out3 = hz_out7;
1233         hz_out4 = hz_out8;
1234     }
1235 }
1236
1237 static void avc_luma_midv_qrt_16w_msa(const uint8_t *src, int32_t src_stride,
1238                                       uint8_t *dst, int32_t dst_stride,
1239                                       int32_t height, uint8_t vert_offset)
1240 {
1241     uint32_t multiple8_cnt;
1242
1243     for (multiple8_cnt = 2; multiple8_cnt--;) {
1244         avc_luma_midv_qrt_8w_msa(src, src_stride, dst, dst_stride, height,
1245                                  vert_offset);
1246
1247         src += 8;
1248         dst += 8;
1249     }
1250 }
1251
1252 static void avc_luma_hv_qrt_4w_msa(const uint8_t *src_x, const uint8_t *src_y,
1253                                    int32_t src_stride, uint8_t *dst,
1254                                    int32_t dst_stride, int32_t height)
1255 {
1256     uint32_t loop_cnt;
1257     v16i8 src_hz0, src_hz1, src_hz2, src_hz3;
1258     v16i8 src_vt0, src_vt1, src_vt2, src_vt3, src_vt4;
1259     v16i8 src_vt5, src_vt6, src_vt7, src_vt8;
1260     v16i8 mask0, mask1, mask2;
1261     v8i16 hz_out0, hz_out1, vert_out0, vert_out1;
1262     v8i16 out0, out1;
1263     v16u8 out;
1264
1265     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
1266
1267     LD_SB5(src_y, src_stride, src_vt0, src_vt1, src_vt2, src_vt3, src_vt4);
1268     src_y += (5 * src_stride);
1269
1270     src_vt0 = (v16i8) __msa_insve_w((v4i32) src_vt0, 1, (v4i32) src_vt1);
1271     src_vt1 = (v16i8) __msa_insve_w((v4i32) src_vt1, 1, (v4i32) src_vt2);
1272     src_vt2 = (v16i8) __msa_insve_w((v4i32) src_vt2, 1, (v4i32) src_vt3);
1273     src_vt3 = (v16i8) __msa_insve_w((v4i32) src_vt3, 1, (v4i32) src_vt4);
1274
1275     XORI_B4_128_SB(src_vt0, src_vt1, src_vt2, src_vt3);
1276
1277     for (loop_cnt = (height >> 2); loop_cnt--;) {
1278         LD_SB4(src_x, src_stride, src_hz0, src_hz1, src_hz2, src_hz3);
1279         src_x += (4 * src_stride);
1280
1281         XORI_B4_128_SB(src_hz0, src_hz1, src_hz2, src_hz3);
1282
1283         hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src_hz0,
1284                                                               src_hz1, mask0,
1285                                                               mask1, mask2);
1286         hz_out1 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src_hz2,
1287                                                               src_hz3, mask0,
1288                                                               mask1, mask2);
1289
1290         SRARI_H2_SH(hz_out0, hz_out1, 5);
1291         SAT_SH2_SH(hz_out0, hz_out1, 7);
1292
1293         LD_SB4(src_y, src_stride, src_vt5, src_vt6, src_vt7, src_vt8);
1294         src_y += (4 * src_stride);
1295
1296         src_vt4 = (v16i8) __msa_insve_w((v4i32) src_vt4, 1, (v4i32) src_vt5);
1297         src_vt5 = (v16i8) __msa_insve_w((v4i32) src_vt5, 1, (v4i32) src_vt6);
1298         src_vt6 = (v16i8) __msa_insve_w((v4i32) src_vt6, 1, (v4i32) src_vt7);
1299         src_vt7 = (v16i8) __msa_insve_w((v4i32) src_vt7, 1, (v4i32) src_vt8);
1300
1301         XORI_B4_128_SB(src_vt4, src_vt5, src_vt6, src_vt7);
1302
1303         /* filter calc */
1304         vert_out0 = AVC_CALC_DPADD_B_6PIX_2COEFF_R_SH(src_vt0, src_vt1,
1305                                                       src_vt2, src_vt3,
1306                                                       src_vt4, src_vt5);
1307         vert_out1 = AVC_CALC_DPADD_B_6PIX_2COEFF_R_SH(src_vt2, src_vt3,
1308                                                       src_vt4, src_vt5,
1309                                                       src_vt6, src_vt7);
1310
1311         SRARI_H2_SH(vert_out0, vert_out1, 5);
1312         SAT_SH2_SH(vert_out0, vert_out1, 7);
1313
1314         out0 = __msa_srari_h((hz_out0 + vert_out0), 1);
1315         out1 = __msa_srari_h((hz_out1 + vert_out1), 1);
1316
1317         SAT_SH2_SH(out0, out1, 7);
1318         out = PCKEV_XORI128_UB(out0, out1);
1319         ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
1320         dst += (4 * dst_stride);
1321
1322         src_vt3 = src_vt7;
1323         src_vt1 = src_vt5;
1324         src_vt0 = src_vt4;
1325         src_vt4 = src_vt8;
1326         src_vt2 = src_vt6;
1327     }
1328 }
1329
1330 static void avc_luma_hv_qrt_8w_msa(const uint8_t *src_x, const uint8_t *src_y,
1331                                    int32_t src_stride, uint8_t *dst,
1332                                    int32_t dst_stride, int32_t height)
1333 {
1334     uint32_t loop_cnt;
1335     v16i8 src_hz0, src_hz1, src_hz2, src_hz3;
1336     v16i8 src_vt0, src_vt1, src_vt2, src_vt3, src_vt4;
1337     v16i8 src_vt5, src_vt6, src_vt7, src_vt8;
1338     v16i8 mask0, mask1, mask2;
1339     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
1340     v8i16 vert_out0, vert_out1, vert_out2, vert_out3;
1341     v8i16 out0, out1, out2, out3;
1342     v16u8 tmp0, tmp1;
1343
1344     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1345     LD_SB5(src_y, src_stride, src_vt0, src_vt1, src_vt2, src_vt3, src_vt4);
1346     src_y += (5 * src_stride);
1347
1348     src_vt0 = (v16i8) __msa_insve_d((v2i64) src_vt0, 1, (v2i64) src_vt1);
1349     src_vt1 = (v16i8) __msa_insve_d((v2i64) src_vt1, 1, (v2i64) src_vt2);
1350     src_vt2 = (v16i8) __msa_insve_d((v2i64) src_vt2, 1, (v2i64) src_vt3);
1351     src_vt3 = (v16i8) __msa_insve_d((v2i64) src_vt3, 1, (v2i64) src_vt4);
1352
1353     XORI_B4_128_SB(src_vt0, src_vt1, src_vt2, src_vt3);
1354
1355     for (loop_cnt = (height >> 2); loop_cnt--;) {
1356         LD_SB4(src_x, src_stride, src_hz0, src_hz1, src_hz2, src_hz3);
1357         XORI_B4_128_SB(src_hz0, src_hz1, src_hz2, src_hz3);
1358         src_x += (4 * src_stride);
1359
1360         hz_out0 = AVC_HORZ_FILTER_SH(src_hz0, mask0, mask1, mask2);
1361         hz_out1 = AVC_HORZ_FILTER_SH(src_hz1, mask0, mask1, mask2);
1362         hz_out2 = AVC_HORZ_FILTER_SH(src_hz2, mask0, mask1, mask2);
1363         hz_out3 = AVC_HORZ_FILTER_SH(src_hz3, mask0, mask1, mask2);
1364
1365         SRARI_H4_SH(hz_out0, hz_out1, hz_out2, hz_out3, 5);
1366         SAT_SH4_SH(hz_out0, hz_out1, hz_out2, hz_out3, 7);
1367
1368         LD_SB4(src_y, src_stride, src_vt5, src_vt6, src_vt7, src_vt8);
1369         src_y += (4 * src_stride);
1370
1371         src_vt4 = (v16i8) __msa_insve_d((v2i64) src_vt4, 1, (v2i64) src_vt5);
1372         src_vt5 = (v16i8) __msa_insve_d((v2i64) src_vt5, 1, (v2i64) src_vt6);
1373         src_vt6 = (v16i8) __msa_insve_d((v2i64) src_vt6, 1, (v2i64) src_vt7);
1374         src_vt7 = (v16i8) __msa_insve_d((v2i64) src_vt7, 1, (v2i64) src_vt8);
1375
1376         XORI_B4_128_SB(src_vt4, src_vt5, src_vt6, src_vt7);
1377
1378         /* filter calc */
1379         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src_vt0, src_vt1, src_vt2, src_vt3,
1380                                         src_vt4, src_vt5, vert_out0, vert_out1);
1381         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src_vt2, src_vt3, src_vt4, src_vt5,
1382                                         src_vt6, src_vt7, vert_out2, vert_out3);
1383
1384         SRARI_H4_SH(vert_out0, vert_out1, vert_out2, vert_out3, 5);
1385         SAT_SH4_SH(vert_out0, vert_out1, vert_out2, vert_out3, 7);
1386
1387         out0 = __msa_srari_h((hz_out0 + vert_out0), 1);
1388         out1 = __msa_srari_h((hz_out1 + vert_out1), 1);
1389         out2 = __msa_srari_h((hz_out2 + vert_out2), 1);
1390         out3 = __msa_srari_h((hz_out3 + vert_out3), 1);
1391
1392         SAT_SH4_SH(out0, out1, out2, out3, 7);
1393         tmp0 = PCKEV_XORI128_UB(out0, out1);
1394         tmp1 = PCKEV_XORI128_UB(out2, out3);
1395         ST8x4_UB(tmp0, tmp1, dst, dst_stride);
1396
1397         dst += (4 * dst_stride);
1398         src_vt3 = src_vt7;
1399         src_vt1 = src_vt5;
1400         src_vt5 = src_vt4;
1401         src_vt4 = src_vt8;
1402         src_vt2 = src_vt6;
1403         src_vt0 = src_vt5;
1404     }
1405 }
1406
1407 static void avc_luma_hv_qrt_16w_msa(const uint8_t *src_x, const uint8_t *src_y,
1408                                     int32_t src_stride, uint8_t *dst,
1409                                     int32_t dst_stride, int32_t height)
1410 {
1411     uint32_t multiple8_cnt;
1412
1413     for (multiple8_cnt = 2; multiple8_cnt--;) {
1414         avc_luma_hv_qrt_8w_msa(src_x, src_y, src_stride, dst, dst_stride,
1415                                height);
1416
1417         src_x += 8;
1418         src_y += 8;
1419         dst += 8;
1420     }
1421 }
1422
1423 static void avc_luma_hz_and_aver_dst_4x4_msa(const uint8_t *src,
1424                                              int32_t src_stride,
1425                                              uint8_t *dst, int32_t dst_stride)
1426 {
1427     v16i8 src0, src1, src2, src3;
1428     v16u8 dst0, dst1, dst2, dst3, res;
1429     v8i16 res0, res1;
1430     v16i8 mask0, mask1, mask2;
1431     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1432     v16i8 minus5b = __msa_ldi_b(-5);
1433     v16i8 plus20b = __msa_ldi_b(20);
1434
1435     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
1436     LD_SB4(src, src_stride, src0, src1, src2, src3);
1437
1438     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1439     XORI_B4_128_SB(src0, src1, src2, src3);
1440     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
1441     HADD_SB2_SH(vec0, vec1, res0, res1);
1442     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
1443     DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
1444     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
1445     DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
1446     SRARI_H2_SH(res0, res1, 5);
1447     SAT_SH2_SH(res0, res1, 7);
1448     res = PCKEV_XORI128_UB(res0, res1);
1449     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1450
1451     dst0 = (v16u8) __msa_pckev_d((v2i64) dst1, (v2i64) dst0);
1452     res = __msa_aver_u_b(res, dst0);
1453
1454     ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
1455 }
1456
1457 static void avc_luma_hz_and_aver_dst_8x8_msa(const uint8_t *src,
1458                                              int32_t src_stride,
1459                                              uint8_t *dst, int32_t dst_stride)
1460 {
1461     uint32_t loop_cnt;
1462     v16i8 src0, src1, src2, src3;
1463     v16u8 dst0, dst1, dst2, dst3;
1464     v8i16 res0, res1, res2, res3;
1465     v16i8 mask0, mask1, mask2;
1466     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1467     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
1468     v16i8 minus5b = __msa_ldi_b(-5);
1469     v16i8 plus20b = __msa_ldi_b(20);
1470
1471     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1472
1473     for (loop_cnt = 2; loop_cnt--;) {
1474         LD_SB4(src, src_stride, src0, src1, src2, src3);
1475         src += (4 * src_stride);
1476
1477         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1478
1479         XORI_B4_128_SB(src0, src1, src2, src3);
1480         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
1481         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
1482         HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
1483         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
1484         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
1485         DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
1486                      res0, res1, res2, res3);
1487         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
1488         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
1489         DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
1490                      plus20b, res0, res1, res2, res3);
1491         SRARI_H4_SH(res0, res1, res2, res3, 5);
1492         SAT_SH4_SH(res0, res1, res2, res3, 7);
1493         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1494         CONVERT_UB_AVG_ST8x4_UB(res0, res1, res2, res3, dst0, dst1,
1495                                 dst, dst_stride);
1496
1497         dst += (4 * dst_stride);
1498     }
1499 }
1500
1501 static void avc_luma_hz_and_aver_dst_16x16_msa(const uint8_t *src,
1502                                                int32_t src_stride,
1503                                                uint8_t *dst, int32_t dst_stride)
1504 {
1505     uint32_t loop_cnt;
1506     v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
1507     v16u8 dst0, dst1, dst2, dst3;
1508     v16i8 mask0, mask1, mask2;
1509     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
1510     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1511     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
1512     v16i8 minus5b = __msa_ldi_b(-5);
1513     v16i8 plus20b = __msa_ldi_b(20);
1514
1515     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1516
1517     for (loop_cnt = 4; loop_cnt--;) {
1518         LD_SB2(src, 8, src0, src1);
1519         src += src_stride;
1520         LD_SB2(src, 8, src2, src3);
1521         src += src_stride;
1522
1523         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1524
1525         XORI_B4_128_SB(src0, src1, src2, src3);
1526         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec3);
1527         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec9);
1528         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec1, vec4);
1529         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec7, vec10);
1530         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec2, vec5);
1531         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec8, vec11);
1532         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
1533         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
1534                      minus5b, res0, res1, res2, res3);
1535         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
1536                      plus20b, res0, res1, res2, res3);
1537         LD_SB2(src, 8, src4, src5);
1538         src += src_stride;
1539         LD_SB2(src, 8, src6, src7);
1540         src += src_stride;
1541         XORI_B4_128_SB(src4, src5, src6, src7);
1542         VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec3);
1543         VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec6, vec9);
1544         VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec1, vec4);
1545         VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec7, vec10);
1546         VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec2, vec5);
1547         VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec8, vec11);
1548         HADD_SB4_SH(vec0, vec3, vec6, vec9, res4, res5, res6, res7);
1549         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
1550                      minus5b, res4, res5, res6, res7);
1551         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
1552                      plus20b, res4, res5, res6, res7);
1553         SRARI_H4_SH(res0, res1, res2, res3, 5);
1554         SRARI_H4_SH(res4, res5, res6, res7, 5);
1555         SAT_SH4_SH(res0, res1, res2, res3, 7);
1556         SAT_SH4_SH(res4, res5, res6, res7, 7);
1557         PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
1558                     vec0, vec1, vec2, vec3);
1559         XORI_B4_128_SB(vec0, vec1, vec2, vec3);
1560         AVER_UB4_UB(vec0, dst0, vec1, dst1, vec2, dst2, vec3, dst3,
1561                     dst0, dst1, dst2, dst3);
1562         ST_UB4(dst0, dst1, dst2, dst3, dst, dst_stride);
1563         dst += (4 * dst_stride);
1564     }
1565 }
1566
1567 static void avc_luma_hz_qrt_and_aver_dst_4x4_msa(const uint8_t *src,
1568                                                  int32_t src_stride,
1569                                                  uint8_t *dst,
1570                                                  int32_t dst_stride,
1571                                                  uint8_t hor_offset)
1572 {
1573     uint8_t slide;
1574     v16i8 src0, src1, src2, src3;
1575     v16u8 dst0, dst1, dst2, dst3;
1576     v16i8 mask0, mask1, mask2;
1577     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1578     v8i16 out0, out1;
1579     v16i8 minus5b = __msa_ldi_b(-5);
1580     v16i8 plus20b = __msa_ldi_b(20);
1581     v16u8 res0, res1;
1582
1583     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
1584
1585     if (hor_offset) {
1586         slide = 3;
1587     } else {
1588         slide = 2;
1589     }
1590
1591     LD_SB4(src, src_stride, src0, src1, src2, src3);
1592     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1593
1594     XORI_B4_128_SB(src0, src1, src2, src3);
1595     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
1596     HADD_SB2_SH(vec0, vec1, out0, out1);
1597     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
1598     DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, out0, out1);
1599     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
1600     DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, out0, out1);
1601     SRARI_H2_SH(out0, out1, 5);
1602     SAT_SH2_SH(out0, out1, 7);
1603
1604     PCKEV_B2_UB(out0, out0, out1, out1, res0, res1);
1605
1606     src0 = __msa_sld_b(src0, src0, slide);
1607     src1 = __msa_sld_b(src1, src1, slide);
1608     src2 = __msa_sld_b(src2, src2, slide);
1609     src3 = __msa_sld_b(src3, src3, slide);
1610     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
1611     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
1612     res0 = (v16u8) __msa_aver_s_b((v16i8) res0, src0);
1613     res1 = (v16u8) __msa_aver_s_b((v16i8) res1, src1);
1614
1615     XORI_B2_128_UB(res0, res1);
1616
1617     dst0 = (v16u8) __msa_insve_w((v4i32) dst0, 1, (v4i32) dst1);
1618     dst1 = (v16u8) __msa_insve_w((v4i32) dst2, 1, (v4i32) dst3);
1619
1620     AVER_UB2_UB(res0, dst0, res1, dst1, dst0, dst1);
1621
1622     ST4x4_UB(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
1623 }
1624
1625 static void avc_luma_hz_qrt_and_aver_dst_8x8_msa(const uint8_t *src,
1626                                                  int32_t src_stride,
1627                                                  uint8_t *dst,
1628                                                  int32_t dst_stride,
1629                                                  uint8_t hor_offset)
1630 {
1631     uint8_t slide;
1632     uint32_t loop_cnt;
1633     v16i8 src0, src1, src2, src3;
1634     v16i8 mask0, mask1, mask2;
1635     v16u8 dst0, dst1, dst2, dst3;
1636     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1637     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
1638     v8i16 out0, out1, out2, out3;
1639     v16i8 minus5b = __msa_ldi_b(-5);
1640     v16i8 plus20b = __msa_ldi_b(20);
1641     v16i8 res0, res1, res2, res3;
1642
1643     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1644
1645     if (hor_offset) {
1646         slide = 3;
1647     } else {
1648         slide = 2;
1649     }
1650
1651     for (loop_cnt = 2; loop_cnt--;) {
1652         LD_SB4(src, src_stride, src0, src1, src2, src3);
1653         src += (4 * src_stride);
1654
1655         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1656
1657         XORI_B4_128_SB(src0, src1, src2, src3);
1658         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
1659         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
1660         HADD_SB4_SH(vec0, vec1, vec2, vec3, out0, out1, out2, out3);
1661         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
1662         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
1663         DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
1664                      out0, out1, out2, out3);
1665         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
1666         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
1667         DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
1668                      plus20b, out0, out1, out2, out3);
1669
1670         src0 = __msa_sld_b(src0, src0, slide);
1671         src1 = __msa_sld_b(src1, src1, slide);
1672         src2 = __msa_sld_b(src2, src2, slide);
1673         src3 = __msa_sld_b(src3, src3, slide);
1674
1675         SRARI_H4_SH(out0, out1, out2, out3, 5);
1676         SAT_SH4_SH(out0, out1, out2, out3, 7);
1677
1678         PCKEV_B4_SB(out0, out0, out1, out1, out2, out2, out3, out3,
1679                     res0, res1, res2, res3);
1680
1681         res0 = __msa_aver_s_b(res0, src0);
1682         res1 = __msa_aver_s_b(res1, src1);
1683         res2 = __msa_aver_s_b(res2, src2);
1684         res3 = __msa_aver_s_b(res3, src3);
1685
1686         XORI_B4_128_SB(res0, res1, res2, res3);
1687         AVER_ST8x4_UB(res0, dst0, res1, dst1, res2, dst2, res3, dst3,
1688                       dst, dst_stride);
1689
1690         dst += (4 * dst_stride);
1691     }
1692 }
1693
1694 static void avc_luma_hz_qrt_and_aver_dst_16x16_msa(const uint8_t *src,
1695                                                    int32_t src_stride,
1696                                                    uint8_t *dst,
1697                                                    int32_t dst_stride,
1698                                                    uint8_t hor_offset)
1699 {
1700     uint32_t loop_cnt;
1701     v16i8 out0, out1;
1702     v16i8 src0, src1, src2, src3;
1703     v16i8 mask0, mask1, mask2, vshf;
1704     v16u8 dst0, dst1;
1705     v8i16 res0, res1, res2, res3;
1706     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
1707     v16i8 vec6, vec7, vec8, vec9, vec10, vec11;
1708     v16i8 minus5b = __msa_ldi_b(-5);
1709     v16i8 plus20b = __msa_ldi_b(20);
1710
1711     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
1712
1713     if (hor_offset) {
1714         vshf = LD_SB(&luma_mask_arr[16 + 96]);
1715     } else {
1716         vshf = LD_SB(&luma_mask_arr[96]);
1717     }
1718
1719     for (loop_cnt = 8; loop_cnt--;) {
1720         LD_SB2(src, 8, src0, src1);
1721         src += src_stride;
1722         LD_SB2(src, 8, src2, src3);
1723         src += src_stride;
1724
1725         LD_UB2(dst, dst_stride, dst0, dst1);
1726
1727         XORI_B4_128_SB(src0, src1, src2, src3);
1728         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec3);
1729         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec9);
1730         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec1, vec4);
1731         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec7, vec10);
1732         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec2, vec5);
1733         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec8, vec11);
1734         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
1735         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
1736                      minus5b, res0, res1, res2, res3);
1737         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
1738                      plus20b, res0, res1, res2, res3);
1739         VSHF_B2_SB(src0, src1, src2, src3, vshf, vshf, src0, src2);
1740         SRARI_H4_SH(res0, res1, res2, res3, 5);
1741         SAT_SH4_SH(res0, res1, res2, res3, 7);
1742         PCKEV_B2_SB(res1, res0, res3, res2, out0, out1);
1743
1744         out0 = __msa_aver_s_b(out0, src0);
1745         out1 = __msa_aver_s_b(out1, src2);
1746
1747         XORI_B2_128_SB(out0, out1);
1748         AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
1749         ST_UB2(dst0, dst1, dst, dst_stride);
1750         dst += (2 * dst_stride);
1751     }
1752 }
1753
1754 static void avc_luma_vt_and_aver_dst_4x4_msa(const uint8_t *src,
1755                                              int32_t src_stride,
1756                                              uint8_t *dst, int32_t dst_stride)
1757 {
1758     int16_t filt_const0 = 0xfb01;
1759     int16_t filt_const1 = 0x1414;
1760     int16_t filt_const2 = 0x1fb;
1761     v16u8 dst0, dst1, dst2, dst3;
1762     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1763     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
1764     v16i8 src87_r, src2110, src4332, src6554, src8776;
1765     v8i16 out10, out32;
1766     v16i8 filt0, filt1, filt2;
1767     v16u8 res;
1768
1769     filt0 = (v16i8) __msa_fill_h(filt_const0);
1770     filt1 = (v16i8) __msa_fill_h(filt_const1);
1771     filt2 = (v16i8) __msa_fill_h(filt_const2);
1772
1773     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1774     src += (5 * src_stride);
1775
1776     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1777                src10_r, src21_r, src32_r, src43_r);
1778     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
1779     XORI_B2_128_SB(src2110, src4332);
1780     LD_SB4(src, src_stride, src5, src6, src7, src8);
1781     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
1782                src54_r, src65_r, src76_r, src87_r);
1783     ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
1784     XORI_B2_128_SB(src6554, src8776);
1785     out10 = DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
1786     out32 = DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
1787     SRARI_H2_SH(out10, out32, 5);
1788     SAT_SH2_SH(out10, out32, 7);
1789     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1790     res = PCKEV_XORI128_UB(out10, out32);
1791
1792     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1793
1794     dst0 = (v16u8) __msa_pckev_d((v2i64) dst1, (v2i64) dst0);
1795     dst0 = __msa_aver_u_b(res, dst0);
1796
1797     ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
1798 }
1799
1800 static void avc_luma_vt_and_aver_dst_8x8_msa(const uint8_t *src,
1801                                              int32_t src_stride,
1802                                              uint8_t *dst, int32_t dst_stride)
1803 {
1804     int32_t loop_cnt;
1805     int16_t filt_const0 = 0xfb01;
1806     int16_t filt_const1 = 0x1414;
1807     int16_t filt_const2 = 0x1fb;
1808     v16u8 dst0, dst1, dst2, dst3;
1809     v16i8 src0, src1, src2, src3, src4, src7, src8, src9, src10;
1810     v16i8 src10_r, src32_r, src76_r, src98_r;
1811     v16i8 src21_r, src43_r, src87_r, src109_r;
1812     v8i16 out0, out1, out2, out3;
1813     v16i8 filt0, filt1, filt2;
1814
1815     filt0 = (v16i8) __msa_fill_h(filt_const0);
1816     filt1 = (v16i8) __msa_fill_h(filt_const1);
1817     filt2 = (v16i8) __msa_fill_h(filt_const2);
1818
1819     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1820     src += (5 * src_stride);
1821
1822     XORI_B5_128_SB(src0, src1, src2, src3, src4);
1823     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1824                src10_r, src21_r, src32_r, src43_r);
1825
1826     for (loop_cnt = 2; loop_cnt--;) {
1827         LD_SB4(src, src_stride, src7, src8, src9, src10);
1828         src += (4 * src_stride);
1829
1830         XORI_B4_128_SB(src7, src8, src9, src10);
1831         ILVR_B4_SB(src7, src4, src8, src7, src9, src8, src10, src9,
1832                    src76_r, src87_r, src98_r, src109_r);
1833         out0 = DPADD_SH3_SH(src10_r, src32_r, src76_r, filt0, filt1, filt2);
1834         out1 = DPADD_SH3_SH(src21_r, src43_r, src87_r, filt0, filt1, filt2);
1835         out2 = DPADD_SH3_SH(src32_r, src76_r, src98_r, filt0, filt1, filt2);
1836         out3 = DPADD_SH3_SH(src43_r, src87_r, src109_r, filt0, filt1, filt2);
1837         SRARI_H4_SH(out0, out1, out2, out3, 5);
1838         SAT_SH4_SH(out0, out1, out2, out3, 7);
1839         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1840         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1841         CONVERT_UB_AVG_ST8x4_UB(out0, out1, out2, out3, dst0, dst1,
1842                                 dst, dst_stride);
1843         dst += (4 * dst_stride);
1844
1845         src10_r = src76_r;
1846         src32_r = src98_r;
1847         src21_r = src87_r;
1848         src43_r = src109_r;
1849         src4 = src10;
1850     }
1851 }
1852
1853 static void avc_luma_vt_and_aver_dst_16x16_msa(const uint8_t *src,
1854                                                int32_t src_stride,
1855                                                uint8_t *dst, int32_t dst_stride)
1856 {
1857     int32_t loop_cnt;
1858     int16_t filt_const0 = 0xfb01;
1859     int16_t filt_const1 = 0x1414;
1860     int16_t filt_const2 = 0x1fb;
1861     v16u8 dst0, dst1, dst2, dst3;
1862     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1863     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
1864     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
1865     v16i8 src65_l, src87_l;
1866     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
1867     v16i8 filt0, filt1, filt2;
1868     v16u8 res0, res1, res2, res3;
1869
1870     filt0 = (v16i8) __msa_fill_h(filt_const0);
1871     filt1 = (v16i8) __msa_fill_h(filt_const1);
1872     filt2 = (v16i8) __msa_fill_h(filt_const2);
1873
1874     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1875     src += (5 * src_stride);
1876
1877     XORI_B5_128_SB(src0, src1, src2, src3, src4);
1878     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1879                src10_r, src21_r, src32_r, src43_r);
1880     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1881                src10_l, src21_l, src32_l, src43_l);
1882
1883     for (loop_cnt = 4; loop_cnt--;) {
1884         LD_SB4(src, src_stride, src5, src6, src7, src8);
1885         src += (4 * src_stride);
1886
1887         XORI_B4_128_SB(src5, src6, src7, src8);
1888         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
1889                    src54_r, src65_r, src76_r, src87_r);
1890         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
1891                    src54_l, src65_l, src76_l, src87_l);
1892         out0_r = DPADD_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
1893         out1_r = DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
1894         out2_r = DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
1895         out3_r = DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
1896         out0_l = DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
1897         out1_l = DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
1898         out2_l = DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
1899         out3_l = DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
1900         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
1901         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
1902         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
1903         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
1904         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1905         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
1906                     out3_r, res0, res1, res2, res3);
1907         XORI_B4_128_UB(res0, res1, res2, res3);
1908         AVER_UB4_UB(res0, dst0, res1, dst1, res2, dst2, res3, dst3,
1909                     res0, res1, res2, res3);
1910         ST_UB4(res0, res1, res2, res3, dst, dst_stride);
1911         dst += (4 * dst_stride);
1912
1913         src10_r = src54_r;
1914         src32_r = src76_r;
1915         src21_r = src65_r;
1916         src43_r = src87_r;
1917         src10_l = src54_l;
1918         src32_l = src76_l;
1919         src21_l = src65_l;
1920         src43_l = src87_l;
1921         src4 = src8;
1922     }
1923 }
1924
1925 static void avc_luma_vt_qrt_and_aver_dst_4x4_msa(const uint8_t *src,
1926                                                  int32_t src_stride,
1927                                                  uint8_t *dst,
1928                                                  int32_t dst_stride,
1929                                                  uint8_t ver_offset)
1930 {
1931     int16_t filt_const0 = 0xfb01;
1932     int16_t filt_const1 = 0x1414;
1933     int16_t filt_const2 = 0x1fb;
1934     v16u8 dst0, dst1, dst2, dst3;
1935     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
1936     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
1937     v16i8 src87_r, src2110, src4332, src6554, src8776;
1938     v8i16 out10, out32;
1939     v16i8 filt0, filt1, filt2;
1940     v16u8 res;
1941
1942     filt0 = (v16i8) __msa_fill_h(filt_const0);
1943     filt1 = (v16i8) __msa_fill_h(filt_const1);
1944     filt2 = (v16i8) __msa_fill_h(filt_const2);
1945
1946     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
1947     src += (5 * src_stride);
1948
1949     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
1950                src10_r, src21_r, src32_r, src43_r);
1951     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
1952     XORI_B2_128_SB(src2110, src4332);
1953     LD_SB4(src, src_stride, src5, src6, src7, src8);
1954     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
1955                src54_r, src65_r, src76_r, src87_r);
1956     ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
1957     XORI_B2_128_SB(src6554, src8776);
1958     out10 = DPADD_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
1959     out32 = DPADD_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
1960     SRARI_H2_SH(out10, out32, 5);
1961     SAT_SH2_SH(out10, out32, 7);
1962     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
1963     res = PCKEV_XORI128_UB(out10, out32);
1964
1965     if (ver_offset) {
1966         src32_r = (v16i8) __msa_insve_w((v4i32) src3, 1, (v4i32) src4);
1967         src54_r = (v16i8) __msa_insve_w((v4i32) src5, 1, (v4i32) src6);
1968     } else {
1969         src32_r = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
1970         src54_r = (v16i8) __msa_insve_w((v4i32) src4, 1, (v4i32) src5);
1971     }
1972
1973     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
1974     res = __msa_aver_u_b(res, (v16u8) src32_r);
1975
1976     ILVR_W2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
1977
1978     dst0 = (v16u8) __msa_pckev_d((v2i64) dst1, (v2i64) dst0);
1979     dst0 = __msa_aver_u_b(res, dst0);
1980
1981     ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
1982 }
1983
1984 static void avc_luma_vt_qrt_and_aver_dst_8x8_msa(const uint8_t *src,
1985                                                  int32_t src_stride,
1986                                                  uint8_t *dst,
1987                                                  int32_t dst_stride,
1988                                                  uint8_t ver_offset)
1989 {
1990     int32_t loop_cnt;
1991     int16_t filt_const0 = 0xfb01;
1992     int16_t filt_const1 = 0x1414;
1993     int16_t filt_const2 = 0x1fb;
1994     v16u8 dst0, dst1, dst2, dst3;
1995     v16i8 src0, src1, src2, src3, src4, src7, src8, src9, src10;
1996     v16i8 src10_r, src32_r, src76_r, src98_r;
1997     v16i8 src21_r, src43_r, src87_r, src109_r;
1998     v8i16 out0_r, out1_r, out2_r, out3_r;
1999     v16i8 res0, res1;
2000     v16u8 vec0, vec1;
2001     v16i8 filt0, filt1, filt2;
2002
2003     filt0 = (v16i8) __msa_fill_h(filt_const0);
2004     filt1 = (v16i8) __msa_fill_h(filt_const1);
2005     filt2 = (v16i8) __msa_fill_h(filt_const2);
2006
2007     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2008     src += (5 * src_stride);
2009
2010     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2011     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
2012                src10_r, src21_r, src32_r, src43_r);
2013
2014     for (loop_cnt = 2; loop_cnt--;) {
2015         LD_SB4(src, src_stride, src7, src8, src9, src10);
2016         src += (4 * src_stride);
2017
2018         XORI_B4_128_SB(src7, src8, src9, src10);
2019         ILVR_B4_SB(src7, src4, src8, src7, src9, src8, src10, src9,
2020                    src76_r, src87_r, src98_r, src109_r);
2021         out0_r = DPADD_SH3_SH(src10_r, src32_r, src76_r, filt0, filt1, filt2);
2022         out1_r = DPADD_SH3_SH(src21_r, src43_r, src87_r, filt0, filt1, filt2);
2023         out2_r = DPADD_SH3_SH(src32_r, src76_r, src98_r, filt0, filt1, filt2);
2024         out3_r = DPADD_SH3_SH(src43_r, src87_r, src109_r, filt0, filt1, filt2);
2025         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
2026         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
2027         PCKEV_B2_SB(out1_r, out0_r, out3_r, out2_r, res0, res1);
2028
2029         if (ver_offset) {
2030             PCKEV_D2_SB(src4, src3, src8, src7, src10_r, src32_r);
2031         } else {
2032             PCKEV_D2_SB(src3, src2, src7, src4, src10_r, src32_r);
2033         }
2034
2035         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2036         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
2037
2038         vec0 = (v16u8) __msa_aver_s_b(res0, src10_r);
2039         vec1 = (v16u8) __msa_aver_s_b(res1, src32_r);
2040
2041         XORI_B2_128_UB(vec0, vec1);
2042         AVER_UB2_UB(vec0, dst0, vec1, dst1, vec0, vec1);
2043         ST8x4_UB(vec0, vec1, dst, dst_stride);
2044         dst += (4 * dst_stride);
2045
2046         src10_r = src76_r;
2047         src32_r = src98_r;
2048         src21_r = src87_r;
2049         src43_r = src109_r;
2050         src2 = src8;
2051         src3 = src9;
2052         src4 = src10;
2053     }
2054 }
2055
2056 static void avc_luma_vt_qrt_and_aver_dst_16x16_msa(const uint8_t *src,
2057                                                    int32_t src_stride,
2058                                                    uint8_t *dst,
2059                                                    int32_t dst_stride,
2060                                                    uint8_t ver_offset)
2061 {
2062     int32_t loop_cnt;
2063     int16_t filt_const0 = 0xfb01;
2064     int16_t filt_const1 = 0x1414;
2065     int16_t filt_const2 = 0x1fb;
2066     v16u8 dst0, dst1, dst2, dst3;
2067     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
2068     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
2069     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
2070     v16i8 src65_l, src87_l;
2071     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
2072     v16i8 out0, out1, out2, out3;
2073     v16i8 filt0, filt1, filt2;
2074     v16u8 res0, res1, res2, res3;
2075
2076     filt0 = (v16i8) __msa_fill_h(filt_const0);
2077     filt1 = (v16i8) __msa_fill_h(filt_const1);
2078     filt2 = (v16i8) __msa_fill_h(filt_const2);
2079
2080     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2081     src += (5 * src_stride);
2082
2083     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2084     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
2085                src10_r, src21_r, src32_r, src43_r);
2086     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3,
2087                src10_l, src21_l, src32_l, src43_l);
2088
2089     for (loop_cnt = 4; loop_cnt--;) {
2090         LD_SB4(src, src_stride, src5, src6, src7, src8);
2091         src += (4 * src_stride);
2092
2093         XORI_B4_128_SB(src5, src6, src7, src8);
2094         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
2095                    src54_r, src65_r, src76_r, src87_r);
2096         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7,
2097                    src54_l, src65_l, src76_l, src87_l);
2098         out0_r = DPADD_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
2099         out1_r = DPADD_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
2100         out2_r = DPADD_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
2101         out3_r = DPADD_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
2102         out0_l = DPADD_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
2103         out1_l = DPADD_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
2104         out2_l = DPADD_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
2105         out3_l = DPADD_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
2106         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
2107         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
2108         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
2109         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
2110         PCKEV_B4_SB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
2111                     out3_r, out0, out1, out2, out3);
2112         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2113
2114         if (ver_offset) {
2115             res0 = (v16u8) __msa_aver_s_b(out0, src3);
2116             res1 = (v16u8) __msa_aver_s_b(out1, src4);
2117             res2 = (v16u8) __msa_aver_s_b(out2, src5);
2118             res3 = (v16u8) __msa_aver_s_b(out3, src6);
2119         } else {
2120             res0 = (v16u8) __msa_aver_s_b(out0, src2);
2121             res1 = (v16u8) __msa_aver_s_b(out1, src3);
2122             res2 = (v16u8) __msa_aver_s_b(out2, src4);
2123             res3 = (v16u8) __msa_aver_s_b(out3, src5);
2124         }
2125
2126         XORI_B4_128_UB(res0, res1, res2, res3);
2127         AVER_UB4_UB(res0, dst0, res1, dst1, res2, dst2, res3, dst3,
2128                     dst0, dst1, dst2, dst3);
2129         ST_UB4(dst0, dst1, dst2, dst3, dst, dst_stride);
2130         dst += (4 * dst_stride);
2131
2132         src10_r = src54_r;
2133         src32_r = src76_r;
2134         src21_r = src65_r;
2135         src43_r = src87_r;
2136         src10_l = src54_l;
2137         src32_l = src76_l;
2138         src21_l = src65_l;
2139         src43_l = src87_l;
2140         src2 = src6;
2141         src3 = src7;
2142         src4 = src8;
2143     }
2144 }
2145
2146 static void avc_luma_mid_and_aver_dst_4x4_msa(const uint8_t *src,
2147                                               int32_t src_stride,
2148                                               uint8_t *dst, int32_t dst_stride)
2149 {
2150     v16i8 src0, src1, src2, src3, src4;
2151     v16i8 mask0, mask1, mask2;
2152     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
2153     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
2154     v8i16 res0, res1, res2, res3;
2155     v16u8 dst0, dst1, dst2, dst3;
2156     v16u8 tmp0, tmp1, tmp2, tmp3;
2157
2158     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
2159     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2160     src += (5 * src_stride);
2161
2162     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2163
2164     hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
2165                                                           mask0, mask1, mask2);
2166     hz_out2 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
2167                                                           mask0, mask1, mask2);
2168
2169     PCKOD_D2_SH(hz_out0, hz_out0, hz_out2, hz_out2, hz_out1, hz_out3);
2170
2171     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
2172
2173     LD_SB4(src, src_stride, src0, src1, src2, src3);
2174     XORI_B4_128_SB(src0, src1, src2, src3);
2175
2176     hz_out5 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
2177                                                           mask0, mask1, mask2);
2178     hz_out7 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
2179                                                           mask0, mask1, mask2);
2180
2181     PCKOD_D2_SH(hz_out5, hz_out5, hz_out7, hz_out7, hz_out6, hz_out8);
2182
2183     res0 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out0, hz_out1, hz_out2,
2184                                              hz_out3, hz_out4, hz_out5);
2185     res1 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out1, hz_out2, hz_out3,
2186                                              hz_out4, hz_out5, hz_out6);
2187     res2 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out2, hz_out3, hz_out4,
2188                                              hz_out5, hz_out6, hz_out7);
2189     res3 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out3, hz_out4, hz_out5,
2190                                              hz_out6, hz_out7, hz_out8);
2191     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2192     tmp0 = PCKEV_XORI128_UB(res0, res1);
2193     tmp1 = PCKEV_XORI128_UB(res2, res3);
2194     PCKEV_D2_UB(dst1, dst0, dst3, dst2, tmp2, tmp3);
2195     AVER_UB2_UB(tmp0, tmp2, tmp1, tmp3, tmp0, tmp1);
2196
2197     ST4x4_UB(tmp0, tmp1, 0, 2, 0, 2, dst, dst_stride);
2198 }
2199
2200 static void avc_luma_mid_and_aver_dst_8w_msa(const uint8_t *src,
2201                                              int32_t src_stride,
2202                                              uint8_t *dst, int32_t dst_stride,
2203                                              int32_t height)
2204 {
2205     uint32_t loop_cnt;
2206     v16i8 src0, src1, src2, src3, src4;
2207     v16i8 mask0, mask1, mask2;
2208     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
2209     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
2210     v16u8 dst0, dst1, dst2, dst3;
2211     v8i16 res0, res1, res2, res3;
2212
2213     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
2214
2215     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2216     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2217     src += (5 * src_stride);
2218
2219     hz_out0 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
2220     hz_out1 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
2221     hz_out2 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
2222     hz_out3 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
2223     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
2224
2225     for (loop_cnt = (height >> 2); loop_cnt--;) {
2226         LD_SB4(src, src_stride, src0, src1, src2, src3);
2227         XORI_B4_128_SB(src0, src1, src2, src3);
2228         src += (4 * src_stride);
2229
2230         hz_out5 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
2231         hz_out6 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
2232         hz_out7 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
2233         hz_out8 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
2234
2235         res0 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out0, hz_out1, hz_out2,
2236                                                hz_out3, hz_out4, hz_out5);
2237         res1 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out1, hz_out2, hz_out3,
2238                                                hz_out4, hz_out5, hz_out6);
2239         res2 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out2, hz_out3, hz_out4,
2240                                                hz_out5, hz_out6, hz_out7);
2241         res3 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out3, hz_out4, hz_out5,
2242                                                hz_out6, hz_out7, hz_out8);
2243         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2244         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
2245         CONVERT_UB_AVG_ST8x4_UB(res0, res1, res2, res3, dst0, dst1,
2246                                 dst, dst_stride);
2247
2248         dst += (4 * dst_stride);
2249         hz_out3 = hz_out7;
2250         hz_out1 = hz_out5;
2251         hz_out5 = hz_out4;
2252         hz_out4 = hz_out8;
2253         hz_out2 = hz_out6;
2254         hz_out0 = hz_out5;
2255     }
2256 }
2257
2258 static void avc_luma_mid_and_aver_dst_16x16_msa(const uint8_t *src,
2259                                                 int32_t src_stride,
2260                                                 uint8_t *dst,
2261                                                 int32_t dst_stride)
2262 {
2263     avc_luma_mid_and_aver_dst_8w_msa(src, src_stride, dst, dst_stride, 16);
2264     avc_luma_mid_and_aver_dst_8w_msa(src + 8, src_stride, dst + 8, dst_stride,
2265                                      16);
2266 }
2267
2268 static void avc_luma_midh_qrt_and_aver_dst_4w_msa(const uint8_t *src,
2269                                                   int32_t src_stride,
2270                                                   uint8_t *dst,
2271                                                   int32_t dst_stride,
2272                                                   int32_t height,
2273                                                   uint8_t horiz_offset)
2274 {
2275     uint32_t row;
2276     v16i8 src0, src1, src2, src3, src4, src5, src6;
2277     v16u8 dst0, dst1, res;
2278     v8i16 vt_res0, vt_res1, vt_res2, vt_res3;
2279     v4i32 hz_res0, hz_res1;
2280     v8i16 res0, res1;
2281     v8i16 shf_vec0, shf_vec1, shf_vec2, shf_vec3, shf_vec4, shf_vec5;
2282     v8i16 mask0 = { 0, 5, 1, 6, 2, 7, 3, 8 };
2283     v8i16 mask1 = { 1, 4, 2, 5, 3, 6, 4, 7 };
2284     v8i16 mask2 = { 2, 3, 3, 4, 4, 5, 5, 6 };
2285     v8i16 minus5h = __msa_ldi_h(-5);
2286     v8i16 plus20h = __msa_ldi_h(20);
2287     v8i16 zeros = { 0 };
2288
2289     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2290     src += (5 * src_stride);
2291
2292     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2293
2294     for (row = (height >> 1); row--;) {
2295         LD_SB2(src, src_stride, src5, src6);
2296         src += (2 * src_stride);
2297
2298         XORI_B2_128_SB(src5, src6);
2299         LD_UB2(dst, dst_stride, dst0, dst1);
2300
2301         dst0 = (v16u8) __msa_ilvr_w((v4i32) dst1, (v4i32) dst0);
2302
2303         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src0, src1, src2, src3, src4, src5,
2304                                         vt_res0, vt_res1);
2305         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src1, src2, src3, src4, src5, src6,
2306                                         vt_res2, vt_res3);
2307         VSHF_H3_SH(vt_res0, vt_res1, vt_res0, vt_res1, vt_res0, vt_res1,
2308                    mask0, mask1, mask2, shf_vec0, shf_vec1, shf_vec2);
2309         VSHF_H3_SH(vt_res2, vt_res3, vt_res2, vt_res3, vt_res2, vt_res3,
2310                    mask0, mask1, mask2, shf_vec3, shf_vec4, shf_vec5);
2311
2312         hz_res0 = __msa_hadd_s_w(shf_vec0, shf_vec0);
2313         DPADD_SH2_SW(shf_vec1, shf_vec2, minus5h, plus20h, hz_res0, hz_res0);
2314
2315         hz_res1 = __msa_hadd_s_w(shf_vec3, shf_vec3);
2316         DPADD_SH2_SW(shf_vec4, shf_vec5, minus5h, plus20h, hz_res1, hz_res1);
2317
2318         SRARI_W2_SW(hz_res0, hz_res1, 10);
2319         SAT_SW2_SW(hz_res0, hz_res1, 7);
2320
2321         res0 = __msa_srari_h(shf_vec2, 5);
2322         res1 = __msa_srari_h(shf_vec5, 5);
2323
2324         SAT_SH2_SH(res0, res1, 7);
2325
2326         if (horiz_offset) {
2327             res0 = __msa_ilvod_h(zeros, res0);
2328             res1 = __msa_ilvod_h(zeros, res1);
2329         } else {
2330             ILVEV_H2_SH(res0, zeros, res1, zeros, res0, res1);
2331         }
2332         hz_res0 = __msa_aver_s_w(hz_res0, (v4i32) res0);
2333         hz_res1 = __msa_aver_s_w(hz_res1, (v4i32) res1);
2334         res0 = __msa_pckev_h((v8i16) hz_res1, (v8i16) hz_res0);
2335
2336         res = PCKEV_XORI128_UB(res0, res0);
2337
2338         dst0 = __msa_aver_u_b(res, dst0);
2339
2340         ST4x2_UB(dst0, dst, dst_stride);
2341         dst += (2 * dst_stride);
2342
2343         src0 = src2;
2344         src1 = src3;
2345         src2 = src4;
2346         src3 = src5;
2347         src4 = src6;
2348     }
2349 }
2350
2351 static void avc_luma_midh_qrt_and_aver_dst_8w_msa(const uint8_t *src,
2352                                                   int32_t src_stride,
2353                                                   uint8_t *dst,
2354                                                   int32_t dst_stride,
2355                                                   int32_t height,
2356                                                   uint8_t horiz_offset)
2357 {
2358     uint32_t multiple8_cnt;
2359
2360     for (multiple8_cnt = 2; multiple8_cnt--;) {
2361         avc_luma_midh_qrt_and_aver_dst_4w_msa(src, src_stride, dst, dst_stride,
2362                                               height, horiz_offset);
2363
2364         src += 4;
2365         dst += 4;
2366     }
2367 }
2368
2369 static void avc_luma_midh_qrt_and_aver_dst_16w_msa(const uint8_t *src,
2370                                                    int32_t src_stride,
2371                                                    uint8_t *dst,
2372                                                    int32_t dst_stride,
2373                                                    int32_t height,
2374                                                    uint8_t horiz_offset)
2375 {
2376     uint32_t multiple8_cnt;
2377
2378     for (multiple8_cnt = 4; multiple8_cnt--;) {
2379         avc_luma_midh_qrt_and_aver_dst_4w_msa(src, src_stride, dst, dst_stride,
2380                                               height, horiz_offset);
2381
2382         src += 4;
2383         dst += 4;
2384     }
2385 }
2386
2387 static void avc_luma_midv_qrt_and_aver_dst_4w_msa(const uint8_t *src,
2388                                                   int32_t src_stride,
2389                                                   uint8_t *dst,
2390                                                   int32_t dst_stride,
2391                                                   int32_t height,
2392                                                   uint8_t ver_offset)
2393 {
2394     int32_t loop_cnt;
2395     int32_t out0, out1;
2396     v16i8 src0, src1, src2, src3, src4;
2397     v16u8 dst0, dst1;
2398     v16i8 mask0, mask1, mask2;
2399     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
2400     v8i16 hz_out4, hz_out5, hz_out6;
2401     v8i16 res0, res1, res2, res3;
2402     v16u8 vec0, vec1;
2403
2404     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
2405     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2406     src += (5 * src_stride);
2407
2408     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2409
2410     hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
2411                                                           mask0, mask1, mask2);
2412     hz_out2 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src2, src3,
2413                                                           mask0, mask1, mask2);
2414
2415     PCKOD_D2_SH(hz_out0, hz_out0, hz_out2, hz_out2, hz_out1, hz_out3);
2416
2417     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
2418
2419     for (loop_cnt = (height >> 1); loop_cnt--;) {
2420         LD_SB2(src, src_stride, src0, src1);
2421         src += (2 * src_stride);
2422
2423         XORI_B2_128_SB(src0, src1);
2424         LD_UB2(dst, dst_stride, dst0, dst1);
2425         hz_out5 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src0, src1,
2426                                                               mask0, mask1,
2427                                                               mask2);
2428         hz_out6 = (v8i16) __msa_pckod_d((v2i64) hz_out5, (v2i64) hz_out5);
2429         res0 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out0, hz_out1, hz_out2,
2430                                                  hz_out3, hz_out4, hz_out5);
2431         res2 = AVC_CALC_DPADD_H_6PIX_2COEFF_R_SH(hz_out1, hz_out2, hz_out3,
2432                                                  hz_out4, hz_out5, hz_out6);
2433
2434         if (ver_offset) {
2435             res1 = __msa_srari_h(hz_out3, 5);
2436             res3 = __msa_srari_h(hz_out4, 5);
2437         } else {
2438             res1 = __msa_srari_h(hz_out2, 5);
2439             res3 = __msa_srari_h(hz_out3, 5);
2440         }
2441
2442         SAT_SH2_SH(res1, res3, 7);
2443
2444         res0 = __msa_aver_s_h(res0, res1);
2445         res1 = __msa_aver_s_h(res2, res3);
2446
2447         vec0 = PCKEV_XORI128_UB(res0, res0);
2448         vec1 = PCKEV_XORI128_UB(res1, res1);
2449
2450         AVER_UB2_UB(vec0, dst0, vec1, dst1, dst0, dst1);
2451
2452         out0 = __msa_copy_u_w((v4i32) dst0, 0);
2453         out1 = __msa_copy_u_w((v4i32) dst1, 0);
2454         SW(out0, dst);
2455         dst += dst_stride;
2456         SW(out1, dst);
2457         dst += dst_stride;
2458
2459         hz_out0 = hz_out2;
2460         hz_out1 = hz_out3;
2461         hz_out2 = hz_out4;
2462         hz_out3 = hz_out5;
2463         hz_out4 = hz_out6;
2464     }
2465 }
2466
2467 static void avc_luma_midv_qrt_and_aver_dst_8w_msa(const uint8_t *src,
2468                                                   int32_t src_stride,
2469                                                   uint8_t *dst,
2470                                                   int32_t dst_stride,
2471                                                   int32_t height,
2472                                                   uint8_t vert_offset)
2473 {
2474     int32_t loop_cnt;
2475     v16i8 src0, src1, src2, src3, src4;
2476     v16u8 dst0, dst1, dst2, dst3;
2477     v16i8 mask0, mask1, mask2;
2478     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
2479     v8i16 hz_out4, hz_out5, hz_out6, hz_out7, hz_out8;
2480     v8i16 res0, res1, res2, res3;
2481     v8i16 res4, res5, res6, res7;
2482
2483     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
2484
2485     LD_SB5(src, src_stride, src0, src1, src2, src3, src4);
2486     XORI_B5_128_SB(src0, src1, src2, src3, src4);
2487     src += (5 * src_stride);
2488
2489     hz_out0 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
2490     hz_out1 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
2491     hz_out2 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
2492     hz_out3 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
2493     hz_out4 = AVC_HORZ_FILTER_SH(src4, mask0, mask1, mask2);
2494
2495     for (loop_cnt = (height >> 2); loop_cnt--;) {
2496         LD_SB4(src, src_stride, src0, src1, src2, src3);
2497         XORI_B4_128_SB(src0, src1, src2, src3);
2498         src += (4 * src_stride);
2499
2500         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2501
2502         hz_out5 = AVC_HORZ_FILTER_SH(src0, mask0, mask1, mask2);
2503         hz_out6 = AVC_HORZ_FILTER_SH(src1, mask0, mask1, mask2);
2504         hz_out7 = AVC_HORZ_FILTER_SH(src2, mask0, mask1, mask2);
2505         hz_out8 = AVC_HORZ_FILTER_SH(src3, mask0, mask1, mask2);
2506
2507         res0 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out0, hz_out1, hz_out2,
2508                                                hz_out3, hz_out4, hz_out5);
2509         res2 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out1, hz_out2, hz_out3,
2510                                                hz_out4, hz_out5, hz_out6);
2511         res4 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out2, hz_out3, hz_out4,
2512                                                hz_out5, hz_out6, hz_out7);
2513         res6 = AVC_CALC_DPADD_H_6PIX_2COEFF_SH(hz_out3, hz_out4, hz_out5,
2514                                                hz_out6, hz_out7, hz_out8);
2515
2516         if (vert_offset) {
2517             res1 = __msa_srari_h(hz_out3, 5);
2518             res3 = __msa_srari_h(hz_out4, 5);
2519             res5 = __msa_srari_h(hz_out5, 5);
2520             res7 = __msa_srari_h(hz_out6, 5);
2521         } else {
2522             res1 = __msa_srari_h(hz_out2, 5);
2523             res3 = __msa_srari_h(hz_out3, 5);
2524             res5 = __msa_srari_h(hz_out4, 5);
2525             res7 = __msa_srari_h(hz_out5, 5);
2526         }
2527
2528         SAT_SH4_SH(res1, res3, res5, res7, 7);
2529
2530         res0 = __msa_aver_s_h(res0, res1);
2531         res1 = __msa_aver_s_h(res2, res3);
2532         res2 = __msa_aver_s_h(res4, res5);
2533         res3 = __msa_aver_s_h(res6, res7);
2534         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
2535         CONVERT_UB_AVG_ST8x4_UB(res0, res1, res2, res3, dst0, dst1,
2536                                 dst, dst_stride);
2537         dst += (4 * dst_stride);
2538
2539         hz_out0 = hz_out4;
2540         hz_out1 = hz_out5;
2541         hz_out2 = hz_out6;
2542         hz_out3 = hz_out7;
2543         hz_out4 = hz_out8;
2544     }
2545 }
2546
2547 static void avc_luma_midv_qrt_and_aver_dst_16w_msa(const uint8_t *src,
2548                                                    int32_t src_stride,
2549                                                    uint8_t *dst,
2550                                                    int32_t dst_stride,
2551                                                    int32_t height,
2552                                                    uint8_t vert_offset)
2553 {
2554     int32_t multiple8_cnt;
2555
2556     for (multiple8_cnt = 2; multiple8_cnt--;) {
2557         avc_luma_midv_qrt_and_aver_dst_8w_msa(src, src_stride, dst, dst_stride,
2558                                               height, vert_offset);
2559
2560         src += 8;
2561         dst += 8;
2562     }
2563 }
2564
2565 static void avc_luma_hv_qrt_and_aver_dst_4x4_msa(const uint8_t *src_x,
2566                                                  const uint8_t *src_y,
2567                                                  int32_t src_stride,
2568                                                  uint8_t *dst,
2569                                                  int32_t dst_stride)
2570 {
2571     v16i8 src_hz0, src_hz1, src_hz2, src_hz3;
2572     v16u8 dst0, dst1, dst2, dst3;
2573     v16i8 src_vt0, src_vt1, src_vt2, src_vt3, src_vt4;
2574     v16i8 src_vt5, src_vt6, src_vt7, src_vt8;
2575     v16i8 mask0, mask1, mask2;
2576     v8i16 hz_out0, hz_out1, vert_out0, vert_out1;
2577     v8i16 res0, res1;
2578     v16u8 res;
2579
2580     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
2581     LD_SB5(src_y, src_stride, src_vt0, src_vt1, src_vt2, src_vt3, src_vt4);
2582     src_y += (5 * src_stride);
2583
2584     src_vt0 = (v16i8) __msa_insve_w((v4i32) src_vt0, 1, (v4i32) src_vt1);
2585     src_vt1 = (v16i8) __msa_insve_w((v4i32) src_vt1, 1, (v4i32) src_vt2);
2586     src_vt2 = (v16i8) __msa_insve_w((v4i32) src_vt2, 1, (v4i32) src_vt3);
2587     src_vt3 = (v16i8) __msa_insve_w((v4i32) src_vt3, 1, (v4i32) src_vt4);
2588
2589     XORI_B4_128_SB(src_vt0, src_vt1, src_vt2, src_vt3);
2590     LD_SB4(src_x, src_stride, src_hz0, src_hz1, src_hz2, src_hz3);
2591     LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2592     XORI_B4_128_SB(src_hz0, src_hz1, src_hz2, src_hz3);
2593     hz_out0 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src_hz0, src_hz1,
2594                                                           mask0, mask1, mask2);
2595     hz_out1 = AVC_XOR_VSHF_B_AND_APPLY_6TAP_HORIZ_FILT_SH(src_hz2, src_hz3,
2596                                                           mask0, mask1, mask2);
2597     SRARI_H2_SH(hz_out0, hz_out1, 5);
2598     SAT_SH2_SH(hz_out0, hz_out1, 7);
2599     LD_SB4(src_y, src_stride, src_vt5, src_vt6, src_vt7, src_vt8);
2600
2601     src_vt4 = (v16i8) __msa_insve_w((v4i32) src_vt4, 1, (v4i32) src_vt5);
2602     src_vt5 = (v16i8) __msa_insve_w((v4i32) src_vt5, 1, (v4i32) src_vt6);
2603     src_vt6 = (v16i8) __msa_insve_w((v4i32) src_vt6, 1, (v4i32) src_vt7);
2604     src_vt7 = (v16i8) __msa_insve_w((v4i32) src_vt7, 1, (v4i32) src_vt8);
2605
2606     XORI_B4_128_SB(src_vt4, src_vt5, src_vt6, src_vt7);
2607
2608     /* filter calc */
2609     vert_out0 = AVC_CALC_DPADD_B_6PIX_2COEFF_R_SH(src_vt0, src_vt1, src_vt2,
2610                                                   src_vt3, src_vt4, src_vt5);
2611     vert_out1 = AVC_CALC_DPADD_B_6PIX_2COEFF_R_SH(src_vt2, src_vt3, src_vt4,
2612                                                   src_vt5, src_vt6, src_vt7);
2613     SRARI_H2_SH(vert_out0, vert_out1, 5);
2614     SAT_SH2_SH(vert_out0, vert_out1, 7);
2615
2616     res1 = __msa_srari_h((hz_out1 + vert_out1), 1);
2617     res0 = __msa_srari_h((hz_out0 + vert_out0), 1);
2618
2619     SAT_SH2_SH(res0, res1, 7);
2620     res = PCKEV_XORI128_UB(res0, res1);
2621
2622     dst0 = (v16u8) __msa_insve_w((v4i32) dst0, 1, (v4i32) dst1);
2623     dst1 = (v16u8) __msa_insve_w((v4i32) dst2, 1, (v4i32) dst3);
2624     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
2625     dst0 = __msa_aver_u_b(res, dst0);
2626
2627     ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
2628 }
2629
2630 static void avc_luma_hv_qrt_and_aver_dst_8x8_msa(const uint8_t *src_x,
2631                                                  const uint8_t *src_y,
2632                                                  int32_t src_stride,
2633                                                  uint8_t *dst,
2634                                                  int32_t dst_stride)
2635 {
2636     uint32_t loop_cnt;
2637     v16i8 src_hz0, src_hz1, src_hz2, src_hz3;
2638     v16u8 dst0, dst1, dst2, dst3;
2639     v16i8 src_vt0, src_vt1, src_vt2, src_vt3;
2640     v16i8 src_vt4, src_vt5, src_vt6, src_vt7, src_vt8;
2641     v16i8 mask0, mask1, mask2;
2642     v8i16 hz_out0, hz_out1, hz_out2, hz_out3;
2643     v8i16 vert_out0, vert_out1, vert_out2, vert_out3;
2644     v8i16 out0, out1, out2, out3;
2645
2646     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
2647
2648     LD_SB5(src_y, src_stride, src_vt0, src_vt1, src_vt2, src_vt3, src_vt4);
2649     src_y += (5 * src_stride);
2650
2651     src_vt0 = (v16i8) __msa_insve_d((v2i64) src_vt0, 1, (v2i64) src_vt1);
2652     src_vt1 = (v16i8) __msa_insve_d((v2i64) src_vt1, 1, (v2i64) src_vt2);
2653     src_vt2 = (v16i8) __msa_insve_d((v2i64) src_vt2, 1, (v2i64) src_vt3);
2654     src_vt3 = (v16i8) __msa_insve_d((v2i64) src_vt3, 1, (v2i64) src_vt4);
2655
2656     XORI_B4_128_SB(src_vt0, src_vt1, src_vt2, src_vt3);
2657
2658     for (loop_cnt = 2; loop_cnt--;) {
2659         LD_SB4(src_x, src_stride, src_hz0, src_hz1, src_hz2, src_hz3);
2660         XORI_B4_128_SB(src_hz0, src_hz1, src_hz2, src_hz3);
2661         src_x += (4 * src_stride);
2662
2663         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2664         hz_out0 = AVC_HORZ_FILTER_SH(src_hz0, mask0, mask1, mask2);
2665         hz_out1 = AVC_HORZ_FILTER_SH(src_hz1, mask0, mask1, mask2);
2666         hz_out2 = AVC_HORZ_FILTER_SH(src_hz2, mask0, mask1, mask2);
2667         hz_out3 = AVC_HORZ_FILTER_SH(src_hz3, mask0, mask1, mask2);
2668         SRARI_H4_SH(hz_out0, hz_out1, hz_out2, hz_out3, 5);
2669         SAT_SH4_SH(hz_out0, hz_out1, hz_out2, hz_out3, 7);
2670         LD_SB4(src_y, src_stride, src_vt5, src_vt6, src_vt7, src_vt8);
2671         src_y += (4 * src_stride);
2672
2673         src_vt4 = (v16i8) __msa_insve_d((v2i64) src_vt4, 1, (v2i64) src_vt5);
2674         src_vt5 = (v16i8) __msa_insve_d((v2i64) src_vt5, 1, (v2i64) src_vt6);
2675         src_vt6 = (v16i8) __msa_insve_d((v2i64) src_vt6, 1, (v2i64) src_vt7);
2676         src_vt7 = (v16i8) __msa_insve_d((v2i64) src_vt7, 1, (v2i64) src_vt8);
2677
2678         XORI_B4_128_SB(src_vt4, src_vt5, src_vt6, src_vt7);
2679         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src_vt0, src_vt1, src_vt2, src_vt3,
2680                                         src_vt4, src_vt5, vert_out0, vert_out1);
2681         AVC_CALC_DPADD_B_6PIX_2COEFF_SH(src_vt2, src_vt3, src_vt4, src_vt5,
2682                                         src_vt6, src_vt7, vert_out2, vert_out3);
2683         SRARI_H4_SH(vert_out0, vert_out1, vert_out2, vert_out3, 5);
2684         SAT_SH4_SH(vert_out0, vert_out1, vert_out2, vert_out3, 7);
2685
2686         out0 = __msa_srari_h((hz_out0 + vert_out0), 1);
2687         out1 = __msa_srari_h((hz_out1 + vert_out1), 1);
2688         out2 = __msa_srari_h((hz_out2 + vert_out2), 1);
2689         out3 = __msa_srari_h((hz_out3 + vert_out3), 1);
2690
2691         SAT_SH4_SH(out0, out1, out2, out3, 7);
2692         ILVR_D2_UB(dst1, dst0, dst3, dst2, dst0, dst1);
2693         CONVERT_UB_AVG_ST8x4_UB(out0, out1, out2, out3, dst0, dst1,
2694                                 dst, dst_stride);
2695         dst += (4 * dst_stride);
2696
2697         src_vt0 = src_vt4;
2698         src_vt1 = src_vt5;
2699         src_vt2 = src_vt6;
2700         src_vt3 = src_vt7;
2701         src_vt4 = src_vt8;
2702     }
2703 }
2704
2705 static void avc_luma_hv_qrt_and_aver_dst_16x16_msa(const uint8_t *src_x,
2706                                                    const uint8_t *src_y,
2707                                                    int32_t src_stride,
2708                                                    uint8_t *dst,
2709                                                    int32_t dst_stride)
2710 {
2711     uint32_t multiple8_cnt;
2712
2713     for (multiple8_cnt = 2; multiple8_cnt--;) {
2714         avc_luma_hv_qrt_and_aver_dst_8x8_msa(src_x, src_y, src_stride,
2715                                              dst, dst_stride);
2716
2717         src_x += 8;
2718         src_y += 8;
2719         dst += 8;
2720     }
2721
2722     src_x += (8 * src_stride) - 16;
2723     src_y += (8 * src_stride) - 16;
2724     dst += (8 * dst_stride) - 16;
2725
2726     for (multiple8_cnt = 2; multiple8_cnt--;) {
2727         avc_luma_hv_qrt_and_aver_dst_8x8_msa(src_x, src_y, src_stride,
2728                                              dst, dst_stride);
2729
2730         src_x += 8;
2731         src_y += 8;
2732         dst += 8;
2733     }
2734 }
2735
2736 static void copy_width8_msa(const uint8_t *src, int32_t src_stride,
2737                             uint8_t *dst, int32_t dst_stride,
2738                             int32_t height)
2739 {
2740     int32_t cnt;
2741     uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
2742     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2743
2744     if (0 == height % 12) {
2745         for (cnt = (height / 12); cnt--;) {
2746             LD_UB8(src, src_stride,
2747                    src0, src1, src2, src3, src4, src5, src6, src7);
2748             src += (8 * src_stride);
2749
2750             out0 = __msa_copy_u_d((v2i64) src0, 0);
2751             out1 = __msa_copy_u_d((v2i64) src1, 0);
2752             out2 = __msa_copy_u_d((v2i64) src2, 0);
2753             out3 = __msa_copy_u_d((v2i64) src3, 0);
2754             out4 = __msa_copy_u_d((v2i64) src4, 0);
2755             out5 = __msa_copy_u_d((v2i64) src5, 0);
2756             out6 = __msa_copy_u_d((v2i64) src6, 0);
2757             out7 = __msa_copy_u_d((v2i64) src7, 0);
2758
2759             SD4(out0, out1, out2, out3, dst, dst_stride);
2760             dst += (4 * dst_stride);
2761             SD4(out4, out5, out6, out7, dst, dst_stride);
2762             dst += (4 * dst_stride);
2763
2764             LD_UB4(src, src_stride, src0, src1, src2, src3);
2765             src += (4 * src_stride);
2766
2767             out0 = __msa_copy_u_d((v2i64) src0, 0);
2768             out1 = __msa_copy_u_d((v2i64) src1, 0);
2769             out2 = __msa_copy_u_d((v2i64) src2, 0);
2770             out3 = __msa_copy_u_d((v2i64) src3, 0);
2771
2772             SD4(out0, out1, out2, out3, dst, dst_stride);
2773             dst += (4 * dst_stride);
2774         }
2775     } else if (0 == height % 8) {
2776         for (cnt = height >> 3; cnt--;) {
2777             LD_UB8(src, src_stride,
2778                    src0, src1, src2, src3, src4, src5, src6, src7);
2779             src += (8 * src_stride);
2780
2781             out0 = __msa_copy_u_d((v2i64) src0, 0);
2782             out1 = __msa_copy_u_d((v2i64) src1, 0);
2783             out2 = __msa_copy_u_d((v2i64) src2, 0);
2784             out3 = __msa_copy_u_d((v2i64) src3, 0);
2785             out4 = __msa_copy_u_d((v2i64) src4, 0);
2786             out5 = __msa_copy_u_d((v2i64) src5, 0);
2787             out6 = __msa_copy_u_d((v2i64) src6, 0);
2788             out7 = __msa_copy_u_d((v2i64) src7, 0);
2789
2790             SD4(out0, out1, out2, out3, dst, dst_stride);
2791             dst += (4 * dst_stride);
2792             SD4(out4, out5, out6, out7, dst, dst_stride);
2793             dst += (4 * dst_stride);
2794         }
2795     } else if (0 == height % 4) {
2796         for (cnt = (height / 4); cnt--;) {
2797             LD_UB4(src, src_stride, src0, src1, src2, src3);
2798             src += (4 * src_stride);
2799             out0 = __msa_copy_u_d((v2i64) src0, 0);
2800             out1 = __msa_copy_u_d((v2i64) src1, 0);
2801             out2 = __msa_copy_u_d((v2i64) src2, 0);
2802             out3 = __msa_copy_u_d((v2i64) src3, 0);
2803
2804             SD4(out0, out1, out2, out3, dst, dst_stride);
2805             dst += (4 * dst_stride);
2806         }
2807     } else if (0 == height % 2) {
2808         for (cnt = (height / 2); cnt--;) {
2809             LD_UB2(src, src_stride, src0, src1);
2810             src += (2 * src_stride);
2811             out0 = __msa_copy_u_d((v2i64) src0, 0);
2812             out1 = __msa_copy_u_d((v2i64) src1, 0);
2813
2814             SD(out0, dst);
2815             dst += dst_stride;
2816             SD(out1, dst);
2817             dst += dst_stride;
2818         }
2819     }
2820 }
2821
2822 static void copy_16multx8mult_msa(const uint8_t *src, int32_t src_stride,
2823                                   uint8_t *dst, int32_t dst_stride,
2824                                   int32_t height, int32_t width)
2825 {
2826     int32_t cnt, loop_cnt;
2827     const uint8_t *src_tmp;
2828     uint8_t *dst_tmp;
2829     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2830
2831     for (cnt = (width >> 4); cnt--;) {
2832         src_tmp = src;
2833         dst_tmp = dst;
2834
2835         for (loop_cnt = (height >> 3); loop_cnt--;) {
2836             LD_UB8(src_tmp, src_stride,
2837                    src0, src1, src2, src3, src4, src5, src6, src7);
2838             src_tmp += (8 * src_stride);
2839
2840             ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
2841                    dst_tmp, dst_stride);
2842             dst_tmp += (8 * dst_stride);
2843         }
2844
2845         src += 16;
2846         dst += 16;
2847     }
2848 }
2849
2850 static void copy_width16_msa(const uint8_t *src, int32_t src_stride,
2851                              uint8_t *dst, int32_t dst_stride,
2852                              int32_t height)
2853 {
2854     int32_t cnt;
2855     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2856
2857     if (0 == height % 12) {
2858         for (cnt = (height / 12); cnt--;) {
2859             LD_UB8(src, src_stride,
2860                    src0, src1, src2, src3, src4, src5, src6, src7);
2861             src += (8 * src_stride);
2862             ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7,
2863                    dst, dst_stride);
2864             dst += (8 * dst_stride);
2865
2866             LD_UB4(src, src_stride, src0, src1, src2, src3);
2867             src += (4 * src_stride);
2868             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
2869             dst += (4 * dst_stride);
2870         }
2871     } else if (0 == height % 8) {
2872         copy_16multx8mult_msa(src, src_stride, dst, dst_stride, height, 16);
2873     } else if (0 == height % 4) {
2874         for (cnt = (height >> 2); cnt--;) {
2875             LD_UB4(src, src_stride, src0, src1, src2, src3);
2876             src += (4 * src_stride);
2877
2878             ST_UB4(src0, src1, src2, src3, dst, dst_stride);
2879             dst += (4 * dst_stride);
2880         }
2881     }
2882 }
2883
2884 static void avg_width4_msa(const uint8_t *src, int32_t src_stride,
2885                            uint8_t *dst, int32_t dst_stride,
2886                            int32_t height)
2887 {
2888     int32_t cnt;
2889     uint32_t out0, out1, out2, out3;
2890     v16u8 src0, src1, src2, src3;
2891     v16u8 dst0, dst1, dst2, dst3;
2892
2893     if (0 == (height % 4)) {
2894         for (cnt = (height / 4); cnt--;) {
2895             LD_UB4(src, src_stride, src0, src1, src2, src3);
2896             src += (4 * src_stride);
2897
2898             LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2899
2900             AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
2901                         dst0, dst1, dst2, dst3);
2902
2903             out0 = __msa_copy_u_w((v4i32) dst0, 0);
2904             out1 = __msa_copy_u_w((v4i32) dst1, 0);
2905             out2 = __msa_copy_u_w((v4i32) dst2, 0);
2906             out3 = __msa_copy_u_w((v4i32) dst3, 0);
2907             SW4(out0, out1, out2, out3, dst, dst_stride);
2908             dst += (4 * dst_stride);
2909         }
2910     } else if (0 == (height % 2)) {
2911         for (cnt = (height / 2); cnt--;) {
2912             LD_UB2(src, src_stride, src0, src1);
2913             src += (2 * src_stride);
2914
2915             LD_UB2(dst, dst_stride, dst0, dst1);
2916
2917             AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
2918
2919             out0 = __msa_copy_u_w((v4i32) dst0, 0);
2920             out1 = __msa_copy_u_w((v4i32) dst1, 0);
2921             SW(out0, dst);
2922             dst += dst_stride;
2923             SW(out1, dst);
2924             dst += dst_stride;
2925         }
2926     }
2927 }
2928
2929 static void avg_width8_msa(const uint8_t *src, int32_t src_stride,
2930                            uint8_t *dst, int32_t dst_stride,
2931                            int32_t height)
2932 {
2933     int32_t cnt;
2934     uint64_t out0, out1, out2, out3;
2935     v16u8 src0, src1, src2, src3;
2936     v16u8 dst0, dst1, dst2, dst3;
2937
2938     for (cnt = (height / 4); cnt--;) {
2939         LD_UB4(src, src_stride, src0, src1, src2, src3);
2940         src += (4 * src_stride);
2941         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
2942
2943         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
2944                     dst0, dst1, dst2, dst3);
2945
2946         out0 = __msa_copy_u_d((v2i64) dst0, 0);
2947         out1 = __msa_copy_u_d((v2i64) dst1, 0);
2948         out2 = __msa_copy_u_d((v2i64) dst2, 0);
2949         out3 = __msa_copy_u_d((v2i64) dst3, 0);
2950         SD4(out0, out1, out2, out3, dst, dst_stride);
2951         dst += (4 * dst_stride);
2952     }
2953 }
2954
2955 static void avg_width16_msa(const uint8_t *src, int32_t src_stride,
2956                             uint8_t *dst, int32_t dst_stride,
2957                             int32_t height)
2958 {
2959     int32_t cnt;
2960     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2961     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
2962
2963     for (cnt = (height / 8); cnt--;) {
2964         LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
2965         src += (8 * src_stride);
2966         LD_UB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
2967
2968         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3,
2969                     dst0, dst1, dst2, dst3);
2970         AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7,
2971                     dst4, dst5, dst6, dst7);
2972         ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, dst_stride);
2973         dst += (8 * dst_stride);
2974     }
2975 }
2976
2977 void ff_put_h264_qpel16_mc00_msa(uint8_t *dst, const uint8_t *src,
2978                                  ptrdiff_t stride)
2979 {
2980     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
2981     v16u8 src8, src9, src10, src11, src12, src13, src14, src15;
2982
2983     LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
2984     src += (8 * stride);
2985     LD_UB8(src, stride, src8, src9, src10, src11, src12, src13, src14, src15);
2986
2987     ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7, dst, stride);
2988     dst += (8 * stride);
2989     ST_UB8(src8, src9, src10, src11, src12, src13, src14, src15, dst, stride);
2990 }
2991
2992 void ff_put_h264_qpel8_mc00_msa(uint8_t *dst, const uint8_t *src,
2993                                 ptrdiff_t stride)
2994 {
2995     uint64_t src0, src1, src2, src3, src4, src5, src6, src7;
2996
2997     LD4(src, stride, src0, src1, src2, src3);
2998     src += 4 * stride;
2999     LD4(src, stride, src4, src5, src6, src7);
3000     SD4(src0, src1, src2, src3, dst, stride);
3001     dst += 4 * stride;
3002     SD4(src4, src5, src6, src7, dst, stride);
3003 }
3004
3005 void ff_avg_h264_qpel16_mc00_msa(uint8_t *dst, const uint8_t *src,
3006                                  ptrdiff_t stride)
3007 {
3008     v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
3009     v16u8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
3010
3011     LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
3012     src += (8 * stride);
3013     LD_UB8(dst, stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
3014
3015     AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
3016                 dst2, dst3);
3017     AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7, dst4, dst5,
3018                 dst6, dst7);
3019     ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, stride);
3020     dst += (8 * stride);
3021
3022     LD_UB8(src, stride, src0, src1, src2, src3, src4, src5, src6, src7);
3023     LD_UB8(dst, stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
3024
3025     AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
3026                 dst2, dst3);
3027     AVER_UB4_UB(src4, dst4, src5, dst5, src6, dst6, src7, dst7, dst4, dst5,
3028                 dst6, dst7);
3029     ST_UB8(dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst, stride);
3030 }
3031
3032 void ff_avg_h264_qpel8_mc00_msa(uint8_t *dst, const uint8_t *src,
3033                                 ptrdiff_t stride)
3034 {
3035     uint64_t tp0, tp1, tp2, tp3, tp4, tp5, tp6, tp7;
3036     v16u8 src0 = { 0 }, src1 = { 0 }, src2 = { 0 }, src3 = { 0 };
3037     v16u8 dst0 = { 0 }, dst1 = { 0 }, dst2 = { 0 }, dst3 = { 0 };
3038
3039     LD4(src, stride, tp0, tp1, tp2, tp3);
3040     src += 4 * stride;
3041     LD4(src, stride, tp4, tp5, tp6, tp7);
3042     INSERT_D2_UB(tp0, tp1, src0);
3043     INSERT_D2_UB(tp2, tp3, src1);
3044     INSERT_D2_UB(tp4, tp5, src2);
3045     INSERT_D2_UB(tp6, tp7, src3);
3046
3047     LD4(dst, stride, tp0, tp1, tp2, tp3);
3048     LD4(dst + 4 * stride, stride, tp4, tp5, tp6, tp7);
3049     INSERT_D2_UB(tp0, tp1, dst0);
3050     INSERT_D2_UB(tp2, tp3, dst1);
3051     INSERT_D2_UB(tp4, tp5, dst2);
3052     INSERT_D2_UB(tp6, tp7, dst3);
3053
3054     AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
3055                 dst2, dst3);
3056
3057     ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
3058 }
3059
3060 void ff_avg_h264_qpel4_mc00_msa(uint8_t *dst, const uint8_t *src,
3061                                 ptrdiff_t stride)
3062 {
3063     uint32_t tp0, tp1, tp2, tp3;
3064     v16u8 src0 = { 0 }, dst0 = { 0 };
3065
3066     LW4(src, stride, tp0, tp1, tp2, tp3);
3067     INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
3068     LW4(dst, stride, tp0, tp1, tp2, tp3);
3069     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
3070
3071     dst0 = __msa_aver_u_b(src0, dst0);
3072
3073     ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
3074 }
3075
3076 void ff_put_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
3077                                  ptrdiff_t stride)
3078 {
3079     uint32_t loop_cnt;
3080     v16i8 dst0, dst1, dst2, dst3, src0, src1, src2, src3, src4, src5, src6;
3081     v16i8 mask0, mask1, mask2, mask3, mask4, mask5, src7, vec11;
3082     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3083     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3084     v16i8 minus5b = __msa_ldi_b(-5);
3085     v16i8 plus20b = __msa_ldi_b(20);
3086
3087     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3088     mask3 = mask0 + 8;
3089     mask4 = mask1 + 8;
3090     mask5 = mask2 + 8;
3091     src -= 2;
3092
3093     for (loop_cnt = 4; loop_cnt--;) {
3094         LD_SB2(src, 16, src0, src1);
3095         src += stride;
3096         LD_SB2(src, 16, src2, src3);
3097         src += stride;
3098         LD_SB2(src, 16, src4, src5);
3099         src += stride;
3100         LD_SB2(src, 16, src6, src7);
3101         src += stride;
3102
3103         XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3104         VSHF_B2_SB(src0, src0, src0, src1, mask0, mask3, vec0, vec3);
3105         VSHF_B2_SB(src2, src2, src2, src3, mask0, mask3, vec6, vec9);
3106         VSHF_B2_SB(src0, src0, src0, src1, mask1, mask4, vec1, vec4);
3107         VSHF_B2_SB(src2, src2, src2, src3, mask1, mask4, vec7, vec10);
3108         VSHF_B2_SB(src0, src0, src0, src1, mask2, mask5, vec2, vec5);
3109         VSHF_B2_SB(src2, src2, src2, src3, mask2, mask5, vec8, vec11);
3110         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
3111         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3112                      minus5b, res0, res1, res2, res3);
3113         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3114                      plus20b, res0, res1, res2, res3);
3115         VSHF_B2_SB(src4, src4, src4, src5, mask0, mask3, vec0, vec3);
3116         VSHF_B2_SB(src6, src6, src6, src7, mask0, mask3, vec6, vec9);
3117         VSHF_B2_SB(src4, src4, src4, src5, mask1, mask4, vec1, vec4);
3118         VSHF_B2_SB(src6, src6, src6, src7, mask1, mask4, vec7, vec10);
3119         VSHF_B2_SB(src4, src4, src4, src5, mask2, mask5, vec2, vec5);
3120         VSHF_B2_SB(src6, src6, src6, src7, mask2, mask5, vec8, vec11);
3121         HADD_SB4_SH(vec0, vec3, vec6, vec9, res4, res5, res6, res7);
3122         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3123                      minus5b, res4, res5, res6, res7);
3124         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3125                      plus20b, res4, res5, res6, res7);
3126         SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 2);
3127         SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 2);
3128         SRARI_H4_SH(res0, res1, res2, res3, 5);
3129         SRARI_H4_SH(res4, res5, res6, res7, 5);
3130         SAT_SH4_SH(res0, res1, res2, res3, 7);
3131         SAT_SH4_SH(res4, res5, res6, res7, 7);
3132         PCKEV_B2_SB(res1, res0, res3, res2, dst0, dst1);
3133         PCKEV_B2_SB(res5, res4, res7, res6, dst2, dst3);
3134         dst0 = __msa_aver_s_b(dst0, src0);
3135         dst1 = __msa_aver_s_b(dst1, src2);
3136         dst2 = __msa_aver_s_b(dst2, src4);
3137         dst3 = __msa_aver_s_b(dst3, src6);
3138         XORI_B4_128_SB(dst0, dst1, dst2, dst3);
3139         ST_SB4(dst0, dst1, dst2, dst3, dst, stride);
3140         dst += (4 * stride);
3141     }
3142 }
3143
3144 void ff_put_h264_qpel16_mc30_msa(uint8_t *dst, const uint8_t *src,
3145                                  ptrdiff_t stride)
3146 {
3147     uint32_t loop_cnt;
3148     v16i8 dst0, dst1, dst2, dst3, src0, src1, src2, src3, src4, src5, src6;
3149     v16i8 mask0, mask1, mask2, mask3, mask4, mask5, src7, vec11;
3150     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3151     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3152     v16i8 minus5b = __msa_ldi_b(-5);
3153     v16i8 plus20b = __msa_ldi_b(20);
3154
3155     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3156     mask3 = mask0 + 8;
3157     mask4 = mask1 + 8;
3158     mask5 = mask2 + 8;
3159     src -= 2;
3160
3161     for (loop_cnt = 4; loop_cnt--;) {
3162         LD_SB2(src, 16, src0, src1);
3163         src += stride;
3164         LD_SB2(src, 16, src2, src3);
3165         src += stride;
3166         LD_SB2(src, 16, src4, src5);
3167         src += stride;
3168         LD_SB2(src, 16, src6, src7);
3169         src += stride;
3170
3171         XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3172         VSHF_B2_SB(src0, src0, src0, src1, mask0, mask3, vec0, vec3);
3173         VSHF_B2_SB(src2, src2, src2, src3, mask0, mask3, vec6, vec9);
3174         VSHF_B2_SB(src0, src0, src0, src1, mask1, mask4, vec1, vec4);
3175         VSHF_B2_SB(src2, src2, src2, src3, mask1, mask4, vec7, vec10);
3176         VSHF_B2_SB(src0, src0, src0, src1, mask2, mask5, vec2, vec5);
3177         VSHF_B2_SB(src2, src2, src2, src3, mask2, mask5, vec8, vec11);
3178         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
3179         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3180                      minus5b, res0, res1, res2, res3);
3181         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3182                      plus20b, res0, res1, res2, res3);
3183         VSHF_B2_SB(src4, src4, src4, src5, mask0, mask3, vec0, vec3);
3184         VSHF_B2_SB(src6, src6, src6, src7, mask0, mask3, vec6, vec9);
3185         VSHF_B2_SB(src4, src4, src4, src5, mask1, mask4, vec1, vec4);
3186         VSHF_B2_SB(src6, src6, src6, src7, mask1, mask4, vec7, vec10);
3187         VSHF_B2_SB(src4, src4, src4, src5, mask2, mask5, vec2, vec5);
3188         VSHF_B2_SB(src6, src6, src6, src7, mask2, mask5, vec8, vec11);
3189         HADD_SB4_SH(vec0, vec3, vec6, vec9, res4, res5, res6, res7);
3190         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3191                      minus5b, res4, res5, res6, res7);
3192         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3193                      plus20b, res4, res5, res6, res7);
3194         SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 3);
3195         SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 3);
3196         SRARI_H4_SH(res0, res1, res2, res3, 5);
3197         SRARI_H4_SH(res4, res5, res6, res7, 5);
3198         SAT_SH4_SH(res0, res1, res2, res3, 7);
3199         SAT_SH4_SH(res4, res5, res6, res7, 7);
3200         PCKEV_B2_SB(res1, res0, res3, res2, dst0, dst1);
3201         PCKEV_B2_SB(res5, res4, res7, res6, dst2, dst3);
3202         dst0 = __msa_aver_s_b(dst0, src0);
3203         dst1 = __msa_aver_s_b(dst1, src2);
3204         dst2 = __msa_aver_s_b(dst2, src4);
3205         dst3 = __msa_aver_s_b(dst3, src6);
3206         XORI_B4_128_SB(dst0, dst1, dst2, dst3);
3207         ST_SB4(dst0, dst1, dst2, dst3, dst, stride);
3208         dst += (4 * stride);
3209     }
3210 }
3211
3212 void ff_put_h264_qpel8_mc10_msa(uint8_t *dst, const uint8_t *src,
3213                                 ptrdiff_t stride)
3214 {
3215     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask0, mask1, mask2;
3216     v16i8 tmp0, tmp1, tmp2, tmp3, vec11;
3217     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3218     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3219     v16i8 minus5b = __msa_ldi_b(-5);
3220     v16i8 plus20b = __msa_ldi_b(20);
3221
3222     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3223     LD_SB8(src - 2, stride, src0, src1, src2, src3, src4, src5, src6, src7);
3224     XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3225     VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
3226     VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
3227     HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
3228     VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
3229     VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
3230     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3231                  res0, res1, res2, res3);
3232     VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
3233     VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
3234     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
3235                  res0, res1, res2, res3);
3236     VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec1);
3237     VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec2, vec3);
3238     HADD_SB4_SH(vec0, vec1, vec2, vec3, res4, res5, res6, res7);
3239     VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec4, vec5);
3240     VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec6, vec7);
3241     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3242                  res4, res5, res6, res7);
3243     VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec8, vec9);
3244     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
3245     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
3246                  res4, res5, res6, res7);
3247     SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
3248     SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
3249     SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 2);
3250     SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 2);
3251     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
3252     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
3253     SRARI_H4_SH(res0, res1, res2, res3, 5);
3254     SRARI_H4_SH(res4, res5, res6, res7, 5);
3255     SAT_SH4_SH(res0, res1, res2, res3, 7);
3256     SAT_SH4_SH(res4, res5, res6, res7, 7);
3257     PCKEV_B2_SB(res1, res0, res3, res2, tmp0, tmp1);
3258     PCKEV_B2_SB(res5, res4, res7, res6, tmp2, tmp3);
3259     tmp0 = __msa_aver_s_b(tmp0, src0);
3260     tmp1 = __msa_aver_s_b(tmp1, src1);
3261     tmp2 = __msa_aver_s_b(tmp2, src4);
3262     tmp3 = __msa_aver_s_b(tmp3, src5);
3263     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
3264     ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
3265 }
3266
3267 void ff_put_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
3268                                 ptrdiff_t stride)
3269 {
3270     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask0, mask1, mask2;
3271     v16i8 tmp0, tmp1, tmp2, tmp3, vec11;
3272     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3273     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3274     v16i8 minus5b = __msa_ldi_b(-5);
3275     v16i8 plus20b = __msa_ldi_b(20);
3276
3277     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3278     LD_SB8(src - 2, stride, src0, src1, src2, src3, src4, src5, src6, src7);
3279     XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3280     VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
3281     VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
3282     HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
3283     VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
3284     VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
3285     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3286                  res0, res1, res2, res3);
3287     VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
3288     VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
3289     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
3290                  res0, res1, res2, res3);
3291     VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec1);
3292     VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec2, vec3);
3293     HADD_SB4_SH(vec0, vec1, vec2, vec3, res4, res5, res6, res7);
3294     VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec4, vec5);
3295     VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec6, vec7);
3296     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3297                  res4, res5, res6, res7);
3298     VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec8, vec9);
3299     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
3300     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
3301                  res4, res5, res6, res7);
3302     SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
3303     SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
3304     SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 3);
3305     SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 3);
3306     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
3307     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
3308     SRARI_H4_SH(res0, res1, res2, res3, 5);
3309     SRARI_H4_SH(res4, res5, res6, res7, 5);
3310     SAT_SH4_SH(res0, res1, res2, res3, 7);
3311     SAT_SH4_SH(res4, res5, res6, res7, 7);
3312     PCKEV_B2_SB(res1, res0, res3, res2, tmp0, tmp1);
3313     PCKEV_B2_SB(res5, res4, res7, res6, tmp2, tmp3);
3314     tmp0 = __msa_aver_s_b(tmp0, src0);
3315     tmp1 = __msa_aver_s_b(tmp1, src1);
3316     tmp2 = __msa_aver_s_b(tmp2, src4);
3317     tmp3 = __msa_aver_s_b(tmp3, src5);
3318     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
3319     ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
3320 }
3321
3322 void ff_put_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
3323                                 ptrdiff_t stride)
3324 {
3325     v16i8 src0, src1, src2, src3, res, mask0, mask1, mask2;
3326     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
3327     v8i16 res0, res1;
3328     v16i8 minus5b = __msa_ldi_b(-5);
3329     v16i8 plus20b = __msa_ldi_b(20);
3330
3331     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
3332     LD_SB4(src - 2, stride, src0, src1, src2, src3);
3333     XORI_B4_128_SB(src0, src1, src2, src3);
3334     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
3335     HADD_SB2_SH(vec0, vec1, res0, res1);
3336     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
3337     DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
3338     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
3339     DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
3340     SRARI_H2_SH(res0, res1, 5);
3341     SAT_SH2_SH(res0, res1, 7);
3342     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
3343     SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
3344     SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
3345     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
3346     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
3347     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
3348     res = __msa_aver_s_b(res, src0);
3349     res = (v16i8) __msa_xori_b((v16u8) res, 128);
3350     ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
3351 }
3352
3353 void ff_put_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
3354                                 ptrdiff_t stride)
3355 {
3356     v16i8 src0, src1, src2, src3, res, mask0, mask1, mask2;
3357     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
3358     v8i16 res0, res1;
3359     v16i8 minus5b = __msa_ldi_b(-5);
3360     v16i8 plus20b = __msa_ldi_b(20);
3361
3362     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
3363     LD_SB4(src - 2, stride, src0, src1, src2, src3);
3364     XORI_B4_128_SB(src0, src1, src2, src3);
3365     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
3366     HADD_SB2_SH(vec0, vec1, res0, res1);
3367     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
3368     DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
3369     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
3370     DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
3371     SRARI_H2_SH(res0, res1, 5);
3372     SAT_SH2_SH(res0, res1, 7);
3373     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
3374     SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
3375     SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
3376     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
3377     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
3378     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
3379     res = __msa_aver_s_b(res, src0);
3380     res = (v16i8) __msa_xori_b((v16u8) res, 128);
3381     ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
3382 }
3383
3384 void ff_put_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
3385                                  ptrdiff_t stride)
3386 {
3387     uint32_t loop_cnt;
3388     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask0, mask1, mask2;
3389     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3390     v16i8 vec11;
3391     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3392     v16i8 minus5b = __msa_ldi_b(-5);
3393     v16i8 plus20b = __msa_ldi_b(20);
3394
3395     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3396     src -= 2;
3397
3398     for (loop_cnt = 4; loop_cnt--;) {
3399         LD_SB2(src, 8, src0, src1);
3400         src += stride;
3401         LD_SB2(src, 8, src2, src3);
3402         src += stride;
3403         LD_SB2(src, 8, src4, src5);
3404         src += stride;
3405         LD_SB2(src, 8, src6, src7);
3406         src += stride;
3407
3408         XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3409         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec3);
3410         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec9);
3411         VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec1, vec4);
3412         VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec7, vec10);
3413         VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec2, vec5);
3414         VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec8, vec11);
3415         HADD_SB4_SH(vec0, vec3, vec6, vec9, res0, res1, res2, res3);
3416         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3417                      minus5b, res0, res1, res2, res3);
3418         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3419                      plus20b, res0, res1, res2, res3);
3420         VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec3);
3421         VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec6, vec9);
3422         VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec1, vec4);
3423         VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec7, vec10);
3424         VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec2, vec5);
3425         VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec8, vec11);
3426         HADD_SB4_SH(vec0, vec3, vec6, vec9, res4, res5, res6, res7);
3427         DPADD_SB4_SH(vec1, vec4, vec7, vec10, minus5b, minus5b, minus5b,
3428                      minus5b, res4, res5, res6, res7);
3429         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
3430                      plus20b, res4, res5, res6, res7);
3431         SRARI_H4_SH(res0, res1, res2, res3, 5);
3432         SRARI_H4_SH(res4, res5, res6, res7, 5);
3433         SAT_SH4_SH(res0, res1, res2, res3, 7);
3434         SAT_SH4_SH(res4, res5, res6, res7, 7);
3435         PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6, vec0, vec1,
3436                     vec2, vec3);
3437         XORI_B4_128_SB(vec0, vec1, vec2, vec3);
3438         ST_SB4(vec0, vec1, vec2, vec3, dst, stride);
3439         dst += (4 * stride);
3440     }
3441 }
3442
3443 void ff_put_h264_qpel8_mc20_msa(uint8_t *dst, const uint8_t *src,
3444                                 ptrdiff_t stride)
3445 {
3446     v16u8 out0, out1, out2, out3;
3447     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, mask0, mask1, mask2;
3448     v16i8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9, vec10;
3449     v16i8 vec11;
3450     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
3451     v16i8 minus5b = __msa_ldi_b(-5);
3452     v16i8 plus20b = __msa_ldi_b(20);
3453
3454     LD_SB3(&luma_mask_arr[0], 16, mask0, mask1, mask2);
3455     LD_SB8(src - 2, stride, src0, src1, src2, src3, src4, src5, src6, src7);
3456     XORI_B8_128_SB(src0, src1, src2, src3, src4, src5, src6, src7);
3457     VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec0, vec1);
3458     VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec2, vec3);
3459     HADD_SB4_SH(vec0, vec1, vec2, vec3, res0, res1, res2, res3);
3460     VSHF_B2_SB(src0, src0, src1, src1, mask1, mask1, vec4, vec5);
3461     VSHF_B2_SB(src2, src2, src3, src3, mask1, mask1, vec6, vec7);
3462     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3463                  res0, res1, res2, res3);
3464     VSHF_B2_SB(src0, src0, src1, src1, mask2, mask2, vec8, vec9);
3465     VSHF_B2_SB(src2, src2, src3, src3, mask2, mask2, vec10, vec11);
3466     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
3467                  plus20b, res0, res1, res2, res3);
3468     VSHF_B2_SB(src4, src4, src5, src5, mask0, mask0, vec0, vec1);
3469     VSHF_B2_SB(src6, src6, src7, src7, mask0, mask0, vec2, vec3);
3470     HADD_SB4_SH(vec0, vec1, vec2, vec3, res4, res5, res6, res7);
3471     VSHF_B2_SB(src4, src4, src5, src5, mask1, mask1, vec4, vec5);
3472     VSHF_B2_SB(src6, src6, src7, src7, mask1, mask1, vec6, vec7);
3473     DPADD_SB4_SH(vec4, vec5, vec6, vec7, minus5b, minus5b, minus5b, minus5b,
3474                  res4, res5, res6, res7);
3475     VSHF_B2_SB(src4, src4, src5, src5, mask2, mask2, vec8, vec9);
3476     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
3477     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b,
3478                  plus20b, res4, res5, res6, res7);
3479     SRARI_H4_SH(res0, res1, res2, res3, 5);
3480     SRARI_H4_SH(res4, res5, res6, res7, 5);
3481     SAT_SH4_SH(res0, res1, res2, res3, 7);
3482     SAT_SH4_SH(res4, res5, res6, res7, 7);
3483     out0 = PCKEV_XORI128_UB(res0, res1);
3484     out1 = PCKEV_XORI128_UB(res2, res3);
3485     out2 = PCKEV_XORI128_UB(res4, res5);
3486     out3 = PCKEV_XORI128_UB(res6, res7);
3487     ST8x8_UB(out0, out1, out2, out3, dst, stride);
3488 }
3489
3490 void ff_put_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
3491                                 ptrdiff_t stride)
3492 {
3493     v16u8 out;
3494     v16i8 src0, src1, src2, src3, mask0, mask1, mask2;
3495     v16i8 vec0, vec1, vec2, vec3, vec4, vec5;
3496     v8i16 res0, res1;
3497     v16i8 minus5b = __msa_ldi_b(-5);
3498     v16i8 plus20b = __msa_ldi_b(20);
3499
3500     LD_SB3(&luma_mask_arr[48], 16, mask0, mask1, mask2);
3501     LD_SB4(src - 2, stride, src0, src1, src2, src3);
3502     XORI_B4_128_SB(src0, src1, src2, src3);
3503     VSHF_B2_SB(src0, src1, src2, src3, mask0, mask0, vec0, vec1);
3504     HADD_SB2_SH(vec0, vec1, res0, res1);
3505     VSHF_B2_SB(src0, src1, src2, src3, mask1, mask1, vec2, vec3);
3506     DPADD_SB2_SH(vec2, vec3, minus5b, minus5b, res0, res1);
3507     VSHF_B2_SB(src0, src1, src2, src3, mask2, mask2, vec4, vec5);
3508     DPADD_SB2_SH(vec4, vec5, plus20b, plus20b, res0, res1);
3509     SRARI_H2_SH(res0, res1, 5);
3510     SAT_SH2_SH(res0, res1, 7);
3511     out = PCKEV_XORI128_UB(res0, res1);
3512     ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
3513 }
3514
3515 void ff_put_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
3516                                  ptrdiff_t stride)
3517 {
3518     int32_t loop_cnt;
3519     int16_t filt_const0 = 0xfb01;
3520     int16_t filt_const1 = 0x1414;
3521     int16_t filt_const2 = 0x1fb;
3522     v16u8 res0, res1, res2, res3;
3523     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
3524     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
3525     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
3526     v16i8 src65_l, src87_l, filt0, filt1, filt2;
3527     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
3528
3529     filt0 = (v16i8) __msa_fill_h(filt_const0);
3530     filt1 = (v16i8) __msa_fill_h(filt_const1);
3531     filt2 = (v16i8) __msa_fill_h(filt_const2);
3532
3533     src -= (stride * 2);
3534
3535     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3536     src += (5 * stride);
3537
3538     XORI_B5_128_SB(src0, src1, src2, src3, src4);
3539     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3540                src32_r, src43_r);
3541     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_l, src21_l,
3542                src32_l, src43_l);
3543
3544     for (loop_cnt = 4; loop_cnt--;) {
3545         LD_SB4(src, stride, src5, src6, src7, src8);
3546         src += (4 * stride);
3547
3548         XORI_B4_128_SB(src5, src6, src7, src8);
3549         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r,
3550                    src65_r, src76_r, src87_r);
3551         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_l,
3552                    src65_l, src76_l, src87_l);
3553         out0_r = AVC_DOT_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
3554         out1_r = AVC_DOT_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
3555         out2_r = AVC_DOT_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
3556         out3_r = AVC_DOT_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
3557         out0_l = AVC_DOT_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
3558         out1_l = AVC_DOT_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
3559         out2_l = AVC_DOT_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
3560         out3_l = AVC_DOT_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
3561         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
3562         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
3563         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
3564         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
3565         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
3566                     out3_r, res0, res1, res2, res3);
3567         res0 = (v16u8) __msa_aver_s_b((v16i8) res0, src2);
3568         res1 = (v16u8) __msa_aver_s_b((v16i8) res1, src3);
3569         res2 = (v16u8) __msa_aver_s_b((v16i8) res2, src4);
3570         res3 = (v16u8) __msa_aver_s_b((v16i8) res3, src5);
3571         XORI_B4_128_UB(res0, res1, res2, res3);
3572         ST_UB4(res0, res1, res2, res3, dst, stride);
3573         dst += (4 * stride);
3574
3575         src10_r = src54_r;
3576         src32_r = src76_r;
3577         src21_r = src65_r;
3578         src43_r = src87_r;
3579         src10_l = src54_l;
3580         src32_l = src76_l;
3581         src21_l = src65_l;
3582         src43_l = src87_l;
3583         src2 = src6;
3584         src3 = src7;
3585         src4 = src8;
3586     }
3587 }
3588
3589 void ff_put_h264_qpel16_mc03_msa(uint8_t *dst, const uint8_t *src,
3590                                  ptrdiff_t stride)
3591 {
3592     int32_t loop_cnt;
3593     int16_t filt_const0 = 0xfb01;
3594     int16_t filt_const1 = 0x1414;
3595     int16_t filt_const2 = 0x1fb;
3596     v16u8 res0, res1, res2, res3;
3597     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
3598     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
3599     v16i8 src87_r, src10_l, src32_l, src54_l, src76_l, src21_l, src43_l;
3600     v16i8 src65_l, src87_l, filt0, filt1, filt2;
3601     v8i16 out0_r, out1_r, out2_r, out3_r, out0_l, out1_l, out2_l, out3_l;
3602
3603     filt0 = (v16i8) __msa_fill_h(filt_const0);
3604     filt1 = (v16i8) __msa_fill_h(filt_const1);
3605     filt2 = (v16i8) __msa_fill_h(filt_const2);
3606
3607     src -= (stride * 2);
3608
3609     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3610     src += (5 * stride);
3611
3612     XORI_B5_128_SB(src0, src1, src2, src3, src4);
3613     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3614                src32_r, src43_r);
3615     ILVL_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_l, src21_l,
3616                src32_l, src43_l);
3617
3618     for (loop_cnt = 4; loop_cnt--;) {
3619         LD_SB4(src, stride, src5, src6, src7, src8);
3620         src += (4 * stride);
3621
3622         XORI_B4_128_SB(src5, src6, src7, src8);
3623         ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r,
3624                    src65_r, src76_r, src87_r);
3625         ILVL_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_l,
3626                    src65_l, src76_l, src87_l);
3627         out0_r = AVC_DOT_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
3628         out1_r = AVC_DOT_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
3629         out2_r = AVC_DOT_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
3630         out3_r = AVC_DOT_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
3631         out0_l = AVC_DOT_SH3_SH(src10_l, src32_l, src54_l, filt0, filt1, filt2);
3632         out1_l = AVC_DOT_SH3_SH(src21_l, src43_l, src65_l, filt0, filt1, filt2);
3633         out2_l = AVC_DOT_SH3_SH(src32_l, src54_l, src76_l, filt0, filt1, filt2);
3634         out3_l = AVC_DOT_SH3_SH(src43_l, src65_l, src87_l, filt0, filt1, filt2);
3635         SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
3636         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
3637         SRARI_H4_SH(out0_l, out1_l, out2_l, out3_l, 5);
3638         SAT_SH4_SH(out0_l, out1_l, out2_l, out3_l, 7);
3639         PCKEV_B4_UB(out0_l, out0_r, out1_l, out1_r, out2_l, out2_r, out3_l,
3640                     out3_r, res0, res1, res2, res3);
3641         res0 = (v16u8) __msa_aver_s_b((v16i8) res0, src3);
3642         res1 = (v16u8) __msa_aver_s_b((v16i8) res1, src4);
3643         res2 = (v16u8) __msa_aver_s_b((v16i8) res2, src5);
3644         res3 = (v16u8) __msa_aver_s_b((v16i8) res3, src6);
3645         XORI_B4_128_UB(res0, res1, res2, res3);
3646         ST_UB4(res0, res1, res2, res3, dst, stride);
3647         dst += (4 * stride);
3648
3649         src10_r = src54_r;
3650         src32_r = src76_r;
3651         src21_r = src65_r;
3652         src43_r = src87_r;
3653         src10_l = src54_l;
3654         src32_l = src76_l;
3655         src21_l = src65_l;
3656         src43_l = src87_l;
3657         src3 = src7;
3658         src4 = src8;
3659     }
3660 }
3661
3662 void ff_put_h264_qpel8_mc01_msa(uint8_t *dst, const uint8_t *src,
3663                                 ptrdiff_t stride)
3664 {
3665     const int16_t filt_const0 = 0xfb01;
3666     const int16_t filt_const1 = 0x1414;
3667     const int16_t filt_const2 = 0x1fb;
3668     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
3669     v16i8 src11, src12, src10_r, src32_r, src54_r, src65_r, src76_r, src98_r;
3670     v16i8 src21_r, src43_r, src87_r, src109_r, src1211_r, src1110_r;
3671     v16i8 tmp0, tmp1, tmp2, tmp3, filt0, filt1, filt2, out0, out1, out2, out3;
3672     v8i16 out0_r, out1_r, out2_r, out3_r, out4_r, out5_r, out6_r, out7_r;
3673
3674     filt0 = (v16i8) __msa_fill_h(filt_const0);
3675     filt1 = (v16i8) __msa_fill_h(filt_const1);
3676     filt2 = (v16i8) __msa_fill_h(filt_const2);
3677
3678     src -= (stride * 2);
3679
3680     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3681     src += (5 * stride);
3682     LD_SB8(src, stride, src5, src6, src7, src8, src9, src10, src11, src12);
3683     XORI_B8_128_SB(src5, src6, src7, src8, src9, src10, src11, src12);
3684     XORI_B5_128_SB(src0, src1, src2, src3, src4);
3685     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3686                src32_r, src43_r);
3687     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
3688                src76_r, src87_r);
3689     ILVR_B4_SB(src9, src8, src10, src9, src11, src10, src12, src11, src98_r,
3690                src109_r, src1110_r, src1211_r);
3691     out0_r = AVC_DOT_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
3692     out1_r = AVC_DOT_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
3693     out2_r = AVC_DOT_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
3694     out3_r = AVC_DOT_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
3695     out4_r = AVC_DOT_SH3_SH(src54_r, src76_r, src98_r, filt0, filt1, filt2);
3696     out5_r = AVC_DOT_SH3_SH(src65_r, src87_r, src109_r, filt0, filt1, filt2);
3697     out6_r = AVC_DOT_SH3_SH(src76_r, src98_r, src1110_r, filt0, filt1, filt2);
3698     out7_r = AVC_DOT_SH3_SH(src87_r, src109_r, src1211_r, filt0, filt1, filt2);
3699     PCKEV_D2_SB(src3, src2, src5, src4, tmp0, tmp1);
3700     PCKEV_D2_SB(src7, src6, src9, src8, tmp2, tmp3);
3701     SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
3702     SRARI_H4_SH(out4_r, out5_r, out6_r, out7_r, 5);
3703     SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
3704     SAT_SH4_SH(out4_r, out5_r, out6_r, out7_r, 7);
3705     PCKEV_B2_SB(out1_r, out0_r, out3_r, out2_r, out0, out1);
3706     PCKEV_B2_SB(out5_r, out4_r, out7_r, out6_r, out2, out3);
3707     out0 = __msa_aver_s_b(out0, tmp0);
3708     out1 = __msa_aver_s_b(out1, tmp1);
3709     out2 = __msa_aver_s_b(out2, tmp2);
3710     out3 = __msa_aver_s_b(out3, tmp3);
3711     XORI_B4_128_SB(out0, out1, out2, out3);
3712     ST8x8_UB(out0, out1, out2, out3, dst, stride);
3713 }
3714
3715 void ff_put_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
3716                                 ptrdiff_t stride)
3717 {
3718     const int16_t filt_const0 = 0xfb01;
3719     const int16_t filt_const1 = 0x1414;
3720     const int16_t filt_const2 = 0x1fb;
3721     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
3722     v16i8 src11, src12, src10_r, src32_r, src54_r, src65_r, src76_r, src98_r;
3723     v16i8 src21_r, src43_r, src87_r, src109_r, src1211_r, src1110_r;
3724     v16i8 filt0, filt1, filt2, out0, out1, out2, out3, tmp0, tmp1, tmp2, tmp3;
3725     v8i16 out0_r, out1_r, out2_r, out3_r, out4_r, out5_r, out6_r, out7_r;
3726
3727     filt0 = (v16i8) __msa_fill_h(filt_const0);
3728     filt1 = (v16i8) __msa_fill_h(filt_const1);
3729     filt2 = (v16i8) __msa_fill_h(filt_const2);
3730
3731     src -= (stride * 2);
3732
3733     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3734     src += (5 * stride);
3735     LD_SB8(src, stride, src5, src6, src7, src8, src9, src10, src11, src12);
3736     XORI_B5_128_SB(src0, src1, src2, src3, src4);
3737     XORI_B8_128_SB(src5, src6, src7, src8, src9, src10, src11, src12);
3738     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3739                src32_r, src43_r);
3740     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
3741                src76_r, src87_r);
3742     ILVR_B4_SB(src9, src8, src10, src9, src11, src10, src12, src11, src98_r,
3743                src109_r, src1110_r, src1211_r);
3744     out0_r = AVC_DOT_SH3_SH(src10_r, src32_r, src54_r, filt0, filt1, filt2);
3745     out1_r = AVC_DOT_SH3_SH(src21_r, src43_r, src65_r, filt0, filt1, filt2);
3746     out2_r = AVC_DOT_SH3_SH(src32_r, src54_r, src76_r, filt0, filt1, filt2);
3747     out3_r = AVC_DOT_SH3_SH(src43_r, src65_r, src87_r, filt0, filt1, filt2);
3748     out4_r = AVC_DOT_SH3_SH(src54_r, src76_r, src98_r, filt0, filt1, filt2);
3749     out5_r = AVC_DOT_SH3_SH(src65_r, src87_r, src109_r, filt0, filt1, filt2);
3750     out6_r = AVC_DOT_SH3_SH(src76_r, src98_r, src1110_r, filt0, filt1, filt2);
3751     out7_r = AVC_DOT_SH3_SH(src87_r, src109_r, src1211_r, filt0, filt1, filt2);
3752     PCKEV_D2_SB(src4, src3, src6, src5, tmp0, tmp1);
3753     PCKEV_D2_SB(src8, src7, src10, src9, tmp2, tmp3);
3754     SRARI_H4_SH(out0_r, out1_r, out2_r, out3_r, 5);
3755     SRARI_H4_SH(out4_r, out5_r, out6_r, out7_r, 5);
3756     SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
3757     SAT_SH4_SH(out4_r, out5_r, out6_r, out7_r, 7);
3758     PCKEV_B2_SB(out1_r, out0_r, out3_r, out2_r, out0, out1);
3759     PCKEV_B2_SB(out5_r, out4_r, out7_r, out6_r, out2, out3);
3760     out0 = __msa_aver_s_b(out0, tmp0);
3761     out1 = __msa_aver_s_b(out1, tmp1);
3762     out2 = __msa_aver_s_b(out2, tmp2);
3763     out3 = __msa_aver_s_b(out3, tmp3);
3764     XORI_B4_128_SB(out0, out1, out2, out3);
3765     ST8x8_UB(out0, out1, out2, out3, dst, stride);
3766 }
3767
3768 void ff_put_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
3769                                 ptrdiff_t stride)
3770 {
3771     int16_t filt_const0 = 0xfb01;
3772     int16_t filt_const1 = 0x1414;
3773     int16_t filt_const2 = 0x1fb;
3774     v16u8 out;
3775     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
3776     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
3777     v16i8 src87_r, src2110, src4332, src6554, src8776, filt0, filt1, filt2;
3778     v8i16 out10, out32;
3779
3780     filt0 = (v16i8) __msa_fill_h(filt_const0);
3781     filt1 = (v16i8) __msa_fill_h(filt_const1);
3782     filt2 = (v16i8) __msa_fill_h(filt_const2);
3783
3784     src -= (stride * 2);
3785
3786     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3787     src += (5 * stride);
3788     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3789                src32_r, src43_r);
3790     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
3791     XORI_B2_128_SB(src2110, src4332);
3792     LD_SB4(src, stride, src5, src6, src7, src8);
3793     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
3794                src76_r, src87_r);
3795     ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
3796     XORI_B2_128_SB(src6554, src8776);
3797     out10 = AVC_DOT_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
3798     out32 = AVC_DOT_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
3799     SRARI_H2_SH(out10, out32, 5);
3800     SAT_SH2_SH(out10, out32, 7);
3801     out = PCKEV_XORI128_UB(out10, out32);
3802     src32_r = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
3803     src54_r = (v16i8) __msa_insve_w((v4i32) src4, 1, (v4i32) src5);
3804     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
3805     out = __msa_aver_u_b(out, (v16u8) src32_r);
3806     ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
3807 }
3808
3809 void ff_put_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
3810                                 ptrdiff_t stride)
3811 {
3812     int16_t filt_const0 = 0xfb01;
3813     int16_t filt_const1 = 0x1414;
3814     int16_t filt_const2 = 0x1fb;
3815     v16u8 out;
3816     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8;
3817     v16i8 src10_r, src32_r, src54_r, src76_r, src21_r, src43_r, src65_r;
3818     v16i8 src87_r, src2110, src4332, src6554, src8776, filt0, filt1, filt2;
3819     v8i16 out10, out32;
3820
3821     filt0 = (v16i8) __msa_fill_h(filt_const0);
3822     filt1 = (v16i8) __msa_fill_h(filt_const1);
3823     filt2 = (v16i8) __msa_fill_h(filt_const2);
3824
3825     src -= (stride * 2);
3826
3827     LD_SB5(src, stride, src0, src1, src2, src3, src4);
3828     src += (5 * stride);
3829     ILVR_B4_SB(src1, src0, src2, src1, src3, src2, src4, src3, src10_r, src21_r,
3830                src32_r, src43_r);
3831     ILVR_D2_SB(src21_r, src10_r, src43_r, src32_r, src2110, src4332);
3832     XORI_B2_128_SB(src2110, src4332);
3833     LD_SB4(src, stride, src5, src6, src7, src8);
3834     ILVR_B4_SB(src5, src4, src6, src5, src7, src6, src8, src7, src54_r, src65_r,
3835                src76_r, src87_r);
3836     ILVR_D2_SB(src65_r, src54_r, src87_r, src76_r, src6554, src8776);
3837     XORI_B2_128_SB(src6554, src8776);
3838     out10 = AVC_DOT_SH3_SH(src2110, src4332, src6554, filt0, filt1, filt2);
3839     out32 = AVC_DOT_SH3_SH(src4332, src6554, src8776, filt0, filt1, filt2);
3840     SRARI_H2_SH(out10, out32, 5);
3841     SAT_SH2_SH(out10, out32, 7);
3842     out = PCKEV_XORI128_UB(out10, out32);
3843     src32_r = (v16i8) __msa_insve_w((v4i32) src3, 1, (v4i32) src4);
3844     src54_r = (v16i8) __msa_insve_w((v4i32) src5, 1, (v4i32) src6);
3845     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
3846     out = __msa_aver_u_b(out, (v16u8) src32_r);
3847     ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
3848 }
3849
3850 void ff_put_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
3851                                  ptrdiff_t stride)
3852 {
3853     avc_luma_hv_qrt_16w_msa(src - 2,
3854                             src - (stride * 2), stride, dst, stride, 16);
3855 }
3856
3857 void ff_put_h264_qpel16_mc31_msa(uint8_t *dst, const uint8_t *src,
3858                                  ptrdiff_t stride)
3859 {
3860     avc_luma_hv_qrt_16w_msa(src - 2,
3861                             src - (stride * 2) +
3862                             sizeof(uint8_t), stride, dst, stride, 16);
3863 }
3864
3865 void ff_put_h264_qpel16_mc13_msa(uint8_t *dst, const uint8_t *src,
3866                                  ptrdiff_t stride)
3867 {
3868     avc_luma_hv_qrt_16w_msa(src + stride - 2,
3869                             src - (stride * 2), stride, dst, stride, 16);
3870 }
3871
3872 void ff_put_h264_qpel16_mc33_msa(uint8_t *dst, const uint8_t *src,
3873                                  ptrdiff_t stride)
3874 {
3875     avc_luma_hv_qrt_16w_msa(src + stride - 2,
3876                             src - (stride * 2) +
3877                             sizeof(uint8_t), stride, dst, stride, 16);
3878 }
3879
3880 void ff_put_h264_qpel8_mc11_msa(uint8_t *dst, const uint8_t *src,
3881                                 ptrdiff_t stride)
3882 {
3883     avc_luma_hv_qrt_8w_msa(src - 2, src - (stride * 2), stride, dst, stride, 8);
3884 }
3885
3886 void ff_put_h264_qpel8_mc31_msa(uint8_t *dst, const uint8_t *src,
3887                                 ptrdiff_t stride)
3888 {
3889     avc_luma_hv_qrt_8w_msa(src - 2,
3890                            src - (stride * 2) +
3891                            sizeof(uint8_t), stride, dst, stride, 8);
3892 }
3893
3894 void ff_put_h264_qpel8_mc13_msa(uint8_t *dst, const uint8_t *src,
3895                                 ptrdiff_t stride)
3896 {
3897     avc_luma_hv_qrt_8w_msa(src + stride - 2,
3898                            src - (stride * 2), stride, dst, stride, 8);
3899 }
3900
3901 void ff_put_h264_qpel8_mc33_msa(uint8_t *dst, const uint8_t *src,
3902                                 ptrdiff_t stride)
3903 {
3904     avc_luma_hv_qrt_8w_msa(src + stride - 2,
3905                            src - (stride * 2) +
3906                            sizeof(uint8_t), stride, dst, stride, 8);
3907 }
3908
3909
3910 void ff_put_h264_qpel4_mc11_msa(uint8_t *dst, const uint8_t *src,
3911                                 ptrdiff_t stride)
3912 {
3913     avc_luma_hv_qrt_4w_msa(src - 2, src - (stride * 2), stride, dst, stride, 4);
3914 }
3915
3916 void ff_put_h264_qpel4_mc31_msa(uint8_t *dst, const uint8_t *src,
3917                                 ptrdiff_t stride)
3918 {
3919     avc_luma_hv_qrt_4w_msa(src - 2,
3920                            src - (stride * 2) +
3921                            sizeof(uint8_t), stride, dst, stride, 4);
3922 }
3923
3924 void ff_put_h264_qpel4_mc13_msa(uint8_t *dst, const uint8_t *src,
3925                                 ptrdiff_t stride)
3926 {
3927     avc_luma_hv_qrt_4w_msa(src + stride - 2,
3928                            src - (stride * 2), stride, dst, stride, 4);
3929 }
3930
3931 void ff_put_h264_qpel4_mc33_msa(uint8_t *dst, const uint8_t *src,
3932                                 ptrdiff_t stride)
3933 {
3934     avc_luma_hv_qrt_4w_msa(src + stride - 2,
3935                            src - (stride * 2) +
3936                            sizeof(uint8_t), stride, dst, stride, 4);
3937 }
3938
3939 void ff_put_h264_qpel16_mc21_msa(uint8_t *dst, const uint8_t *src,
3940                                  ptrdiff_t stride)
3941 {
3942     avc_luma_midv_qrt_16w_msa(src - (2 * stride) - 2,
3943                               stride, dst, stride, 16, 0);
3944 }
3945
3946 void ff_put_h264_qpel16_mc23_msa(uint8_t *dst, const uint8_t *src,
3947                                  ptrdiff_t stride)
3948 {
3949     avc_luma_midv_qrt_16w_msa(src - (2 * stride) - 2,
3950                               stride, dst, stride, 16, 1);
3951 }
3952
3953 void ff_put_h264_qpel8_mc21_msa(uint8_t *dst, const uint8_t *src,
3954                                 ptrdiff_t stride)
3955 {
3956     avc_luma_midv_qrt_8w_msa(src - (2 * stride) - 2, stride, dst, stride, 8, 0);
3957 }
3958
3959 void ff_put_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
3960                                 ptrdiff_t stride)
3961 {
3962     avc_luma_midv_qrt_8w_msa(src - (2 * stride) - 2, stride, dst, stride, 8, 1);
3963 }
3964
3965 void ff_put_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
3966                                 ptrdiff_t stride)
3967 {
3968     avc_luma_midv_qrt_4w_msa(src - (2 * stride) - 2, stride, dst, stride, 4, 0);
3969 }
3970
3971 void ff_put_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
3972                                 ptrdiff_t stride)
3973 {
3974     avc_luma_midv_qrt_4w_msa(src - (2 * stride) - 2, stride, dst, stride, 4, 1);
3975 }
3976
3977 void ff_put_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
3978                                  ptrdiff_t stride)
3979 {
3980     avc_luma_vt_16w_msa(src - (stride * 2), stride, dst, stride, 16);
3981 }
3982
3983 void ff_put_h264_qpel8_mc02_msa(uint8_t *dst, const uint8_t *src,
3984                                 ptrdiff_t stride)
3985 {
3986     avc_luma_vt_8w_msa(src - (stride * 2), stride, dst, stride, 8);
3987 }
3988
3989 void ff_put_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
3990                                 ptrdiff_t stride)
3991 {
3992     avc_luma_vt_4w_msa(src - (stride * 2), stride, dst, stride, 4);
3993 }
3994
3995 void ff_put_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
3996                                  ptrdiff_t stride)
3997 {
3998     avc_luma_midh_qrt_16w_msa(src - (2 * stride) - 2,
3999                               stride, dst, stride, 16, 0);
4000 }
4001
4002 void ff_put_h264_qpel16_mc32_msa(uint8_t *dst, const uint8_t *src,
4003                                  ptrdiff_t stride)
4004 {
4005     avc_luma_midh_qrt_16w_msa(src - (2 * stride) - 2,
4006                               stride, dst, stride, 16, 1);
4007 }
4008
4009 void ff_put_h264_qpel8_mc12_msa(uint8_t *dst, const uint8_t *src,
4010                                 ptrdiff_t stride)
4011 {
4012     avc_luma_midh_qrt_8w_msa(src - (2 * stride) - 2, stride, dst, stride, 8, 0);
4013 }
4014
4015 void ff_put_h264_qpel8_mc32_msa(uint8_t *dst, const uint8_t *src,
4016                                 ptrdiff_t stride)
4017 {
4018     avc_luma_midh_qrt_8w_msa(src - (2 * stride) - 2, stride, dst, stride, 8, 1);
4019 }
4020
4021 void ff_put_h264_qpel4_mc12_msa(uint8_t *dst, const uint8_t *src,
4022                                 ptrdiff_t stride)
4023 {
4024     avc_luma_midh_qrt_4w_msa(src - (2 * stride) - 2, stride, dst, stride, 4, 0);
4025 }
4026
4027 void ff_put_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
4028                                 ptrdiff_t stride)
4029 {
4030     avc_luma_midh_qrt_4w_msa(src - (2 * stride) - 2, stride, dst, stride, 4, 1);
4031 }
4032
4033 void ff_put_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
4034                                  ptrdiff_t stride)
4035 {
4036     avc_luma_mid_16w_msa(src - (2 * stride) - 2, stride, dst, stride, 16);
4037 }
4038
4039 void ff_put_h264_qpel8_mc22_msa(uint8_t *dst, const uint8_t *src,
4040                                 ptrdiff_t stride)
4041 {
4042     avc_luma_mid_8w_msa(src - (2 * stride) - 2, stride, dst, stride, 8);
4043 }
4044
4045 void ff_put_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
4046                                 ptrdiff_t stride)
4047 {
4048     avc_luma_mid_4w_msa(src - (2 * stride) - 2, stride, dst, stride, 4);
4049 }
4050
4051 void ff_avg_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
4052                                  ptrdiff_t stride)
4053 {
4054     avc_luma_hz_qrt_and_aver_dst_16x16_msa(src - 2, stride, dst, stride, 0);
4055 }
4056
4057 void ff_avg_h264_qpel16_mc30_msa(uint8_t *dst, const uint8_t *src,
4058                                  ptrdiff_t stride)
4059 {
4060     avc_luma_hz_qrt_and_aver_dst_16x16_msa(src - 2, stride, dst, stride, 1);
4061 }
4062
4063 void ff_avg_h264_qpel8_mc10_msa(uint8_t *dst, const uint8_t *src,
4064                                 ptrdiff_t stride)
4065 {
4066     avc_luma_hz_qrt_and_aver_dst_8x8_msa(src - 2, stride, dst, stride, 0);
4067 }
4068
4069 void ff_avg_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
4070                                 ptrdiff_t stride)
4071 {
4072     avc_luma_hz_qrt_and_aver_dst_8x8_msa(src - 2, stride, dst, stride, 1);
4073 }
4074
4075 void ff_avg_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
4076                                 ptrdiff_t stride)
4077 {
4078     avc_luma_hz_qrt_and_aver_dst_4x4_msa(src - 2, stride, dst, stride, 0);
4079 }
4080
4081 void ff_avg_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
4082                                 ptrdiff_t stride)
4083 {
4084     avc_luma_hz_qrt_and_aver_dst_4x4_msa(src - 2, stride, dst, stride, 1);
4085 }
4086
4087 void ff_avg_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
4088                                  ptrdiff_t stride)
4089 {
4090     avc_luma_hz_and_aver_dst_16x16_msa(src - 2, stride, dst, stride);
4091 }
4092
4093 void ff_avg_h264_qpel8_mc20_msa(uint8_t *dst, const uint8_t *src,
4094                                 ptrdiff_t stride)
4095 {
4096     avc_luma_hz_and_aver_dst_8x8_msa(src - 2, stride, dst, stride);
4097 }
4098
4099 void ff_avg_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
4100                                 ptrdiff_t stride)
4101 {
4102     avc_luma_hz_and_aver_dst_4x4_msa(src - 2, stride, dst, stride);
4103 }
4104
4105 void ff_avg_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
4106                                  ptrdiff_t stride)
4107 {
4108     avc_luma_vt_qrt_and_aver_dst_16x16_msa(src - (stride * 2),
4109                                            stride, dst, stride, 0);
4110 }
4111
4112 void ff_avg_h264_qpel16_mc03_msa(uint8_t *dst, const uint8_t *src,
4113                                  ptrdiff_t stride)
4114 {
4115     avc_luma_vt_qrt_and_aver_dst_16x16_msa(src - (stride * 2),
4116                                            stride, dst, stride, 1);
4117 }
4118
4119 void ff_avg_h264_qpel8_mc01_msa(uint8_t *dst, const uint8_t *src,
4120                                 ptrdiff_t stride)
4121 {
4122     avc_luma_vt_qrt_and_aver_dst_8x8_msa(src - (stride * 2),
4123                                          stride, dst, stride, 0);
4124 }
4125
4126 void ff_avg_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
4127                                 ptrdiff_t stride)
4128 {
4129     avc_luma_vt_qrt_and_aver_dst_8x8_msa(src - (stride * 2),
4130                                          stride, dst, stride, 1);
4131 }
4132
4133 void ff_avg_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
4134                                 ptrdiff_t stride)
4135 {
4136     avc_luma_vt_qrt_and_aver_dst_4x4_msa(src - (stride * 2),
4137                                          stride, dst, stride, 0);
4138 }
4139
4140 void ff_avg_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
4141                                 ptrdiff_t stride)
4142 {
4143     avc_luma_vt_qrt_and_aver_dst_4x4_msa(src - (stride * 2),
4144                                          stride, dst, stride, 1);
4145 }
4146
4147 void ff_avg_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
4148                                  ptrdiff_t stride)
4149 {
4150     avc_luma_hv_qrt_and_aver_dst_16x16_msa(src - 2,
4151                                            src - (stride * 2),
4152                                            stride, dst, stride);
4153 }
4154
4155 void ff_avg_h264_qpel16_mc31_msa(uint8_t *dst, const uint8_t *src,
4156                                  ptrdiff_t stride)
4157 {
4158     avc_luma_hv_qrt_and_aver_dst_16x16_msa(src - 2,
4159                                            src - (stride * 2) +
4160                                            sizeof(uint8_t), stride,
4161                                            dst, stride);
4162 }
4163
4164 void ff_avg_h264_qpel16_mc13_msa(uint8_t *dst, const uint8_t *src,
4165                                  ptrdiff_t stride)
4166 {
4167     avc_luma_hv_qrt_and_aver_dst_16x16_msa(src + stride - 2,
4168                                            src - (stride * 2),
4169                                            stride, dst, stride);
4170 }
4171
4172 void ff_avg_h264_qpel16_mc33_msa(uint8_t *dst, const uint8_t *src,
4173                                  ptrdiff_t stride)
4174 {
4175     avc_luma_hv_qrt_and_aver_dst_16x16_msa(src + stride - 2,
4176                                            src - (stride * 2) +
4177                                            sizeof(uint8_t), stride,
4178                                            dst, stride);
4179 }
4180
4181 void ff_avg_h264_qpel8_mc11_msa(uint8_t *dst, const uint8_t *src,
4182                                 ptrdiff_t stride)
4183 {
4184     avc_luma_hv_qrt_and_aver_dst_8x8_msa(src - 2,
4185                                          src - (stride * 2),
4186                                          stride, dst, stride);
4187 }
4188
4189 void ff_avg_h264_qpel8_mc31_msa(uint8_t *dst, const uint8_t *src,
4190                                 ptrdiff_t stride)
4191 {
4192     avc_luma_hv_qrt_and_aver_dst_8x8_msa(src - 2,
4193                                          src - (stride * 2) +
4194                                          sizeof(uint8_t), stride, dst, stride);
4195 }
4196
4197 void ff_avg_h264_qpel8_mc13_msa(uint8_t *dst, const uint8_t *src,
4198                                 ptrdiff_t stride)
4199 {
4200     avc_luma_hv_qrt_and_aver_dst_8x8_msa(src + stride - 2,
4201                                          src - (stride * 2),
4202                                          stride, dst, stride);
4203 }
4204
4205 void ff_avg_h264_qpel8_mc33_msa(uint8_t *dst, const uint8_t *src,
4206                                 ptrdiff_t stride)
4207 {
4208     avc_luma_hv_qrt_and_aver_dst_8x8_msa(src + stride - 2,
4209                                          src - (stride * 2) +
4210                                          sizeof(uint8_t), stride, dst, stride);
4211 }
4212
4213
4214 void ff_avg_h264_qpel4_mc11_msa(uint8_t *dst, const uint8_t *src,
4215                                 ptrdiff_t stride)
4216 {
4217     avc_luma_hv_qrt_and_aver_dst_4x4_msa(src - 2,
4218                                          src - (stride * 2),
4219                                          stride, dst, stride);
4220 }
4221
4222 void ff_avg_h264_qpel4_mc31_msa(uint8_t *dst, const uint8_t *src,
4223                                 ptrdiff_t stride)
4224 {
4225     avc_luma_hv_qrt_and_aver_dst_4x4_msa(src - 2,
4226                                          src - (stride * 2) +
4227                                          sizeof(uint8_t), stride, dst, stride);
4228 }
4229
4230 void ff_avg_h264_qpel4_mc13_msa(uint8_t *dst, const uint8_t *src,
4231                                 ptrdiff_t stride)
4232 {
4233     avc_luma_hv_qrt_and_aver_dst_4x4_msa(src + stride - 2,
4234                                          src - (stride * 2),
4235                                          stride, dst, stride);
4236 }
4237
4238 void ff_avg_h264_qpel4_mc33_msa(uint8_t *dst, const uint8_t *src,
4239                                 ptrdiff_t stride)
4240 {
4241     avc_luma_hv_qrt_and_aver_dst_4x4_msa(src + stride - 2,
4242                                          src - (stride * 2) +
4243                                          sizeof(uint8_t), stride, dst, stride);
4244 }
4245
4246 void ff_avg_h264_qpel16_mc21_msa(uint8_t *dst, const uint8_t *src,
4247                                  ptrdiff_t stride)
4248 {
4249     avc_luma_midv_qrt_and_aver_dst_16w_msa(src - (2 * stride) - 2,
4250                                            stride, dst, stride, 16, 0);
4251 }
4252
4253 void ff_avg_h264_qpel16_mc23_msa(uint8_t *dst, const uint8_t *src,
4254                                  ptrdiff_t stride)
4255 {
4256     avc_luma_midv_qrt_and_aver_dst_16w_msa(src - (2 * stride) - 2,
4257                                            stride, dst, stride, 16, 1);
4258 }
4259
4260 void ff_avg_h264_qpel8_mc21_msa(uint8_t *dst, const uint8_t *src,
4261                                 ptrdiff_t stride)
4262 {
4263     avc_luma_midv_qrt_and_aver_dst_8w_msa(src - (2 * stride) - 2,
4264                                           stride, dst, stride, 8, 0);
4265 }
4266
4267 void ff_avg_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
4268                                 ptrdiff_t stride)
4269 {
4270     avc_luma_midv_qrt_and_aver_dst_8w_msa(src - (2 * stride) - 2,
4271                                           stride, dst, stride, 8, 1);
4272 }
4273
4274 void ff_avg_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
4275                                 ptrdiff_t stride)
4276 {
4277     avc_luma_midv_qrt_and_aver_dst_4w_msa(src - (2 * stride) - 2,
4278                                           stride, dst, stride, 4, 0);
4279 }
4280
4281 void ff_avg_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
4282                                 ptrdiff_t stride)
4283 {
4284     avc_luma_midv_qrt_and_aver_dst_4w_msa(src - (2 * stride) - 2,
4285                                           stride, dst, stride, 4, 1);
4286 }
4287
4288 void ff_avg_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
4289                                  ptrdiff_t stride)
4290 {
4291     avc_luma_vt_and_aver_dst_16x16_msa(src - (stride * 2), stride, dst, stride);
4292 }
4293
4294 void ff_avg_h264_qpel8_mc02_msa(uint8_t *dst, const uint8_t *src,
4295                                 ptrdiff_t stride)
4296 {
4297     avc_luma_vt_and_aver_dst_8x8_msa(src - (stride * 2), stride, dst, stride);
4298 }
4299
4300 void ff_avg_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
4301                                 ptrdiff_t stride)
4302 {
4303     avc_luma_vt_and_aver_dst_4x4_msa(src - (stride * 2), stride, dst, stride);
4304 }
4305
4306 void ff_avg_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
4307                                  ptrdiff_t stride)
4308 {
4309     avc_luma_midh_qrt_and_aver_dst_16w_msa(src - (2 * stride) - 2,
4310                                            stride, dst, stride, 16, 0);
4311 }
4312
4313 void ff_avg_h264_qpel16_mc32_msa(uint8_t *dst, const uint8_t *src,
4314                                  ptrdiff_t stride)
4315 {
4316     avc_luma_midh_qrt_and_aver_dst_16w_msa(src - (2 * stride) - 2,
4317                                            stride, dst, stride, 16, 1);
4318 }
4319
4320 void ff_avg_h264_qpel8_mc12_msa(uint8_t *dst, const uint8_t *src,
4321                                 ptrdiff_t stride)
4322 {
4323     avc_luma_midh_qrt_and_aver_dst_8w_msa(src - (2 * stride) - 2,
4324                                           stride, dst, stride, 8, 0);
4325 }
4326
4327 void ff_avg_h264_qpel8_mc32_msa(uint8_t *dst, const uint8_t *src,
4328                                 ptrdiff_t stride)
4329 {
4330     avc_luma_midh_qrt_and_aver_dst_8w_msa(src - (2 * stride) - 2,
4331                                           stride, dst, stride, 8, 1);
4332 }
4333
4334 void ff_avg_h264_qpel4_mc12_msa(uint8_t *dst, const uint8_t *src,
4335                                 ptrdiff_t stride)
4336 {
4337     avc_luma_midh_qrt_and_aver_dst_4w_msa(src - (2 * stride) - 2,
4338                                           stride, dst, stride, 4, 0);
4339 }
4340
4341 void ff_avg_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
4342                                 ptrdiff_t stride)
4343 {
4344     avc_luma_midh_qrt_and_aver_dst_4w_msa(src - (2 * stride) - 2,
4345                                           stride, dst, stride, 4, 1);
4346 }
4347
4348 void ff_avg_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
4349                                  ptrdiff_t stride)
4350 {
4351     avc_luma_mid_and_aver_dst_16x16_msa(src - (2 * stride) - 2,
4352                                         stride, dst, stride);
4353 }
4354
4355 void ff_avg_h264_qpel8_mc22_msa(uint8_t *dst, const uint8_t *src,
4356                                 ptrdiff_t stride)
4357 {
4358     avc_luma_mid_and_aver_dst_8w_msa(src - (2 * stride) - 2,
4359                                      stride, dst, stride, 8);
4360 }
4361
4362 void ff_avg_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
4363                                 ptrdiff_t stride)
4364 {
4365     avc_luma_mid_and_aver_dst_4x4_msa(src - (2 * stride) - 2,
4366                                       stride, dst, stride);
4367 }