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