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