FFmpeg
vp9_mc_lsx.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 Loongson Technology Corporation Limited
3  * Contributed by Hao Chen <chenhao@loongson.cn>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavcodec/vp9dsp.h"
24 #include "vp9dsp_loongarch.h"
25 
26 static const uint8_t mc_filt_mask_arr[16 * 3] = {
27  /* 8 width cases */
28  0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
29  /* 4 width cases */
30  0, 1, 1, 2, 2, 3, 3, 4, 16, 17, 17, 18, 18, 19, 19, 20,
31  /* 4 width cases */
32  8, 9, 9, 10, 10, 11, 11, 12, 24, 25, 25, 26, 26, 27, 27, 28
33 };
34 
35 
36 #define HORIZ_8TAP_4WID_4VECS_FILT(_src0, _src1, _src2, _src3, \
37  _mask0, _mask1, _mask2, _mask3, \
38  _filter0, _filter1, _filter2, _filter3, \
39  _out0, _out1) \
40 { \
41  __m128i _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5, _tmp6, _tmp7; \
42  __m128i _reg0, _reg1, _reg2, _reg3; \
43  \
44  DUP2_ARG3(__lsx_vshuf_b, _src1, _src0, _mask0, _src3, _src2, _mask0, \
45  _tmp0, _tmp1); \
46  DUP2_ARG2(__lsx_vdp2_h_b, _tmp0, _filter0, _tmp1, _filter0, _reg0, _reg1); \
47  DUP2_ARG3(__lsx_vshuf_b, _src1, _src0, _mask1, _src3, _src2, _mask1, \
48  _tmp2, _tmp3); \
49  DUP2_ARG3(__lsx_vdp2add_h_b, _reg0, _tmp2, _filter1, _reg1, _tmp3, \
50  _filter1, _reg0, _reg1); \
51  DUP2_ARG3(__lsx_vshuf_b, _src1, _src0, _mask2, _src3, _src2, _mask2, \
52  _tmp4, _tmp5); \
53  DUP2_ARG2(__lsx_vdp2_h_b, _tmp4, _filter2, _tmp5, _filter2, _reg2, _reg3); \
54  DUP2_ARG3(__lsx_vshuf_b, _src1, _src0, _mask3, _src3, _src2, _mask3, \
55  _tmp6, _tmp7); \
56  DUP2_ARG3(__lsx_vdp2add_h_b, _reg2, _tmp6, _filter3, _reg3, _tmp7, \
57  _filter3, _reg2, _reg3); \
58  DUP2_ARG2(__lsx_vsadd_h, _reg0, _reg2, _reg1, _reg3, _out0, _out1); \
59 }
60 
61 #define HORIZ_8TAP_8WID_4VECS_FILT(_src0, _src1, _src2, _src3, \
62  _mask0, _mask1, _mask2, _mask3, \
63  _filter0, _filter1, _filter2, _filter3, \
64  _out0, _out1, _out2, _out3) \
65 { \
66  __m128i _tmp0, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5, _tmp6, _tmp7; \
67  __m128i _reg0, _reg1, _reg2, _reg3, _reg4, _reg5, _reg6, _reg7; \
68  \
69  DUP4_ARG3(__lsx_vshuf_b, _src0, _src0, _mask0, _src1, _src1, _mask0, _src2,\
70  _src2, _mask0, _src3, _src3, _mask0, _tmp0, _tmp1, _tmp2, _tmp3);\
71  DUP4_ARG2(__lsx_vdp2_h_b, _tmp0, _filter0, _tmp1, _filter0, _tmp2, \
72  _filter0, _tmp3, _filter0, _reg0, _reg1, _reg2, _reg3); \
73  DUP4_ARG3(__lsx_vshuf_b, _src0, _src0, _mask2, _src1, _src1, _mask2, _src2,\
74  _src2, _mask2, _src3, _src3, _mask2, _tmp0, _tmp1, _tmp2, _tmp3);\
75  DUP4_ARG2(__lsx_vdp2_h_b, _tmp0, _filter2, _tmp1, _filter2, _tmp2, \
76  _filter2, _tmp3, _filter2, _reg4, _reg5, _reg6, _reg7); \
77  DUP4_ARG3(__lsx_vshuf_b, _src0, _src0, _mask1, _src1, _src1, _mask1, _src2,\
78  _src2, _mask1, _src3, _src3, _mask1, _tmp4, _tmp5, _tmp6, _tmp7);\
79  DUP4_ARG3(__lsx_vdp2add_h_b, _reg0, _tmp4, _filter1, _reg1, _tmp5, \
80  _filter1, _reg2, _tmp6, _filter1, _reg3, _tmp7, _filter1, _reg0, \
81  _reg1, _reg2, _reg3); \
82  DUP4_ARG3(__lsx_vshuf_b, _src0, _src0, _mask3, _src1, _src1, _mask3, _src2,\
83  _src2, _mask3, _src3, _src3, _mask3, _tmp4, _tmp5, _tmp6, _tmp7);\
84  DUP4_ARG3(__lsx_vdp2add_h_b, _reg4, _tmp4, _filter3, _reg5, _tmp5, \
85  _filter3, _reg6, _tmp6, _filter3, _reg7, _tmp7, _filter3, _reg4, \
86  _reg5, _reg6, _reg7); \
87  DUP4_ARG2(__lsx_vsadd_h, _reg0, _reg4, _reg1, _reg5, _reg2, _reg6, _reg3, \
88  _reg7, _out0, _out1, _out2, _out3); \
89 }
90 
91 #define FILT_8TAP_DPADD_S_H(_reg0, _reg1, _reg2, _reg3, \
92  _filter0, _filter1, _filter2, _filter3) \
93 ( { \
94  __m128i _vec0, _vec1; \
95  \
96  _vec0 = __lsx_vdp2_h_b(_reg0, _filter0); \
97  _vec0 = __lsx_vdp2add_h_b(_vec0, _reg1, _filter1); \
98  _vec1 = __lsx_vdp2_h_b(_reg2, _filter2); \
99  _vec1 = __lsx_vdp2add_h_b(_vec1, _reg3, _filter3); \
100  _vec0 = __lsx_vsadd_h(_vec0, _vec1); \
101  \
102  _vec0; \
103 } )
104 
105 #define HORIZ_8TAP_FILT(_src0, _src1, _mask0, _mask1, _mask2, _mask3, \
106  _filt_h0, _filt_h1, _filt_h2, _filt_h3) \
107 ( { \
108  __m128i _tmp0, _tmp1, _tmp2, _tmp3; \
109  __m128i _out; \
110  \
111  DUP4_ARG3(__lsx_vshuf_b, _src1, _src0, _mask0, _src1, _src0, _mask1, _src1,\
112  _src0, _mask2, _src1, _src0, _mask3, _tmp0, _tmp1, _tmp2, _tmp3);\
113  _out = FILT_8TAP_DPADD_S_H(_tmp0, _tmp1, _tmp2, _tmp3, _filt_h0, _filt_h1, \
114  _filt_h2, _filt_h3); \
115  _out = __lsx_vsrari_h(_out, 7); \
116  _out = __lsx_vsat_h(_out, 7); \
117  \
118  _out; \
119 } )
120 
121 #define LSX_LD_4(_src, _stride, _src0, _src1, _src2, _src3) \
122 { \
123  _src0 = __lsx_vld(_src, 0); \
124  _src += _stride; \
125  _src1 = __lsx_vld(_src, 0); \
126  _src += _stride; \
127  _src2 = __lsx_vld(_src, 0); \
128  _src += _stride; \
129  _src3 = __lsx_vld(_src, 0); \
130 }
131 
132 static void common_hz_8t_4x4_lsx(const uint8_t *src, int32_t src_stride,
133  uint8_t *dst, int32_t dst_stride,
134  const int8_t *filter)
135 {
136  __m128i src0, src1, src2, src3;
137  __m128i filter0, filter1, filter2, filter3;
138  __m128i mask0, mask1, mask2, mask3;
139  __m128i out, out0, out1;
140 
141  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
142  src -= 3;
143  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
144  filter0, filter1, filter2, filter3);
145  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
146  mask3 = __lsx_vaddi_bu(mask0, 6);
147 
148  LSX_LD_4(src, src_stride, src0, src1, src2, src3);
149  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
150  src0, src1, src2, src3);
151  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
152  mask3, filter0, filter1, filter2, filter3, out0, out1);
153  out = __lsx_vssrarni_b_h(out1, out0, 7);
154  out = __lsx_vxori_b(out, 128);
155  __lsx_vstelm_w(out, dst, 0, 0);
156  dst += dst_stride;
157  __lsx_vstelm_w(out, dst, 0, 1);
158  dst += dst_stride;
159  __lsx_vstelm_w(out, dst, 0, 2);
160  dst += dst_stride;
161  __lsx_vstelm_w(out, dst, 0, 3);
162 }
163 
164 static void common_hz_8t_4x8_lsx(const uint8_t *src, int32_t src_stride,
165  uint8_t *dst, int32_t dst_stride,
166  const int8_t *filter)
167 {
168  int32_t src_stride2 = src_stride << 1;
169  int32_t src_stride3 = src_stride + src_stride2;
170  int32_t src_stride4 = src_stride2 << 1;
171  __m128i src0, src1, src2, src3;
172  __m128i filter0, filter1, filter2, filter3;
173  __m128i mask0, mask1, mask2, mask3;
174  __m128i out0, out1, out2, out3;
175  uint8_t *_src = (uint8_t*)src - 3;
176 
177  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
178  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
179  mask3 = __lsx_vaddi_bu(mask0, 6);
180  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
181  filter0, filter1, filter2, filter3);
182 
183  src0 = __lsx_vld(_src, 0);
184  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
185  src3 = __lsx_vldx(_src, src_stride3);
186  _src += src_stride4;
187  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
188  src0, src1, src2, src3);
189  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
190  mask3, filter0, filter1, filter2, filter3, out0, out1);
191  src0 = __lsx_vld(_src, 0);
192  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
193  src3 = __lsx_vldx(_src, src_stride3);
194  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
195  src0, src1, src2, src3);
196  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
197  mask3, filter0, filter1, filter2, filter3, out2, out3);
198  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
199  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
200  __lsx_vstelm_w(out0, dst, 0, 0);
201  dst += dst_stride;
202  __lsx_vstelm_w(out0, dst, 0, 1);
203  dst += dst_stride;
204  __lsx_vstelm_w(out0, dst, 0, 2);
205  dst += dst_stride;
206  __lsx_vstelm_w(out0, dst, 0, 3);
207  dst += dst_stride;
208  __lsx_vstelm_w(out1, dst, 0, 0);
209  dst += dst_stride;
210  __lsx_vstelm_w(out1, dst, 0, 1);
211  dst += dst_stride;
212  __lsx_vstelm_w(out1, dst, 0, 2);
213  dst += dst_stride;
214  __lsx_vstelm_w(out1, dst, 0, 3);
215 }
216 
217 static void common_hz_8t_4w_lsx(const uint8_t *src, int32_t src_stride,
218  uint8_t *dst, int32_t dst_stride,
219  const int8_t *filter, int32_t height)
220 {
221  if (height == 4) {
222  common_hz_8t_4x4_lsx(src, src_stride, dst, dst_stride, filter);
223  } else if (height == 8) {
224  common_hz_8t_4x8_lsx(src, src_stride, dst, dst_stride, filter);
225  }
226 }
227 
228 static void common_hz_8t_8x4_lsx(const uint8_t *src, int32_t src_stride,
229  uint8_t *dst, int32_t dst_stride,
230  const int8_t *filter)
231 {
232  __m128i src0, src1, src2, src3;
233  __m128i filter0, filter1, filter2, filter3;
234  __m128i mask0, mask1, mask2, mask3;
235  __m128i out0, out1, out2, out3;
236 
237  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
238  src -= 3;
239  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
240  mask3 = __lsx_vaddi_bu(mask0, 6);
241  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
242  filter0, filter1, filter2, filter3);
243 
244  LSX_LD_4(src, src_stride, src0, src1, src2, src3);
245  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
246  src0, src1, src2, src3);
247  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
248  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
249  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
250  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
251  __lsx_vstelm_d(out0, dst, 0, 0);
252  dst += dst_stride;
253  __lsx_vstelm_d(out0, dst, 0, 1);
254  dst += dst_stride;
255  __lsx_vstelm_d(out1, dst, 0, 0);
256  dst += dst_stride;
257  __lsx_vstelm_d(out1, dst, 0, 1);
258 }
259 
260 static void common_hz_8t_8x8mult_lsx(const uint8_t *src, int32_t src_stride,
261  uint8_t *dst, int32_t dst_stride,
262  const int8_t *filter, int32_t height)
263 {
264  uint32_t loop_cnt = height >> 2;
265  int32_t src_stride2 = src_stride << 1;
266  int32_t src_stride3 = src_stride + src_stride2;
267  int32_t src_stride4 = src_stride2 << 1;
268  __m128i src0, src1, src2, src3;
269  __m128i filter0, filter1, filter2, filter3;
270  __m128i mask0, mask1, mask2, mask3;
271  __m128i out0, out1, out2, out3;
272  uint8_t* _src = (uint8_t*)src - 3;
273 
274  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
275  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
276  mask3 = __lsx_vaddi_bu(mask0, 6);
277  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
278  filter0, filter1, filter2, filter3);
279 
280  for (; loop_cnt--;) {
281  src0 = __lsx_vld(_src, 0);
282  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
283  src3 = __lsx_vldx(_src, src_stride3);
284  _src += src_stride4;
285  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
286  src0, src1, src2, src3);
287  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
288  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
289  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
290  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
291  __lsx_vstelm_d(out0, dst, 0, 0);
292  dst += dst_stride;
293  __lsx_vstelm_d(out0, dst, 0, 1);
294  dst += dst_stride;
295  __lsx_vstelm_d(out1, dst, 0, 0);
296  dst += dst_stride;
297  __lsx_vstelm_d(out1, dst, 0, 1);
298  dst += dst_stride;
299  }
300 }
301 
302 static void common_hz_8t_8w_lsx(const uint8_t *src, int32_t src_stride,
303  uint8_t *dst, int32_t dst_stride,
304  const int8_t *filter, int32_t height)
305 {
306  if (height == 4) {
307  common_hz_8t_8x4_lsx(src, src_stride, dst, dst_stride, filter);
308  } else {
309  common_hz_8t_8x8mult_lsx(src, src_stride, dst, dst_stride,
310  filter, height);
311  }
312 }
313 
314 static void common_hz_8t_16w_lsx(const uint8_t *src, int32_t src_stride,
315  uint8_t *dst, int32_t dst_stride,
316  const int8_t *filter, int32_t height)
317 {
318  uint32_t loop_cnt = height >> 1;
319  int32_t stride = src_stride << 1;
320  __m128i src0, src1, src2, src3;
321  __m128i filter0, filter1, filter2, filter3;
322  __m128i mask0, mask1, mask2, mask3;
323  __m128i out0, out1, out2, out3;
324 
325  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
326  src -= 3;
327  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
328  mask3 = __lsx_vaddi_bu(mask0, 6);
329  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
330  filter0, filter1, filter2, filter3);
331 
332  for (; loop_cnt--;) {
333  const uint8_t* _src = src + src_stride;
334  DUP2_ARG2(__lsx_vld, src, 0, _src, 0, src0, src2);
335  DUP2_ARG2(__lsx_vld, src, 8, _src, 8, src1, src3);
336  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
337  src0, src1, src2, src3);
338  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
339  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
340  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
341  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
342  __lsx_vst(out0, dst, 0);
343  dst += dst_stride;
344  __lsx_vst(out1, dst, 0);
345  dst += dst_stride;
346  src += stride;
347  }
348 }
349 
350 static void common_hz_8t_32w_lsx(const uint8_t *src, int32_t src_stride,
351  uint8_t *dst, int32_t dst_stride,
352  const int8_t *filter, int32_t height)
353 {
354  uint32_t loop_cnt = height >> 1;
355  __m128i src0, src1, src2, src3;
356  __m128i filter0, filter1, filter2, filter3;
357  __m128i mask0, mask1, mask2, mask3;
358  __m128i out0, out1, out2, out3;
359  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
360 
361  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
362  src -= 3;
363  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
364  mask3 = __lsx_vaddi_bu(mask0, 6);
365  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
366  filter0, filter1, filter2, filter3);
367 
368  for (; loop_cnt--;) {
369  DUP2_ARG2(__lsx_vld, src, 0, src, 16, src0, src2);
370  src3 = __lsx_vld(src, 24);
371  src1 = __lsx_vshuf_b(src2, src0, shuff);
372  src += src_stride;
373  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
374  src0, src1, src2, src3);
375  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
376  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
377  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
378  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
379  __lsx_vst(out0, dst, 0);
380  __lsx_vst(out1, dst, 16);
381 
382  DUP2_ARG2(__lsx_vld, src, 0, src, 16, src0, src2);
383  src3 = __lsx_vld(src, 24);
384  src1 = __lsx_vshuf_b(src2, src0, shuff);
385  src += src_stride;
386 
387  dst += dst_stride;
388  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
389  src0, src1, src2, src3);
390  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
391  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
392  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
393  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
394  __lsx_vst(out0, dst, 0);
395  __lsx_vst(out1, dst, 16);
396  dst += dst_stride;
397  }
398 }
399 
400 static void common_hz_8t_64w_lsx(const uint8_t *src, int32_t src_stride,
401  uint8_t *dst, int32_t dst_stride,
402  const int8_t *filter, int32_t height)
403 {
404  int32_t loop_cnt = height;
405  __m128i src0, src1, src2, src3;
406  __m128i filter0, filter1, filter2, filter3;
407  __m128i mask0, mask1, mask2, mask3;
408  __m128i out0, out1, out2, out3;
409  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
410 
411  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
412  src -= 3;
413  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
414  mask3 = __lsx_vaddi_bu(mask0, 6);
415  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
416  filter0, filter1, filter2, filter3);
417 
418  for (; loop_cnt--;) {
419  DUP2_ARG2(__lsx_vld, src, 0, src, 16, src0, src2);
420  src3 = __lsx_vld(src, 24);
421  src1 = __lsx_vshuf_b(src2, src0, shuff);
422  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
423  src0, src1, src2, src3);
424  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
425  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
426  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
427  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
428  __lsx_vst(out0, dst, 0);
429  __lsx_vst(out1, dst, 16);
430 
431  DUP2_ARG2(__lsx_vld, src, 32, src, 48, src0, src2);
432  src3 = __lsx_vld(src, 56);
433  src1 = __lsx_vshuf_b(src2, src0, shuff);
434  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
435  src0, src1, src2, src3);
436  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
437  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
438  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
439  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
440  __lsx_vst(out0, dst, 32);
441  __lsx_vst(out1, dst, 48);
442  src += src_stride;
443  dst += dst_stride;
444  }
445 }
446 
447 static void common_vt_8t_4w_lsx(const uint8_t *src, int32_t src_stride,
448  uint8_t *dst, int32_t dst_stride,
449  const int8_t *filter, int32_t height)
450 {
451  uint32_t loop_cnt = height >> 2;
452  int32_t src_stride2 = src_stride << 1;
453  int32_t src_stride3 = src_stride + src_stride2;
454  int32_t src_stride4 = src_stride2 << 1;
455  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
456  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
457  __m128i reg0, reg1, reg2, reg3, reg4;
458  __m128i filter0, filter1, filter2, filter3;
459  __m128i out0, out1;
460  uint8_t* _src = (uint8_t*)src - src_stride3;
461 
462  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
463  filter0, filter1, filter2, filter3);
464  src0 = __lsx_vld(_src, 0);
465  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
466  src3 = __lsx_vldx(_src, src_stride3);
467  _src += src_stride4;
468  src4 = __lsx_vld(_src, 0);
469  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
470  _src += src_stride3;
471  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1, tmp0,
472  tmp1, tmp2, tmp3);
473  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, tmp4, tmp5);
474  DUP2_ARG2(__lsx_vilvl_d, tmp3, tmp0, tmp4, tmp1, reg0, reg1);
475  reg2 = __lsx_vilvl_d(tmp5, tmp2);
476  DUP2_ARG2(__lsx_vxori_b, reg0, 128, reg1, 128, reg0, reg1);
477  reg2 = __lsx_vxori_b(reg2, 128);
478 
479  for (;loop_cnt--;) {
480  src7 = __lsx_vld(_src, 0);
481  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
482  src10 = __lsx_vldx(_src, src_stride3);
483  _src += src_stride4;
484  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8, src10,
485  src9, tmp0, tmp1, tmp2, tmp3);
486  DUP2_ARG2(__lsx_vilvl_d, tmp1, tmp0, tmp3, tmp2, reg3, reg4);
487  DUP2_ARG2(__lsx_vxori_b, reg3, 128, reg4, 128, reg3, reg4);
488  out0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, reg3, filter0, filter1,
489  filter2, filter3);
490  out1 = FILT_8TAP_DPADD_S_H(reg1, reg2, reg3, reg4, filter0, filter1,
491  filter2, filter3);
492  out0 = __lsx_vssrarni_b_h(out1, out0, 7);
493  out0 = __lsx_vxori_b(out0, 128);
494  __lsx_vstelm_w(out0, dst, 0, 0);
495  dst += dst_stride;
496  __lsx_vstelm_w(out0, dst, 0, 1);
497  dst += dst_stride;
498  __lsx_vstelm_w(out0, dst, 0, 2);
499  dst += dst_stride;
500  __lsx_vstelm_w(out0, dst, 0, 3);
501  dst += dst_stride;
502 
503  reg0 = reg2;
504  reg1 = reg3;
505  reg2 = reg4;
506  src6 = src10;
507  }
508 }
509 
510 static void common_vt_8t_8w_lsx(const uint8_t *src, int32_t src_stride,
511  uint8_t *dst, int32_t dst_stride,
512  const int8_t *filter, int32_t height)
513 {
514  uint32_t loop_cnt = height >> 2;
515  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
516  __m128i tmp0, tmp1, tmp2, tmp3;
517  __m128i reg0, reg1, reg2, reg3, reg4, reg5;
518  __m128i filter0, filter1, filter2, filter3;
519  __m128i out0, out1, out2, out3;
520  int32_t src_stride2 = src_stride << 1;
521  int32_t src_stride3 = src_stride + src_stride2;
522  int32_t src_stride4 = src_stride2 << 1;
523  uint8_t* _src = (uint8_t*)src - src_stride3;
524 
525  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
526  filter0, filter1, filter2, filter3);
527 
528  src0 = __lsx_vld(_src, 0);
529  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
530  src3 = __lsx_vldx(_src, src_stride3);
531  _src += src_stride4;
532  src4 = __lsx_vld(_src, 0);
533  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
534  _src += src_stride3;
535 
536  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
537  src0, src1, src2, src3);
538  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
539  src6 = __lsx_vxori_b(src6, 128);
540  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1,
541  reg0, reg1, reg2, reg3);
542  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, reg4, reg5);
543 
544  for (;loop_cnt--;) {
545  src7 = __lsx_vld(_src, 0);
546  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
547  src10 = __lsx_vldx(_src, src_stride3);
548  _src += src_stride4;
549  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
550  src7, src8, src9, src10);
551  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8, src10,
552  src9, tmp0, tmp1, tmp2, tmp3);
553  out0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, tmp0, filter0, filter1,
554  filter2, filter3);
555  out1 = FILT_8TAP_DPADD_S_H(reg3, reg4, reg5, tmp1, filter0, filter1,
556  filter2, filter3);
557  out2 = FILT_8TAP_DPADD_S_H(reg1, reg2, tmp0, tmp2, filter0, filter1,
558  filter2, filter3);
559  out3 = FILT_8TAP_DPADD_S_H(reg4, reg5, tmp1, tmp3, filter0, filter1,
560  filter2, filter3);
561  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
562  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
563  __lsx_vstelm_d(out0, dst, 0, 0);
564  dst += dst_stride;
565  __lsx_vstelm_d(out0, dst, 0, 1);
566  dst += dst_stride;
567  __lsx_vstelm_d(out1, dst, 0, 0);
568  dst += dst_stride;
569  __lsx_vstelm_d(out1, dst, 0, 1);
570  dst += dst_stride;
571 
572  reg0 = reg2;
573  reg1 = tmp0;
574  reg2 = tmp2;
575  reg3 = reg5;
576  reg4 = tmp1;
577  reg5 = tmp3;
578  src6 = src10;
579  }
580 }
581 
582 static void common_vt_8t_16w_lsx(const uint8_t *src, int32_t src_stride,
583  uint8_t *dst, int32_t dst_stride,
584  const int8_t *filter, int32_t height)
585 {
586  uint32_t loop_cnt = height >> 2;
587  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
588  __m128i filter0, filter1, filter2, filter3;
589  __m128i reg0, reg1, reg2, reg3, reg4, reg5;
590  __m128i reg6, reg7, reg8, reg9, reg10, reg11;
591  __m128i tmp0, tmp1, tmp2, tmp3;
592  int32_t src_stride2 = src_stride << 1;
593  int32_t src_stride3 = src_stride + src_stride2;
594  int32_t src_stride4 = src_stride2 << 1;
595  uint8_t* _src = (uint8_t*)src - src_stride3;
596 
597  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
598  filter0, filter1, filter2, filter3);
599  src0 = __lsx_vld(_src, 0);
600  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
601  src3 = __lsx_vldx(_src, src_stride3);
602  _src += src_stride4;
603  src4 = __lsx_vld(_src, 0);
604  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
605  _src += src_stride3;
606  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
607  src0, src1, src2, src3);
608  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
609  src6 = __lsx_vxori_b(src6, 128);
610  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1,
611  reg0, reg1, reg2, reg3);
612  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, reg4, reg5);
613  DUP4_ARG2(__lsx_vilvh_b, src1, src0, src3, src2, src5, src4, src2, src1,
614  reg6, reg7, reg8, reg9);
615  DUP2_ARG2(__lsx_vilvh_b, src4, src3, src6, src5, reg10, reg11);
616 
617  for (;loop_cnt--;) {
618  src7 = __lsx_vld(_src, 0);
619  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
620  src10 = __lsx_vldx(_src, src_stride3);
621  _src += src_stride4;
622  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
623  src7, src8, src9, src10);
624  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8, src10, src9,
625  src0, src1, src2, src3);
626  DUP4_ARG2(__lsx_vilvh_b, src7, src6, src8, src7, src9, src8, src10, src9,
627  src4, src5, src7, src8);
628  tmp0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, src0, filter0, filter1,
629  filter2, filter3);
630  tmp1 = FILT_8TAP_DPADD_S_H(reg3, reg4, reg5, src1, filter0, filter1,
631  filter2, filter3);
632  tmp2 = FILT_8TAP_DPADD_S_H(reg6, reg7, reg8, src4, filter0, filter1,
633  filter2, filter3);
634  tmp3 = FILT_8TAP_DPADD_S_H(reg9, reg10, reg11, src5, filter0, filter1,
635  filter2, filter3);
636  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7, tmp0, tmp1);
637  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
638  __lsx_vst(tmp0, dst, 0);
639  dst += dst_stride;
640  __lsx_vst(tmp1, dst, 0);
641  dst += dst_stride;
642  tmp0 = FILT_8TAP_DPADD_S_H(reg1, reg2, src0, src2, filter0, filter1,
643  filter2, filter3);
644  tmp1 = FILT_8TAP_DPADD_S_H(reg4, reg5, src1, src3, filter0, filter1,
645  filter2, filter3);
646  tmp2 = FILT_8TAP_DPADD_S_H(reg7, reg8, src4, src7, filter0, filter1,
647  filter2, filter3);
648  tmp3 = FILT_8TAP_DPADD_S_H(reg10, reg11, src5, src8, filter0, filter1,
649  filter2, filter3);
650  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7, tmp0, tmp1);
651  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
652  __lsx_vst(tmp0, dst, 0);
653  dst += dst_stride;
654  __lsx_vst(tmp1, dst, 0);
655  dst += dst_stride;
656 
657  reg0 = reg2;
658  reg1 = src0;
659  reg2 = src2;
660  reg3 = reg5;
661  reg4 = src1;
662  reg5 = src3;
663  reg6 = reg8;
664  reg7 = src4;
665  reg8 = src7;
666  reg9 = reg11;
667  reg10 = src5;
668  reg11 = src8;
669  src6 = src10;
670  }
671 }
672 
673 static void common_vt_8t_16w_mult_lsx(const uint8_t *src, int32_t src_stride,
674  uint8_t *dst, int32_t dst_stride,
675  const int8_t *filter, int32_t height,
676  int32_t width)
677 {
678  uint8_t *src_tmp;
679  uint8_t *dst_tmp;
680  uint32_t cnt = width >> 4;
681  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
682  __m128i filter0, filter1, filter2, filter3;
683  __m128i reg0, reg1, reg2, reg3, reg4, reg5;
684  __m128i reg6, reg7, reg8, reg9, reg10, reg11;
685  __m128i tmp0, tmp1, tmp2, tmp3;
686  int32_t src_stride2 = src_stride << 1;
687  int32_t src_stride3 = src_stride + src_stride2;
688  int32_t src_stride4 = src_stride2 << 1;
689  int32_t dst_stride2 = dst_stride << 1;
690  int32_t dst_stride3 = dst_stride2 + dst_stride;
691  int32_t dst_stride4 = dst_stride2 << 1;
692  uint8_t* _src = (uint8_t*)src - src_stride3;
693 
694  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
695  filter0, filter1, filter2, filter3);
696  for (;cnt--;) {
697  uint32_t loop_cnt = height >> 2;
698 
699  src_tmp = _src;
700  dst_tmp = dst;
701 
702  src0 = __lsx_vld(src_tmp, 0);
703  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
704  src1, src2);
705  src3 = __lsx_vldx(src_tmp, src_stride3);
706  src_tmp += src_stride4;
707  src4 = __lsx_vld(src_tmp, 0);
708  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
709  src5, src6);
710  src_tmp += src_stride3;
711 
712  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
713  src0, src1, src2, src3);
714  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
715  src6 = __lsx_vxori_b(src6, 128);
716  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1,
717  reg0, reg1, reg2, reg3);
718  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, reg4, reg5);
719  DUP4_ARG2(__lsx_vilvh_b, src1, src0, src3, src2, src5, src4, src2, src1,
720  reg6, reg7, reg8, reg9);
721  DUP2_ARG2(__lsx_vilvh_b, src4, src3, src6, src5, reg10, reg11);
722 
723  for (;loop_cnt--;) {
724  src7 = __lsx_vld(src_tmp, 0);
725  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
726  src8, src9);
727  src10 = __lsx_vldx(src_tmp, src_stride3);
728  src_tmp += src_stride4;
729  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10,
730  128, src7, src8, src9, src10);
731  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8,
732  src10, src9, src0, src1, src2, src3);
733  DUP4_ARG2(__lsx_vilvh_b, src7, src6, src8, src7, src9, src8,
734  src10, src9, src4, src5, src7, src8);
735  tmp0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, src0, filter0,
736  filter1, filter2, filter3);
737  tmp1 = FILT_8TAP_DPADD_S_H(reg3, reg4, reg5, src1, filter0,
738  filter1, filter2, filter3);
739  tmp2 = FILT_8TAP_DPADD_S_H(reg6, reg7, reg8, src4, filter0,
740  filter1, filter2, filter3);
741  tmp3 = FILT_8TAP_DPADD_S_H(reg9, reg10, reg11, src5, filter0,
742  filter1, filter2, filter3);
743  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7,
744  tmp0, tmp1);
745  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
746  __lsx_vst(tmp0, dst_tmp, 0);
747  __lsx_vstx(tmp1, dst_tmp, dst_stride);
748  tmp0 = FILT_8TAP_DPADD_S_H(reg1, reg2, src0, src2, filter0,
749  filter1, filter2, filter3);
750  tmp1 = FILT_8TAP_DPADD_S_H(reg4, reg5, src1, src3, filter0,
751  filter1, filter2, filter3);
752  tmp2 = FILT_8TAP_DPADD_S_H(reg7, reg8, src4, src7, filter0,
753  filter1, filter2, filter3);
754  tmp3 = FILT_8TAP_DPADD_S_H(reg10, reg11, src5, src8, filter0,
755  filter1, filter2, filter3);
756  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7,
757  tmp0, tmp1);
758  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
759  __lsx_vstx(tmp0, dst_tmp, dst_stride2);
760  __lsx_vstx(tmp1, dst_tmp, dst_stride3);
761  dst_tmp += dst_stride4;
762 
763  reg0 = reg2;
764  reg1 = src0;
765  reg2 = src2;
766  reg3 = reg5;
767  reg4 = src1;
768  reg5 = src3;
769  reg6 = reg8;
770  reg7 = src4;
771  reg8 = src7;
772  reg9 = reg11;
773  reg10 = src5;
774  reg11 = src8;
775  src6 = src10;
776  }
777  _src += 16;
778  dst += 16;
779  }
780 }
781 
782 static void common_vt_8t_32w_lsx(const uint8_t *src, int32_t src_stride,
783  uint8_t *dst, int32_t dst_stride,
784  const int8_t *filter, int32_t height)
785 {
786  common_vt_8t_16w_mult_lsx(src, src_stride, dst, dst_stride, filter, height, 32);
787 }
788 
789 static void common_vt_8t_64w_lsx(const uint8_t *src, int32_t src_stride,
790  uint8_t *dst, int32_t dst_stride,
791  const int8_t *filter, int32_t height)
792 {
793  common_vt_8t_16w_mult_lsx(src, src_stride, dst, dst_stride,
794  filter, height, 64);
795 }
796 
797 static void common_hv_8ht_8vt_4w_lsx(const uint8_t *src, int32_t src_stride,
798  uint8_t *dst, int32_t dst_stride,
799  const int8_t *filter_horiz,
800  const int8_t *filter_vert,
801  int32_t height)
802 {
803  uint32_t loop_cnt = height >> 2;
804  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
805  __m128i filt_hz0, filt_hz1, filt_hz2, filt_hz3;
806  __m128i filt_vt0, filt_vt1, filt_vt2, filt_vt3;
807  __m128i mask0, mask1, mask2, mask3;
808  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
809  __m128i out0, out1;
810  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
811  int32_t src_stride2 = src_stride << 1;
812  int32_t src_stride3 = src_stride + src_stride2;
813  int32_t src_stride4 = src_stride2 << 1;
814  uint8_t* _src = (uint8_t*)src - src_stride3 - 3;
815 
816  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
817  DUP4_ARG2(__lsx_vldrepl_h, filter_horiz, 0, filter_horiz, 2, filter_horiz, 4,
818  filter_horiz, 6, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
819  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
820  mask3 = __lsx_vaddi_bu(mask0, 6);
821 
822  src0 = __lsx_vld(_src, 0);
823  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
824  src3 = __lsx_vldx(_src, src_stride3);
825  _src += src_stride4;
826  src4 = __lsx_vld(_src, 0);
827  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
828  _src += src_stride3;
829  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
830  src0, src1, src2, src3);
831  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
832  src6 = __lsx_vxori_b(src6, 128);
833 
834  tmp0 = HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3, filt_hz0,
835  filt_hz1, filt_hz2, filt_hz3);
836  tmp2 = HORIZ_8TAP_FILT(src2, src3, mask0, mask1, mask2, mask3, filt_hz0,
837  filt_hz1, filt_hz2, filt_hz3);
838  tmp4 = HORIZ_8TAP_FILT(src4, src5, mask0, mask1, mask2, mask3, filt_hz0,
839  filt_hz1, filt_hz2, filt_hz3);
840  tmp5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
841  filt_hz1, filt_hz2, filt_hz3);
842  DUP2_ARG3(__lsx_vshuf_b, tmp2, tmp0, shuff, tmp4, tmp2, shuff, tmp1, tmp3);
843  DUP4_ARG2(__lsx_vldrepl_h, filter_vert, 0, filter_vert, 2, filter_vert, 4,
844  filter_vert, 6, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
845  DUP2_ARG2(__lsx_vpackev_b, tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
846  tmp2 = __lsx_vpackev_b(tmp5, tmp4);
847 
848  for (;loop_cnt--;) {
849  src7 = __lsx_vld(_src, 0);
850  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
851  src10 = __lsx_vldx(_src, src_stride3);
852  _src += src_stride4;
853  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
854  src7, src8, src9, src10);
855  tmp3 = HORIZ_8TAP_FILT(src7, src8, mask0, mask1, mask2, mask3, filt_hz0,
856  filt_hz1, filt_hz2, filt_hz3);
857  tmp4 = __lsx_vshuf_b(tmp3, tmp5, shuff);
858  tmp4 = __lsx_vpackev_b(tmp3, tmp4);
859  out0 = FILT_8TAP_DPADD_S_H(tmp0, tmp1, tmp2, tmp4, filt_vt0, filt_vt1,
860  filt_vt2, filt_vt3);
861  src1 = HORIZ_8TAP_FILT(src9, src10, mask0, mask1, mask2, mask3,
862  filt_hz0, filt_hz1, filt_hz2, filt_hz3);
863  src0 = __lsx_vshuf_b(src1, tmp3, shuff);
864  src0 = __lsx_vpackev_b(src1, src0);
865  out1 = FILT_8TAP_DPADD_S_H(tmp1, tmp2, tmp4, src0, filt_vt0, filt_vt1,
866  filt_vt2, filt_vt3);
867  out0 = __lsx_vssrarni_b_h(out1, out0, 7);
868  out0 = __lsx_vxori_b(out0, 128);
869  __lsx_vstelm_w(out0, dst, 0, 0);
870  dst += dst_stride;
871  __lsx_vstelm_w(out0, dst, 0, 1);
872  dst += dst_stride;
873  __lsx_vstelm_w(out0, dst, 0, 2);
874  dst += dst_stride;
875  __lsx_vstelm_w(out0, dst, 0, 3);
876  dst += dst_stride;
877 
878  tmp5 = src1;
879  tmp0 = tmp2;
880  tmp1 = tmp4;
881  tmp2 = src0;
882  }
883 }
884 
885 static void common_hv_8ht_8vt_8w_lsx(const uint8_t *src, int32_t src_stride,
886  uint8_t *dst, int32_t dst_stride,
887  const int8_t *filter_horiz,
888  const int8_t *filter_vert,
889  int32_t height)
890 {
891  uint32_t loop_cnt = height >> 2;
892  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
893  __m128i filt_hz0, filt_hz1, filt_hz2, filt_hz3;
894  __m128i filt_vt0, filt_vt1, filt_vt2, filt_vt3;
895  __m128i mask0, mask1, mask2, mask3;
896  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
897  __m128i out0, out1;
898  int32_t src_stride2 = src_stride << 1;
899  int32_t src_stride3 = src_stride + src_stride2;
900  int32_t src_stride4 = src_stride2 << 1;
901  uint8_t* _src = (uint8_t*)src - src_stride3 - 3;
902 
903  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
904  DUP4_ARG2(__lsx_vldrepl_h, filter_horiz, 0, filter_horiz, 2, filter_horiz,
905  4, filter_horiz, 6, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
906  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
907  mask3 = __lsx_vaddi_bu(mask0, 6);
908 
909  src0 = __lsx_vld(_src, 0);
910  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
911  src3 = __lsx_vldx(_src, src_stride3);
912  _src += src_stride4;
913  src4 = __lsx_vld(_src, 0);
914  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
915  _src += src_stride3;
916  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
917  src0, src1, src2, src3);
918  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
919  src6 = __lsx_vxori_b(src6, 128);
920 
921  src0 = HORIZ_8TAP_FILT(src0, src0, mask0, mask1, mask2, mask3, filt_hz0,
922  filt_hz1, filt_hz2, filt_hz3);
923  src1 = HORIZ_8TAP_FILT(src1, src1, mask0, mask1, mask2, mask3, filt_hz0,
924  filt_hz1, filt_hz2, filt_hz3);
925  src2 = HORIZ_8TAP_FILT(src2, src2, mask0, mask1, mask2, mask3, filt_hz0,
926  filt_hz1, filt_hz2, filt_hz3);
927  src3 = HORIZ_8TAP_FILT(src3, src3, mask0, mask1, mask2, mask3, filt_hz0,
928  filt_hz1, filt_hz2, filt_hz3);
929  src4 = HORIZ_8TAP_FILT(src4, src4, mask0, mask1, mask2, mask3, filt_hz0,
930  filt_hz1, filt_hz2, filt_hz3);
931  src5 = HORIZ_8TAP_FILT(src5, src5, mask0, mask1, mask2, mask3, filt_hz0,
932  filt_hz1, filt_hz2, filt_hz3);
933  src6 = HORIZ_8TAP_FILT(src6, src6, mask0, mask1, mask2, mask3, filt_hz0,
934  filt_hz1, filt_hz2, filt_hz3);
935 
936  DUP4_ARG2(__lsx_vldrepl_h, filter_vert, 0, filter_vert, 2, filter_vert, 4,
937  filter_vert, 6, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
938  DUP4_ARG2(__lsx_vpackev_b, src1, src0, src3, src2, src5, src4,
939  src2, src1, tmp0, tmp1, tmp2, tmp4);
940  DUP2_ARG2(__lsx_vpackev_b, src4, src3, src6, src5, tmp5, tmp6);
941 
942  for (;loop_cnt--;) {
943  src7 = __lsx_vld(_src, 0);
944  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
945  src10 = __lsx_vldx(_src, src_stride3);
946  _src += src_stride4;
947 
948  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
949  src7, src8, src9, src10);
950  src7 = HORIZ_8TAP_FILT(src7, src7, mask0, mask1, mask2, mask3, filt_hz0,
951  filt_hz1, filt_hz2, filt_hz3);
952  tmp3 = __lsx_vpackev_b(src7, src6);
953  out0 = FILT_8TAP_DPADD_S_H(tmp0, tmp1, tmp2, tmp3, filt_vt0, filt_vt1,
954  filt_vt2, filt_vt3);
955  src8 = HORIZ_8TAP_FILT(src8, src8, mask0, mask1, mask2, mask3, filt_hz0,
956  filt_hz1, filt_hz2, filt_hz3);
957  src0 = __lsx_vpackev_b(src8, src7);
958  out1 = FILT_8TAP_DPADD_S_H(tmp4, tmp5, tmp6, src0, filt_vt0, filt_vt1,
959  filt_vt2, filt_vt3);
960  src9 = HORIZ_8TAP_FILT(src9, src9, mask0, mask1, mask2, mask3, filt_hz0,
961  filt_hz1, filt_hz2, filt_hz3);
962  src1 = __lsx_vpackev_b(src9, src8);
963  src3 = FILT_8TAP_DPADD_S_H(tmp1, tmp2, tmp3, src1, filt_vt0, filt_vt1,
964  filt_vt2, filt_vt3);
965  src10 = HORIZ_8TAP_FILT(src10, src10, mask0, mask1, mask2, mask3,
966  filt_hz0, filt_hz1, filt_hz2, filt_hz3);
967  src2 = __lsx_vpackev_b(src10, src9);
968  src4 = FILT_8TAP_DPADD_S_H(tmp5, tmp6, src0, src2, filt_vt0, filt_vt1,
969  filt_vt2, filt_vt3);
970  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, src4, src3, 7, out0, out1);
971  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
972  __lsx_vstelm_d(out0, dst, 0, 0);
973  dst += dst_stride;
974  __lsx_vstelm_d(out0, dst, 0, 1);
975  dst += dst_stride;
976  __lsx_vstelm_d(out1, dst, 0, 0);
977  dst += dst_stride;
978  __lsx_vstelm_d(out1, dst, 0, 1);
979  dst += dst_stride;
980 
981  src6 = src10;
982  tmp0 = tmp2;
983  tmp1 = tmp3;
984  tmp2 = src1;
985  tmp4 = tmp6;
986  tmp5 = src0;
987  tmp6 = src2;
988  }
989 }
990 
991 static void common_hv_8ht_8vt_16w_lsx(const uint8_t *src, int32_t src_stride,
992  uint8_t *dst, int32_t dst_stride,
993  const int8_t *filter_horiz,
994  const int8_t *filter_vert,
995  int32_t height)
996 {
997  int32_t multiple8_cnt;
998 
999  for (multiple8_cnt = 2; multiple8_cnt--;) {
1000  common_hv_8ht_8vt_8w_lsx(src, src_stride, dst, dst_stride, filter_horiz,
1001  filter_vert, height);
1002  src += 8;
1003  dst += 8;
1004  }
1005 }
1006 
1007 static void common_hv_8ht_8vt_32w_lsx(const uint8_t *src, int32_t src_stride,
1008  uint8_t *dst, int32_t dst_stride,
1009  const int8_t *filter_horiz,
1010  const int8_t *filter_vert,
1011  int32_t height)
1012 {
1013  int32_t multiple8_cnt;
1014 
1015  for (multiple8_cnt = 4; multiple8_cnt--;) {
1016  common_hv_8ht_8vt_8w_lsx(src, src_stride, dst, dst_stride, filter_horiz,
1017  filter_vert, height);
1018  src += 8;
1019  dst += 8;
1020  }
1021 }
1022 
1023 static void common_hv_8ht_8vt_64w_lsx(const uint8_t *src, int32_t src_stride,
1024  uint8_t *dst, int32_t dst_stride,
1025  const int8_t *filter_horiz,
1026  const int8_t *filter_vert,
1027  int32_t height)
1028 {
1029  int32_t multiple8_cnt;
1030 
1031  for (multiple8_cnt = 8; multiple8_cnt--;) {
1032  common_hv_8ht_8vt_8w_lsx(src, src_stride, dst, dst_stride, filter_horiz,
1033  filter_vert, height);
1034  src += 8;
1035  dst += 8;
1036  }
1037 }
1038 
1039 static void copy_width8_lsx(const uint8_t *src, int32_t src_stride,
1040  uint8_t *dst, int32_t dst_stride,
1041  int32_t height)
1042 {
1043  int32_t cnt = height >> 2;
1044  __m128i src0, src1, src2, src3;
1045 
1046  for (;cnt--;) {
1047  src0 = __lsx_vldrepl_d(src, 0);
1048  src += src_stride;
1049  src1 = __lsx_vldrepl_d(src, 0);
1050  src += src_stride;
1051  src2 = __lsx_vldrepl_d(src, 0);
1052  src += src_stride;
1053  src3 = __lsx_vldrepl_d(src, 0);
1054  src += src_stride;
1055  __lsx_vstelm_d(src0, dst, 0, 0);
1056  dst += dst_stride;
1057  __lsx_vstelm_d(src1, dst, 0, 0);
1058  dst += dst_stride;
1059  __lsx_vstelm_d(src2, dst, 0, 0);
1060  dst += dst_stride;
1061  __lsx_vstelm_d(src3, dst, 0, 0);
1062  dst += dst_stride;
1063  }
1064 }
1065 
1066 static void copy_width16_lsx(const uint8_t *src, int32_t src_stride,
1067  uint8_t *dst, int32_t dst_stride,
1068  int32_t height)
1069 {
1070  int32_t cnt = height >> 2;
1071  __m128i src0, src1, src2, src3;
1072  int32_t src_stride2 = src_stride << 1;
1073  int32_t src_stride3 = src_stride + src_stride2;
1074  int32_t src_stride4 = src_stride2 << 1;
1075  int32_t dst_stride2 = dst_stride << 1;
1076  int32_t dst_stride3 = dst_stride2 + dst_stride;
1077  int32_t dst_stride4 = dst_stride2 << 1;
1078  uint8_t *_src = (uint8_t*)src;
1079 
1080  for (;cnt--;) {
1081  src0 = __lsx_vld(_src, 0);
1082  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1083  src3 = __lsx_vldx(_src, src_stride3);
1084  _src += src_stride4;
1085  __lsx_vst(src0, dst, 0);
1086  __lsx_vstx(src1, dst, dst_stride);
1087  __lsx_vstx(src2, dst, dst_stride2);
1088  __lsx_vstx(src3, dst, dst_stride3);
1089  dst += dst_stride4;
1090  }
1091 }
1092 
1093 static void copy_width32_lsx(const uint8_t *src, int32_t src_stride,
1094  uint8_t *dst, int32_t dst_stride,
1095  int32_t height)
1096 {
1097  int32_t cnt = height >> 2;
1098  uint8_t *src_tmp1 = (uint8_t*)src;
1099  uint8_t *dst_tmp1 = dst;
1100  uint8_t *src_tmp2 = src_tmp1 + 16;
1101  uint8_t *dst_tmp2 = dst_tmp1 + 16;
1102  int32_t src_stride2 = src_stride << 1;
1103  int32_t src_stride3 = src_stride + src_stride2;
1104  int32_t src_stride4 = src_stride2 << 1;
1105  int32_t dst_stride2 = dst_stride << 1;
1106  int32_t dst_stride3 = dst_stride2 + dst_stride;
1107  int32_t dst_stride4 = dst_stride2 << 1;
1108  __m128i src0, src1, src2, src3, src4, src5, src6, src7;
1109 
1110  for (;cnt--;) {
1111  src0 = __lsx_vld(src_tmp1, 0);
1112  DUP2_ARG2(__lsx_vldx, src_tmp1, src_stride, src_tmp1, src_stride2,
1113  src1, src2);
1114  src3 = __lsx_vldx(src_tmp1, src_stride3);
1115  src_tmp1 += src_stride4;
1116 
1117  src4 = __lsx_vld(src_tmp2, 0);
1118  DUP2_ARG2(__lsx_vldx, src_tmp2, src_stride, src_tmp2, src_stride2,
1119  src5, src6);
1120  src7 = __lsx_vldx(src_tmp2, src_stride3);
1121  src_tmp2 += src_stride4;
1122 
1123  __lsx_vst(src0, dst_tmp1, 0);
1124  __lsx_vstx(src1, dst_tmp1, dst_stride);
1125  __lsx_vstx(src2, dst_tmp1, dst_stride2);
1126  __lsx_vstx(src3, dst_tmp1, dst_stride3);
1127  dst_tmp1 += dst_stride4;
1128  __lsx_vst(src4, dst_tmp2, 0);
1129  __lsx_vstx(src5, dst_tmp2, dst_stride);
1130  __lsx_vstx(src6, dst_tmp2, dst_stride2);
1131  __lsx_vstx(src7, dst_tmp2, dst_stride3);
1132  dst_tmp2 += dst_stride4;
1133  }
1134 }
1135 
1136 static void copy_width64_lsx(const uint8_t *src, int32_t src_stride,
1137  uint8_t *dst, int32_t dst_stride,
1138  int32_t height)
1139 {
1140  int32_t cnt = height >> 2;
1141  __m128i src0, src1, src2, src3, src4, src5, src6, src7;
1142  __m128i src8, src9, src10, src11, src12, src13, src14, src15;
1143 
1144  for (;cnt--;) {
1145  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
1146  src0, src1, src2, src3);
1147  src += src_stride;
1148  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
1149  src4, src5, src6, src7);
1150  src += src_stride;
1151  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
1152  src8, src9, src10, src11);
1153  src += src_stride;
1154  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
1155  src12, src13, src14, src15);
1156  src += src_stride;
1157  __lsx_vst(src0, dst, 0);
1158  __lsx_vst(src1, dst, 16);
1159  __lsx_vst(src2, dst, 32);
1160  __lsx_vst(src3, dst, 48);
1161  dst += dst_stride;
1162  __lsx_vst(src4, dst, 0);
1163  __lsx_vst(src5, dst, 16);
1164  __lsx_vst(src6, dst, 32);
1165  __lsx_vst(src7, dst, 48);
1166  dst += dst_stride;
1167  __lsx_vst(src8, dst, 0);
1168  __lsx_vst(src9, dst, 16);
1169  __lsx_vst(src10, dst, 32);
1170  __lsx_vst(src11, dst, 48);
1171  dst += dst_stride;
1172  __lsx_vst(src12, dst, 0);
1173  __lsx_vst(src13, dst, 16);
1174  __lsx_vst(src14, dst, 32);
1175  __lsx_vst(src15, dst, 48);
1176  dst += dst_stride;
1177  }
1178 }
1179 
1180 static void common_hz_8t_and_aver_dst_4x4_lsx(const uint8_t *src,
1181  int32_t src_stride,
1182  uint8_t *dst, int32_t dst_stride,
1183  const int8_t *filter)
1184 {
1185  uint8_t *dst_tmp = dst;
1186  __m128i src0, src1, src2, src3;
1187  __m128i filter0, filter1, filter2, filter3;
1188  __m128i mask0, mask1, mask2, mask3;
1189  __m128i tmp0, tmp1;
1190  __m128i dst0, dst1, dst2, dst3;
1191 
1192  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
1193  src -= 3;
1194  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1195  mask3 = __lsx_vaddi_bu(mask0, 6);
1196  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1197  filter0, filter1, filter2, filter3);
1198  LSX_LD_4(src, src_stride, src0, src1, src2, src3);
1199  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1200  src0, src1, src2, src3);
1201  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2, mask3,
1202  filter0, filter1, filter2, filter3, tmp0, tmp1);
1203  dst0 = __lsx_vldrepl_w(dst_tmp, 0);
1204  dst_tmp += dst_stride;
1205  dst1 = __lsx_vldrepl_w(dst_tmp, 0);
1206  dst_tmp += dst_stride;
1207  dst2 = __lsx_vldrepl_w(dst_tmp, 0);
1208  dst_tmp += dst_stride;
1209  dst3 = __lsx_vldrepl_w(dst_tmp, 0);
1210  dst0 = __lsx_vilvl_w(dst1, dst0);
1211  dst1 = __lsx_vilvl_w(dst3, dst2);
1212  dst0 = __lsx_vilvl_d(dst1, dst0);
1213  tmp0 = __lsx_vssrarni_b_h(tmp1, tmp0, 7);
1214  tmp0 = __lsx_vxori_b(tmp0, 128);
1215  dst0 = __lsx_vavgr_bu(tmp0, dst0);
1216  __lsx_vstelm_w(dst0, dst, 0, 0);
1217  dst += dst_stride;
1218  __lsx_vstelm_w(dst0, dst, 0, 1);
1219  dst += dst_stride;
1220  __lsx_vstelm_w(dst0, dst, 0, 2);
1221  dst += dst_stride;
1222  __lsx_vstelm_w(dst0, dst, 0, 3);
1223 }
1224 
1225 static void common_hz_8t_and_aver_dst_4x8_lsx(const uint8_t *src,
1226  int32_t src_stride,
1227  uint8_t *dst, int32_t dst_stride,
1228  const int8_t *filter)
1229 {
1230  uint8_t *dst_tmp = dst;
1231  __m128i src0, src1, src2, src3, filter0, filter1, filter2, filter3;
1232  __m128i mask0, mask1, mask2, mask3, tmp0, tmp1, tmp2, tmp3;
1233  __m128i dst0, dst1;
1234 
1235  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
1236  src -= 3;
1237  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1238  mask3 = __lsx_vaddi_bu(mask0, 6);
1239  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1240  filter0, filter1, filter2, filter3);
1241 
1242  LSX_LD_4(src, src_stride, src0, src1, src2, src3);
1243  src += src_stride;
1244  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1245  src0, src1, src2, src3);
1246  tmp0 = __lsx_vldrepl_w(dst_tmp, 0);
1247  dst_tmp += dst_stride;
1248  tmp1 = __lsx_vldrepl_w(dst_tmp, 0);
1249  dst_tmp += dst_stride;
1250  tmp2 = __lsx_vldrepl_w(dst_tmp, 0);
1251  dst_tmp += dst_stride;
1252  tmp3 = __lsx_vldrepl_w(dst_tmp, 0);
1253  dst_tmp += dst_stride;
1254  tmp0 = __lsx_vilvl_w(tmp1, tmp0);
1255  tmp1 = __lsx_vilvl_w(tmp3, tmp2);
1256  dst0 = __lsx_vilvl_d(tmp1, tmp0);
1257 
1258  tmp0 = __lsx_vldrepl_w(dst_tmp, 0);
1259  dst_tmp += dst_stride;
1260  tmp1 = __lsx_vldrepl_w(dst_tmp, 0);
1261  dst_tmp += dst_stride;
1262  tmp2 = __lsx_vldrepl_w(dst_tmp, 0);
1263  dst_tmp += dst_stride;
1264  tmp3 = __lsx_vldrepl_w(dst_tmp, 0);
1265  tmp0 = __lsx_vilvl_w(tmp1, tmp0);
1266  tmp1 = __lsx_vilvl_w(tmp3, tmp2);
1267  dst1 = __lsx_vilvl_d(tmp1, tmp0);
1268  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2, mask3,
1269  filter0, filter1, filter2, filter3, tmp0, tmp1);
1270  LSX_LD_4(src, src_stride, src0, src1, src2, src3);
1271  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1272  src0, src1, src2, src3);
1273  HORIZ_8TAP_4WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2, mask3,
1274  filter0, filter1, filter2, filter3, tmp2, tmp3);
1275  DUP4_ARG3(__lsx_vssrarni_b_h, tmp0, tmp0, 7, tmp1, tmp1, 7, tmp2, tmp2, 7,
1276  tmp3, tmp3, 7, tmp0, tmp1, tmp2, tmp3);
1277  DUP2_ARG2(__lsx_vilvl_d, tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
1278  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
1279  DUP2_ARG2(__lsx_vavgr_bu, tmp0, dst0, tmp1, dst1, dst0, dst1);
1280  __lsx_vstelm_w(dst0, dst, 0, 0);
1281  dst += dst_stride;
1282  __lsx_vstelm_w(dst0, dst, 0, 1);
1283  dst += dst_stride;
1284  __lsx_vstelm_w(dst0, dst, 0, 2);
1285  dst += dst_stride;
1286  __lsx_vstelm_w(dst0, dst, 0, 3);
1287  dst += dst_stride;
1288  __lsx_vstelm_w(dst1, dst, 0, 0);
1289  dst += dst_stride;
1290  __lsx_vstelm_w(dst1, dst, 0, 1);
1291  dst += dst_stride;
1292  __lsx_vstelm_w(dst1, dst, 0, 2);
1293  dst += dst_stride;
1294  __lsx_vstelm_w(dst1, dst, 0, 3);
1295 }
1296 
1297 static void common_hz_8t_and_aver_dst_4w_lsx(const uint8_t *src,
1298  int32_t src_stride,
1299  uint8_t *dst, int32_t dst_stride,
1300  const int8_t *filter,
1301  int32_t height)
1302 {
1303  if (height == 4) {
1304  common_hz_8t_and_aver_dst_4x4_lsx(src, src_stride, dst, dst_stride, filter);
1305  } else if (height == 8) {
1306  common_hz_8t_and_aver_dst_4x8_lsx(src, src_stride, dst, dst_stride, filter);
1307  }
1308 }
1309 
1310 static void common_hz_8t_and_aver_dst_8w_lsx(const uint8_t *src,
1311  int32_t src_stride,
1312  uint8_t *dst, int32_t dst_stride,
1313  const int8_t *filter,
1314  int32_t height)
1315 {
1316  int32_t loop_cnt = height >> 2;
1317  uint8_t *dst_tmp = dst;
1318  __m128i src0, src1, src2, src3, filter0, filter1, filter2, filter3;
1319  __m128i mask0, mask1, mask2, mask3;
1320  __m128i tmp0, tmp1, tmp2, tmp3;
1321  __m128i dst0, dst1, dst2, dst3;
1322  int32_t src_stride2 = src_stride << 1;
1323  int32_t src_stride3 = src_stride2 + src_stride;
1324  int32_t src_stride4 = src_stride2 << 1;
1325  uint8_t *_src = (uint8_t*)src - 3;
1326 
1327  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
1328  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1329  mask3 = __lsx_vaddi_bu(mask0, 6);
1330  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1331  filter0, filter1, filter2, filter3);
1332 
1333  for (;loop_cnt--;) {
1334  src0 = __lsx_vld(_src, 0);
1335  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1336  src3 = __lsx_vldx(_src, src_stride3);
1337  _src += src_stride4;
1338  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1339  src0, src1, src2, src3);
1340  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
1341  mask3,filter0, filter1, filter2, filter3, tmp0, tmp1, tmp2, tmp3);
1342  dst0 = __lsx_vldrepl_d(dst_tmp, 0);
1343  dst_tmp += dst_stride;
1344  dst1 = __lsx_vldrepl_d(dst_tmp, 0);
1345  dst_tmp += dst_stride;
1346  dst2 = __lsx_vldrepl_d(dst_tmp, 0);
1347  dst_tmp += dst_stride;
1348  dst3 = __lsx_vldrepl_d(dst_tmp, 0);
1349  dst_tmp += dst_stride;
1350  DUP2_ARG2(__lsx_vilvl_d, dst1, dst0, dst3, dst2, dst0, dst1);
1351  DUP2_ARG3(__lsx_vssrarni_b_h, tmp1, tmp0, 7, tmp3, tmp2, 7, tmp0, tmp1);
1352  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
1353  DUP2_ARG2(__lsx_vavgr_bu, tmp0, dst0, tmp1, dst1, dst0, dst1);
1354  __lsx_vstelm_d(dst0, dst, 0, 0);
1355  dst += dst_stride;
1356  __lsx_vstelm_d(dst0, dst, 0, 1);
1357  dst += dst_stride;
1358  __lsx_vstelm_d(dst1, dst, 0, 0);
1359  dst += dst_stride;
1360  __lsx_vstelm_d(dst1, dst, 0, 1);
1361  dst += dst_stride;
1362  }
1363 }
1364 
1365 static void common_hz_8t_and_aver_dst_16w_lsx(const uint8_t *src,
1366  int32_t src_stride,
1367  uint8_t *dst, int32_t dst_stride,
1368  const int8_t *filter,
1369  int32_t height)
1370 {
1371  int32_t loop_cnt = height >> 1;
1372  int32_t dst_stride2 = dst_stride << 1;
1373  uint8_t *dst_tmp = dst;
1374  __m128i src0, src1, src2, src3, filter0, filter1, filter2, filter3;
1375  __m128i mask0, mask1, mask2, mask3, dst0, dst1, dst2, dst3;
1376  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
1377  __m128i tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
1378 
1379  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
1380  src -= 3;
1381  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1382  mask3 = __lsx_vaddi_bu(mask0, 6);
1383  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1384  filter0, filter1, filter2, filter3);
1385 
1386  for (;loop_cnt--;) {
1387  DUP2_ARG2(__lsx_vld, src, 0, src, 8, src0, src1);
1388  src += src_stride;
1389  DUP2_ARG2(__lsx_vld, src, 0, src, 8, src2, src3);
1390  src += src_stride;
1391  dst0 = __lsx_vld(dst_tmp, 0);
1392  dst1 = __lsx_vldx(dst_tmp, dst_stride);
1393  dst_tmp += dst_stride2;
1394  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1395  src0, src1, src2, src3);
1396  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask0, src1, src1, mask0, src2, src2,
1397  mask0, src3, src3, mask0, tmp0, tmp1, tmp2, tmp3);
1398  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask1, src1, src1, mask1, src2, src2,
1399  mask1, src3, src3, mask1, tmp4, tmp5, tmp6, tmp7);
1400  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask2, src1, src1, mask2, src2, src2,
1401  mask2, src3, src3, mask2, tmp8, tmp9, tmp10, tmp11);
1402  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask3, src1, src1, mask3, src2, src2,
1403  mask3, src3, src3, mask3, tmp12, tmp13, tmp14, tmp15);
1404  DUP4_ARG2(__lsx_vdp2_h_b, tmp0, filter0, tmp1, filter0, tmp2, filter0, tmp3,
1405  filter0, tmp0, tmp1, tmp2, tmp3);
1406  DUP4_ARG2(__lsx_vdp2_h_b, tmp8, filter2, tmp9, filter2, tmp10, filter2, tmp11,
1407  filter2, tmp8, tmp9, tmp10, tmp11);
1408  DUP4_ARG3(__lsx_vdp2add_h_b, tmp0, tmp4, filter1, tmp1, tmp5, filter1, tmp2,
1409  tmp6, filter1, tmp3, tmp7, filter1, tmp0, tmp1, tmp2, tmp3);
1410  DUP4_ARG3(__lsx_vdp2add_h_b, tmp8, tmp12, filter3, tmp9, tmp13, filter3, tmp10,
1411  tmp14, filter3, tmp11, tmp15, filter3, tmp4, tmp5, tmp6, tmp7);
1412  DUP4_ARG2(__lsx_vsadd_h, tmp0, tmp4, tmp1, tmp5, tmp2, tmp6, tmp3, tmp7,
1413  tmp0, tmp1, tmp2, tmp3);
1414  DUP2_ARG3(__lsx_vssrarni_b_h, tmp1, tmp0, 7, tmp3, tmp2, 7, dst2, dst3);
1415  DUP2_ARG2(__lsx_vxori_b, dst2, 128, dst3, 128, dst2, dst3);
1416  DUP2_ARG2(__lsx_vavgr_bu, dst0, dst2, dst1, dst3, dst0, dst1);
1417  __lsx_vst(dst0, dst, 0);
1418  __lsx_vstx(dst1, dst, dst_stride);
1419  dst += dst_stride2;
1420  }
1421 }
1422 
1423 static void common_hz_8t_and_aver_dst_32w_lsx(const uint8_t *src,
1424  int32_t src_stride,
1425  uint8_t *dst, int32_t dst_stride,
1426  const int8_t *filter,
1427  int32_t height)
1428 {
1429  uint32_t loop_cnt = height;
1430  uint8_t *dst_tmp = dst;
1431  __m128i src0, src1, src2, src3, filter0, filter1, filter2, filter3;
1432  __m128i mask0, mask1, mask2, mask3, dst0, dst1;
1433  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
1434  __m128i tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
1435  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
1436 
1437  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
1438  src -= 3;
1439  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1440  mask3 = __lsx_vaddi_bu(mask0, 6);
1441  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1442  filter0, filter1, filter2, filter3);
1443 
1444  for (;loop_cnt--;) {
1445  DUP2_ARG2(__lsx_vld, src, 0, src, 16, src0, src2);
1446  src3 = __lsx_vld(src, 24);
1447  src1 = __lsx_vshuf_b(src2, src0, shuff);
1448  src += src_stride;
1449  DUP2_ARG2(__lsx_vld, dst_tmp, 0, dst, 16, dst0, dst1);
1450  dst_tmp += dst_stride;
1451  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1452  src0, src1, src2, src3);
1453  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask0, src1, src1, mask0, src2,
1454  src2, mask0, src3, src3, mask0, tmp0, tmp1, tmp2, tmp3);
1455  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask1, src1, src1, mask1, src2,
1456  src2, mask1, src3, src3, mask1, tmp4, tmp5, tmp6, tmp7);
1457  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask2, src1, src1, mask2, src2,
1458  src2, mask2, src3, src3, mask2, tmp8, tmp9, tmp10, tmp11);
1459  DUP4_ARG3(__lsx_vshuf_b, src0, src0, mask3, src1, src1, mask3, src2,
1460  src2, mask3, src3, src3, mask3, tmp12, tmp13, tmp14, tmp15);
1461  DUP4_ARG2(__lsx_vdp2_h_b, tmp0, filter0, tmp1, filter0, tmp2, filter0,
1462  tmp3, filter0, tmp0, tmp1, tmp2, tmp3);
1463  DUP4_ARG2(__lsx_vdp2_h_b, tmp8, filter2, tmp9, filter2, tmp10, filter2,
1464  tmp11, filter2, tmp8, tmp9, tmp10, tmp11);
1465  DUP4_ARG3(__lsx_vdp2add_h_b, tmp0, tmp4, filter1, tmp1, tmp5, filter1,
1466  tmp2, tmp6, filter1, tmp3, tmp7, filter1, tmp0, tmp1, tmp2, tmp3);
1467  DUP4_ARG3(__lsx_vdp2add_h_b, tmp8, tmp12, filter3, tmp9, tmp13, filter3,
1468  tmp10, tmp14, filter3, tmp11, tmp15, filter3, tmp4, tmp5, tmp6, tmp7);
1469  DUP4_ARG2(__lsx_vsadd_h, tmp0, tmp4, tmp1, tmp5, tmp2, tmp6, tmp3, tmp7,
1470  tmp0, tmp1, tmp2, tmp3);
1471  DUP2_ARG3(__lsx_vssrarni_b_h, tmp1, tmp0, 7, tmp3, tmp2, 7, tmp0, tmp1);
1472  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
1473  DUP2_ARG2(__lsx_vavgr_bu, dst0, tmp0, dst1, tmp1, dst0, dst1);
1474  __lsx_vst(dst0, dst, 0);
1475  __lsx_vst(dst1, dst, 16);
1476  dst += dst_stride;
1477  }
1478 }
1479 
1480 static void common_hz_8t_and_aver_dst_64w_lsx(const uint8_t *src,
1481  int32_t src_stride,
1482  uint8_t *dst, int32_t dst_stride,
1483  const int8_t *filter,
1484  int32_t height)
1485 {
1486  int32_t loop_cnt = height;
1487  __m128i src0, src1, src2, src3;
1488  __m128i filter0, filter1, filter2, filter3;
1489  __m128i mask0, mask1, mask2, mask3;
1490  __m128i out0, out1, out2, out3, dst0, dst1;
1491  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
1492 
1493  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
1494  src -= 3;
1495  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1496  mask3 = __lsx_vaddi_bu(mask0, 6);
1497  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1498  filter0, filter1, filter2, filter3);
1499 
1500  for (;loop_cnt--;) {
1501  DUP2_ARG2(__lsx_vld, src, 0, src, 16, src0, src2);
1502  src3 = __lsx_vld(src, 24);
1503  src1 = __lsx_vshuf_b(src2, src0, shuff);
1504  DUP2_ARG2(__lsx_vld, dst, 0, dst, 16, dst0, dst1);
1505  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1506  src0, src1, src2, src3);
1507  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
1508  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
1509  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
1510  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
1511  DUP2_ARG2(__lsx_vavgr_bu, out0, dst0, out1, dst1, out0, out1);
1512  __lsx_vst(out0, dst, 0);
1513  __lsx_vst(out1, dst, 16);
1514 
1515  DUP2_ARG2(__lsx_vld, src, 32, src, 48, src0, src2);
1516  src3 = __lsx_vld(src, 56);
1517  src1 = __lsx_vshuf_b(src2, src0, shuff);
1518  DUP2_ARG2(__lsx_vld, dst, 32, dst, 48, dst0, dst1);
1519  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1520  src0, src1, src2, src3);
1521  HORIZ_8TAP_8WID_4VECS_FILT(src0, src1, src2, src3, mask0, mask1, mask2,
1522  mask3, filter0, filter1, filter2, filter3, out0, out1, out2, out3);
1523  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
1524  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
1525  DUP2_ARG2(__lsx_vavgr_bu, out0, dst0, out1, dst1, out0, out1);
1526  __lsx_vst(out0, dst, 32);
1527  __lsx_vst(out1, dst, 48);
1528  src += src_stride;
1529  dst += dst_stride;
1530  }
1531 }
1532 
1533 static void common_vt_8t_and_aver_dst_4w_lsx(const uint8_t *src,
1534  int32_t src_stride,
1535  uint8_t *dst, int32_t dst_stride,
1536  const int8_t *filter,
1537  int32_t height)
1538 {
1539  uint32_t loop_cnt = height >> 2;
1540  uint8_t *dst_tmp = dst;
1541  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
1542  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
1543  __m128i reg0, reg1, reg2, reg3, reg4;
1544  __m128i filter0, filter1, filter2, filter3;
1545  __m128i out0, out1;
1546  int32_t src_stride2 = src_stride << 1;
1547  int32_t src_stride3 = src_stride + src_stride2;
1548  int32_t src_stride4 = src_stride2 << 1;
1549  uint8_t* _src = (uint8_t*)src - src_stride3;
1550 
1551  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1552  filter0, filter1, filter2, filter3);
1553  src0 = __lsx_vld(_src, 0);
1554  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1555  src3 = __lsx_vldx(_src, src_stride3);
1556  _src += src_stride4;
1557  src4 = __lsx_vld(_src, 0);
1558  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
1559  _src += src_stride3;
1560  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1,
1561  tmp0, tmp1, tmp2, tmp3);
1562  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, tmp4, tmp5);
1563  DUP2_ARG2(__lsx_vilvl_d, tmp3, tmp0, tmp4, tmp1, reg0, reg1);
1564  reg2 = __lsx_vilvl_d(tmp5, tmp2);
1565  DUP2_ARG2(__lsx_vxori_b, reg0, 128, reg1, 128, reg0, reg1);
1566  reg2 = __lsx_vxori_b(reg2, 128);
1567 
1568  for (;loop_cnt--;) {
1569  src7 = __lsx_vld(_src, 0);
1570  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
1571  src10 = __lsx_vldx(_src, src_stride3);
1572  _src += src_stride4;
1573  src0 = __lsx_vldrepl_w(dst_tmp, 0);
1574  dst_tmp += dst_stride;
1575  src1 = __lsx_vldrepl_w(dst_tmp, 0);
1576  dst_tmp += dst_stride;
1577  src2 = __lsx_vldrepl_w(dst_tmp, 0);
1578  dst_tmp += dst_stride;
1579  src3 = __lsx_vldrepl_w(dst_tmp, 0);
1580  dst_tmp += dst_stride;
1581  DUP2_ARG2(__lsx_vilvl_w, src1, src0, src3, src2, src0, src1);
1582  src0 = __lsx_vilvl_d(src1, src0);
1583  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8, src10,
1584  src9, tmp0, tmp1, tmp2, tmp3);
1585  DUP2_ARG2(__lsx_vilvl_d, tmp1, tmp0, tmp3, tmp2, reg3, reg4);
1586  DUP2_ARG2(__lsx_vxori_b, reg3, 128, reg4, 128, reg3, reg4);
1587  out0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, reg3, filter0,
1588  filter1, filter2, filter3);
1589  out1 = FILT_8TAP_DPADD_S_H(reg1, reg2, reg3, reg4, filter0,
1590  filter1, filter2, filter3);
1591  out0 = __lsx_vssrarni_b_h(out1, out0, 7);
1592  out0 = __lsx_vxori_b(out0, 128);
1593  out0 = __lsx_vavgr_bu(out0, src0);
1594  __lsx_vstelm_w(out0, dst, 0, 0);
1595  dst += dst_stride;
1596  __lsx_vstelm_w(out0, dst, 0, 1);
1597  dst += dst_stride;
1598  __lsx_vstelm_w(out0, dst, 0, 2);
1599  dst += dst_stride;
1600  __lsx_vstelm_w(out0, dst, 0, 3);
1601  dst += dst_stride;
1602  reg0 = reg2;
1603  reg1 = reg3;
1604  reg2 = reg4;
1605  src6 = src10;
1606  }
1607 }
1608 
1609 static void common_vt_8t_and_aver_dst_8w_lsx(const uint8_t *src,
1610  int32_t src_stride,
1611  uint8_t *dst, int32_t dst_stride,
1612  const int8_t *filter,
1613  int32_t height)
1614 {
1615  uint32_t loop_cnt = height >> 2;
1616  uint8_t *dst_tmp = dst;
1617  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
1618  __m128i tmp0, tmp1, tmp2, tmp3;
1619  __m128i reg0, reg1, reg2, reg3, reg4, reg5;
1620  __m128i filter0, filter1, filter2, filter3;
1621  __m128i out0, out1, out2, out3;
1622  int32_t src_stride2 = src_stride << 1;
1623  int32_t src_stride3 = src_stride + src_stride2;
1624  int32_t src_stride4 = src_stride2 << 1;
1625  uint8_t* _src = (uint8_t*)src - src_stride3;
1626 
1627  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1628  filter0, filter1, filter2, filter3);
1629 
1630  src0 = __lsx_vld(_src, 0);
1631  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1632  src3 = __lsx_vldx(_src, src_stride3);
1633  _src += src_stride4;
1634  src4 = __lsx_vld(_src, 0);
1635  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
1636  _src += src_stride3;
1637  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1638  src0, src1, src2, src3);
1639  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
1640  src6 = __lsx_vxori_b(src6, 128);
1641  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2,
1642  src1, reg0, reg1, reg2, reg3);
1643  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, reg4, reg5);
1644 
1645  for (;loop_cnt--;) {
1646  src7 = __lsx_vld(_src, 0);
1647  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
1648  src10 = __lsx_vldx(_src, src_stride3);
1649  _src += src_stride4;
1650  src0 = __lsx_vldrepl_d(dst_tmp, 0);
1651  dst_tmp += dst_stride;
1652  src1 = __lsx_vldrepl_d(dst_tmp, 0);
1653  dst_tmp += dst_stride;
1654  src2 = __lsx_vldrepl_d(dst_tmp, 0);
1655  dst_tmp += dst_stride;
1656  src3 = __lsx_vldrepl_d(dst_tmp, 0);
1657  dst_tmp += dst_stride;
1658  DUP2_ARG2(__lsx_vilvl_d, src1, src0, src3, src2, src0, src1);
1659  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
1660  src7, src8, src9, src10);
1661  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8, src10,
1662  src9, tmp0, tmp1, tmp2, tmp3);
1663  out0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, tmp0, filter0,
1664  filter1, filter2, filter3);
1665  out1 = FILT_8TAP_DPADD_S_H(reg3, reg4, reg5, tmp1, filter0,
1666  filter1, filter2, filter3);
1667  out2 = FILT_8TAP_DPADD_S_H(reg1, reg2, tmp0, tmp2, filter0,
1668  filter1, filter2, filter3);
1669  out3 = FILT_8TAP_DPADD_S_H(reg4, reg5, tmp1, tmp3, filter0,
1670  filter1, filter2, filter3);
1671  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, out3, out2, 7, out0, out1);
1672  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
1673  DUP2_ARG2(__lsx_vavgr_bu, out0, src0, out1, src1, out0, out1);
1674  __lsx_vstelm_d(out0, dst, 0, 0);
1675  dst += dst_stride;
1676  __lsx_vstelm_d(out0, dst, 0, 1);
1677  dst += dst_stride;
1678  __lsx_vstelm_d(out1, dst, 0, 0);
1679  dst += dst_stride;
1680  __lsx_vstelm_d(out1, dst, 0, 1);
1681  dst += dst_stride;
1682 
1683  reg0 = reg2;
1684  reg1 = tmp0;
1685  reg2 = tmp2;
1686  reg3 = reg5;
1687  reg4 = tmp1;
1688  reg5 = tmp3;
1689  src6 = src10;
1690  }
1691 }
1692 
1693 static void common_vt_8t_and_aver_dst_16w_mult_lsx(const uint8_t *src,
1694  int32_t src_stride,
1695  uint8_t *dst,
1696  int32_t dst_stride,
1697  const int8_t *filter,
1698  int32_t height,
1699  int32_t width)
1700 {
1701  uint8_t *src_tmp;
1702  uint32_t cnt = width >> 4;
1703  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
1704  __m128i filter0, filter1, filter2, filter3;
1705  __m128i reg0, reg1, reg2, reg3, reg4, reg5;
1706  __m128i reg6, reg7, reg8, reg9, reg10, reg11;
1707  __m128i tmp0, tmp1, tmp2, tmp3;
1708  int32_t src_stride2 = src_stride << 1;
1709  int32_t src_stride3 = src_stride + src_stride2;
1710  int32_t src_stride4 = src_stride2 << 1;
1711  int32_t dst_stride2 = dst_stride << 1;
1712  int32_t dst_stride3 = dst_stride2 + dst_stride;
1713  int32_t dst_stride4 = dst_stride2 << 1;
1714  uint8_t *_src = (uint8_t*)src - src_stride3;
1715 
1716  DUP4_ARG2(__lsx_vldrepl_h, filter, 0, filter, 2, filter, 4, filter, 6,
1717  filter0, filter1, filter2, filter3);
1718  for (;cnt--;) {
1719  uint32_t loop_cnt = height >> 2;
1720  uint8_t *dst_reg = dst;
1721 
1722  src_tmp = _src;
1723  src0 = __lsx_vld(src_tmp, 0);
1724  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
1725  src1, src2);
1726  src3 = __lsx_vldx(src_tmp, src_stride3);
1727  src_tmp += src_stride4;
1728  src4 = __lsx_vld(src_tmp, 0);
1729  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
1730  src5, src6);
1731  src_tmp += src_stride3;
1732  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1733  src0, src1, src2, src3);
1734  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
1735  src6 = __lsx_vxori_b(src6, 128);
1736  DUP4_ARG2(__lsx_vilvl_b, src1, src0, src3, src2, src5, src4, src2, src1,
1737  reg0, reg1, reg2, reg3);
1738  DUP2_ARG2(__lsx_vilvl_b, src4, src3, src6, src5, reg4, reg5);
1739  DUP4_ARG2(__lsx_vilvh_b, src1, src0, src3, src2, src5, src4, src2, src1,
1740  reg6, reg7, reg8, reg9);
1741  DUP2_ARG2(__lsx_vilvh_b, src4, src3, src6, src5, reg10, reg11);
1742 
1743  for (;loop_cnt--;) {
1744  src7 = __lsx_vld(src_tmp, 0);
1745  DUP2_ARG2(__lsx_vldx, src_tmp, src_stride, src_tmp, src_stride2,
1746  src8, src9);
1747  src10 = __lsx_vldx(src_tmp, src_stride3);
1748  src_tmp += src_stride4;
1749  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10,
1750  128, src7, src8, src9, src10);
1751  DUP4_ARG2(__lsx_vilvl_b, src7, src6, src8, src7, src9, src8,
1752  src10, src9, src0, src1, src2, src3);
1753  DUP4_ARG2(__lsx_vilvh_b, src7, src6, src8, src7, src9, src8,
1754  src10, src9, src4, src5, src7, src8);
1755  tmp0 = FILT_8TAP_DPADD_S_H(reg0, reg1, reg2, src0, filter0,
1756  filter1, filter2, filter3);
1757  tmp1 = FILT_8TAP_DPADD_S_H(reg3, reg4, reg5, src1, filter0,
1758  filter1, filter2, filter3);
1759  tmp2 = FILT_8TAP_DPADD_S_H(reg6, reg7, reg8, src4, filter0,
1760  filter1, filter2, filter3);
1761  tmp3 = FILT_8TAP_DPADD_S_H(reg9, reg10, reg11, src5, filter0,
1762  filter1, filter2, filter3);
1763  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7,
1764  tmp0, tmp1);
1765  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
1766  tmp2 = __lsx_vld(dst_reg, 0);
1767  tmp3 = __lsx_vldx(dst_reg, dst_stride);
1768  DUP2_ARG2(__lsx_vavgr_bu, tmp0, tmp2, tmp1, tmp3, tmp0, tmp1);
1769  __lsx_vst(tmp0, dst_reg, 0);
1770  __lsx_vstx(tmp1, dst_reg, dst_stride);
1771  tmp0 = FILT_8TAP_DPADD_S_H(reg1, reg2, src0, src2, filter0,
1772  filter1, filter2, filter3);
1773  tmp1 = FILT_8TAP_DPADD_S_H(reg4, reg5, src1, src3, filter0,
1774  filter1, filter2, filter3);
1775  tmp2 = FILT_8TAP_DPADD_S_H(reg7, reg8, src4, src7, filter0,
1776  filter1, filter2, filter3);
1777  tmp3 = FILT_8TAP_DPADD_S_H(reg10, reg11, src5, src8, filter0,
1778  filter1, filter2, filter3);
1779  DUP2_ARG3(__lsx_vssrarni_b_h, tmp2, tmp0, 7, tmp3, tmp1, 7,
1780  tmp0, tmp1);
1781  DUP2_ARG2(__lsx_vxori_b, tmp0, 128, tmp1, 128, tmp0, tmp1);
1782  tmp2 = __lsx_vldx(dst_reg, dst_stride2);
1783  tmp3 = __lsx_vldx(dst_reg, dst_stride3);
1784  DUP2_ARG2(__lsx_vavgr_bu, tmp0, tmp2, tmp1, tmp3, tmp0, tmp1);
1785  __lsx_vstx(tmp0, dst_reg, dst_stride2);
1786  __lsx_vstx(tmp1, dst_reg, dst_stride3);
1787  dst_reg += dst_stride4;
1788 
1789  reg0 = reg2;
1790  reg1 = src0;
1791  reg2 = src2;
1792  reg3 = reg5;
1793  reg4 = src1;
1794  reg5 = src3;
1795  reg6 = reg8;
1796  reg7 = src4;
1797  reg8 = src7;
1798  reg9 = reg11;
1799  reg10 = src5;
1800  reg11 = src8;
1801  src6 = src10;
1802  }
1803  _src += 16;
1804  dst += 16;
1805  }
1806 }
1807 
1808 static void common_vt_8t_and_aver_dst_16w_lsx(const uint8_t *src,
1809  int32_t src_stride,
1810  uint8_t *dst, int32_t dst_stride,
1811  const int8_t *filter,
1812  int32_t height)
1813 {
1814  common_vt_8t_and_aver_dst_16w_mult_lsx(src, src_stride, dst, dst_stride,
1815  filter, height, 16);
1816 }
1817 
1818 static void common_vt_8t_and_aver_dst_32w_lsx(const uint8_t *src,
1819  int32_t src_stride,
1820  uint8_t *dst, int32_t dst_stride,
1821  const int8_t *filter,
1822  int32_t height)
1823 {
1824  common_vt_8t_and_aver_dst_16w_mult_lsx(src, src_stride, dst, dst_stride,
1825  filter, height, 32);
1826 }
1827 
1828 static void common_vt_8t_and_aver_dst_64w_lsx(const uint8_t *src,
1829  int32_t src_stride,
1830  uint8_t *dst, int32_t dst_stride,
1831  const int8_t *filter,
1832  int32_t height)
1833 {
1834  common_vt_8t_and_aver_dst_16w_mult_lsx(src, src_stride, dst, dst_stride,
1835  filter, height, 64);
1836 }
1837 
1838 static void common_hv_8ht_8vt_and_aver_dst_4w_lsx(const uint8_t *src,
1839  int32_t src_stride,
1840  uint8_t *dst,
1841  int32_t dst_stride,
1842  const int8_t *filter_horiz,
1843  const int8_t *filter_vert,
1844  int32_t height)
1845 {
1846  uint32_t loop_cnt = height >> 2;
1847  uint8_t *dst_tmp = dst;
1848  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
1849  __m128i filt_hz0, filt_hz1, filt_hz2, filt_hz3;
1850  __m128i filt_vt0, filt_vt1, filt_vt2, filt_vt3;
1851  __m128i mask0, mask1, mask2, mask3;
1852  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
1853  __m128i out0, out1;
1854  __m128i shuff = {0x0F0E0D0C0B0A0908, 0x1716151413121110};
1855  int32_t src_stride2 = src_stride << 1;
1856  int32_t src_stride3 = src_stride + src_stride2;
1857  int32_t src_stride4 = src_stride2 << 1;
1858  uint8_t* _src = (uint8_t*)src - 3 - src_stride3;
1859 
1860  mask0 = __lsx_vld(mc_filt_mask_arr, 16);
1861  DUP4_ARG2(__lsx_vldrepl_h, filter_horiz, 0, filter_horiz, 2, filter_horiz,
1862  4, filter_horiz, 6, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
1863  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1864  mask3 = __lsx_vaddi_bu(mask0, 6);
1865 
1866  src0 = __lsx_vld(_src, 0);
1867  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1868  src3 = __lsx_vldx(_src, src_stride3);
1869  _src += src_stride4;
1870  src4 = __lsx_vld(_src, 0);
1871  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
1872  _src += src_stride3;
1873 
1874  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1875  src0, src1, src2, src3);
1876  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
1877  src6 = __lsx_vxori_b(src6, 128);
1878 
1879  tmp0 = HORIZ_8TAP_FILT(src0, src1, mask0, mask1, mask2, mask3, filt_hz0,
1880  filt_hz1, filt_hz2, filt_hz3);
1881  tmp2 = HORIZ_8TAP_FILT(src2, src3, mask0, mask1, mask2, mask3, filt_hz0,
1882  filt_hz1, filt_hz2, filt_hz3);
1883  tmp4 = HORIZ_8TAP_FILT(src4, src5, mask0, mask1, mask2, mask3, filt_hz0,
1884  filt_hz1, filt_hz2, filt_hz3);
1885  tmp5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
1886  filt_hz1, filt_hz2, filt_hz3);
1887  DUP2_ARG3(__lsx_vshuf_b, tmp2, tmp0, shuff, tmp4, tmp2, shuff, tmp1, tmp3);
1888  DUP4_ARG2(__lsx_vldrepl_h, filter_vert, 0, filter_vert, 2, filter_vert, 4,
1889  filter_vert, 6, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
1890  DUP2_ARG2(__lsx_vpackev_b, tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
1891  tmp2 = __lsx_vpackev_b(tmp5, tmp4);
1892 
1893  for (;loop_cnt--;) {
1894  src7 = __lsx_vld(_src, 0);
1895  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
1896  src10 = __lsx_vldx(_src, src_stride3);
1897  _src += src_stride4;
1898  src2 = __lsx_vldrepl_w(dst_tmp, 0);
1899  dst_tmp += dst_stride;
1900  src3 = __lsx_vldrepl_w(dst_tmp, 0);
1901  dst_tmp += dst_stride;
1902  src4 = __lsx_vldrepl_w(dst_tmp, 0);
1903  dst_tmp += dst_stride;
1904  src5 = __lsx_vldrepl_w(dst_tmp, 0);
1905  dst_tmp += dst_stride;
1906  DUP2_ARG2(__lsx_vilvl_w, src3, src2, src5, src4, src2, src3);
1907  src2 = __lsx_vilvl_d(src3, src2);
1908  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
1909  src7, src8, src9, src10);
1910  tmp3 = HORIZ_8TAP_FILT(src7, src8, mask0, mask1, mask2, mask3, filt_hz0,
1911  filt_hz1, filt_hz2, filt_hz3);
1912  tmp4 = __lsx_vshuf_b(tmp3, tmp5, shuff);
1913  tmp4 = __lsx_vpackev_b(tmp3, tmp4);
1914  out0 = FILT_8TAP_DPADD_S_H(tmp0, tmp1, tmp2, tmp4, filt_vt0, filt_vt1,
1915  filt_vt2, filt_vt3);
1916  src1 = HORIZ_8TAP_FILT(src9, src10, mask0, mask1, mask2, mask3,
1917  filt_hz0, filt_hz1, filt_hz2, filt_hz3);
1918  src0 = __lsx_vshuf_b(src1, tmp3, shuff);
1919  src0 = __lsx_vpackev_b(src1, src0);
1920  out1 = FILT_8TAP_DPADD_S_H(tmp1, tmp2, tmp4, src0, filt_vt0, filt_vt1,
1921  filt_vt2, filt_vt3);
1922  out0 = __lsx_vssrarni_b_h(out1, out0, 7);
1923  out0 = __lsx_vxori_b(out0, 128);
1924  out0 = __lsx_vavgr_bu(out0, src2);
1925  __lsx_vstelm_w(out0, dst, 0, 0);
1926  dst += dst_stride;
1927  __lsx_vstelm_w(out0, dst, 0, 1);
1928  dst += dst_stride;
1929  __lsx_vstelm_w(out0, dst, 0, 2);
1930  dst += dst_stride;
1931  __lsx_vstelm_w(out0, dst, 0, 3);
1932  dst += dst_stride;
1933 
1934  tmp5 = src1;
1935  tmp0 = tmp2;
1936  tmp1 = tmp4;
1937  tmp2 = src0;
1938  }
1939 }
1940 
1941 static void common_hv_8ht_8vt_and_aver_dst_8w_lsx(const uint8_t *src,
1942  int32_t src_stride,
1943  uint8_t *dst,
1944  int32_t dst_stride,
1945  const int8_t *filter_horiz,
1946  const int8_t *filter_vert,
1947  int32_t height)
1948 {
1949  uint32_t loop_cnt = height >> 2;
1950  uint8_t *dst_tmp = dst;
1951  __m128i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
1952  __m128i filt_hz0, filt_hz1, filt_hz2, filt_hz3;
1953  __m128i filt_vt0, filt_vt1, filt_vt2, filt_vt3;
1954  __m128i mask0, mask1, mask2, mask3;
1955  __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
1956  __m128i out0, out1;
1957  int32_t src_stride2 = src_stride << 1;
1958  int32_t src_stride3 = src_stride + src_stride2;
1959  int32_t src_stride4 = src_stride2 << 1;
1960  uint8_t* _src = (uint8_t*)src - 3 - src_stride3;
1961 
1962  mask0 = __lsx_vld(mc_filt_mask_arr, 0);
1963  DUP4_ARG2(__lsx_vldrepl_h, filter_horiz, 0, filter_horiz, 2, filter_horiz,
1964  4, filter_horiz, 6, filt_hz0, filt_hz1, filt_hz2, filt_hz3);
1965  DUP2_ARG2(__lsx_vaddi_bu, mask0, 2, mask0, 4, mask1, mask2);
1966  mask3 = __lsx_vaddi_bu(mask0, 6);
1967 
1968  src0 = __lsx_vld(_src, 0);
1969  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
1970  src3 = __lsx_vldx(_src, src_stride3);
1971  _src += src_stride4;
1972  src4 = __lsx_vld(_src, 0);
1973  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src5, src6);
1974  _src += src_stride3;
1975  DUP4_ARG2(__lsx_vxori_b, src0, 128, src1, 128, src2, 128, src3, 128,
1976  src0, src1, src2, src3);
1977  DUP2_ARG2(__lsx_vxori_b, src4, 128, src5, 128, src4, src5);
1978  src6 = __lsx_vxori_b(src6, 128);
1979 
1980  src0 = HORIZ_8TAP_FILT(src0, src0, mask0, mask1, mask2, mask3, filt_hz0,
1981  filt_hz1, filt_hz2, filt_hz3);
1982  src1 = HORIZ_8TAP_FILT(src1, src1, mask0, mask1, mask2, mask3, filt_hz0,
1983  filt_hz1, filt_hz2, filt_hz3);
1984  src2 = HORIZ_8TAP_FILT(src2, src2, mask0, mask1, mask2, mask3, filt_hz0,
1985  filt_hz1, filt_hz2, filt_hz3);
1986  src3 = HORIZ_8TAP_FILT(src3, src3, mask0, mask1, mask2, mask3, filt_hz0,
1987  filt_hz1, filt_hz2, filt_hz3);
1988  src4 = HORIZ_8TAP_FILT(src4, src4, mask0, mask1, mask2, mask3, filt_hz0,
1989  filt_hz1, filt_hz2, filt_hz3);
1990  src5 = HORIZ_8TAP_FILT(src5, src5, mask0, mask1, mask2, mask3, filt_hz0,
1991  filt_hz1, filt_hz2, filt_hz3);
1992  src6 = HORIZ_8TAP_FILT(src6, src6, mask0, mask1, mask2, mask3, filt_hz0,
1993  filt_hz1, filt_hz2, filt_hz3);
1994 
1995  DUP4_ARG2(__lsx_vldrepl_h, filter_vert, 0, filter_vert, 2, filter_vert, 4,
1996  filter_vert, 6, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
1997  DUP4_ARG2(__lsx_vpackev_b, src1, src0, src3, src2, src5, src4,
1998  src2, src1, tmp0, tmp1, tmp2, tmp4);
1999  DUP2_ARG2(__lsx_vpackev_b, src4, src3, src6, src5, tmp5, tmp6);
2000 
2001  for (;loop_cnt--;) {
2002  src7 = __lsx_vld(_src, 0);
2003  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src8, src9);
2004  src10 = __lsx_vldx(_src, src_stride3);
2005  _src += src_stride4;
2006 
2007  DUP4_ARG2(__lsx_vxori_b, src7, 128, src8, 128, src9, 128, src10, 128,
2008  src7, src8, src9, src10);
2009  src7 = HORIZ_8TAP_FILT(src7, src7, mask0, mask1, mask2, mask3, filt_hz0,
2010  filt_hz1, filt_hz2, filt_hz3);
2011  tmp3 = __lsx_vpackev_b(src7, src6);
2012  out0 = FILT_8TAP_DPADD_S_H(tmp0, tmp1, tmp2, tmp3, filt_vt0, filt_vt1,
2013  filt_vt2, filt_vt3);
2014  src8 = HORIZ_8TAP_FILT(src8, src8, mask0, mask1, mask2, mask3, filt_hz0,
2015  filt_hz1, filt_hz2, filt_hz3);
2016  src0 = __lsx_vpackev_b(src8, src7);
2017  out1 = FILT_8TAP_DPADD_S_H(tmp4, tmp5, tmp6, src0, filt_vt0, filt_vt1,
2018  filt_vt2, filt_vt3);
2019  src9 = HORIZ_8TAP_FILT(src9, src9, mask0, mask1, mask2, mask3, filt_hz0,
2020  filt_hz1, filt_hz2, filt_hz3);
2021  src1 = __lsx_vpackev_b(src9, src8);
2022  src3 = FILT_8TAP_DPADD_S_H(tmp1, tmp2, tmp3, src1, filt_vt0, filt_vt1,
2023  filt_vt2, filt_vt3);
2024  src10 = HORIZ_8TAP_FILT(src10, src10, mask0, mask1, mask2, mask3, filt_hz0,
2025  filt_hz1, filt_hz2, filt_hz3);
2026  src2 = __lsx_vpackev_b(src10, src9);
2027  src4 = FILT_8TAP_DPADD_S_H(tmp5, tmp6, src0, src2, filt_vt0, filt_vt1,
2028  filt_vt2, filt_vt3);
2029  DUP2_ARG3(__lsx_vssrarni_b_h, out1, out0, 7, src4, src3, 7, out0, out1);
2030  DUP2_ARG2(__lsx_vxori_b, out0, 128, out1, 128, out0, out1);
2031  src5 = __lsx_vldrepl_d(dst_tmp, 0);
2032  dst_tmp += dst_stride;
2033  src7 = __lsx_vldrepl_d(dst_tmp, 0);
2034  dst_tmp += dst_stride;
2035  src8 = __lsx_vldrepl_d(dst_tmp, 0);
2036  dst_tmp += dst_stride;
2037  src9 = __lsx_vldrepl_d(dst_tmp, 0);
2038  dst_tmp += dst_stride;
2039  DUP2_ARG2(__lsx_vilvl_d, src7, src5, src9, src8, src5, src7);
2040  DUP2_ARG2(__lsx_vavgr_bu, out0, src5, out1, src7, out0, out1);
2041  __lsx_vstelm_d(out0, dst, 0, 0);
2042  dst += dst_stride;
2043  __lsx_vstelm_d(out0, dst, 0, 1);
2044  dst += dst_stride;
2045  __lsx_vstelm_d(out1, dst, 0, 0);
2046  dst += dst_stride;
2047  __lsx_vstelm_d(out1, dst, 0, 1);
2048  dst += dst_stride;
2049 
2050  src6 = src10;
2051  tmp0 = tmp2;
2052  tmp1 = tmp3;
2053  tmp2 = src1;
2054  tmp4 = tmp6;
2055  tmp5 = src0;
2056  tmp6 = src2;
2057  }
2058 }
2059 
2060 static void common_hv_8ht_8vt_and_aver_dst_16w_lsx(const uint8_t *src,
2061  int32_t src_stride,
2062  uint8_t *dst,
2063  int32_t dst_stride,
2064  const int8_t *filter_horiz,
2065  const int8_t *filter_vert,
2066  int32_t height)
2067 {
2068  int32_t multiple8_cnt;
2069 
2070  for (multiple8_cnt = 2; multiple8_cnt--;) {
2071  common_hv_8ht_8vt_and_aver_dst_8w_lsx(src, src_stride, dst, dst_stride,
2072  filter_horiz, filter_vert,
2073  height);
2074 
2075  src += 8;
2076  dst += 8;
2077  }
2078 }
2079 
2080 static void common_hv_8ht_8vt_and_aver_dst_32w_lsx(const uint8_t *src,
2081  int32_t src_stride,
2082  uint8_t *dst,
2083  int32_t dst_stride,
2084  const int8_t *filter_horiz,
2085  const int8_t *filter_vert,
2086  int32_t height)
2087 {
2088  int32_t multiple8_cnt;
2089 
2090  for (multiple8_cnt = 4; multiple8_cnt--;) {
2091  common_hv_8ht_8vt_and_aver_dst_8w_lsx(src, src_stride, dst, dst_stride,
2092  filter_horiz, filter_vert,
2093  height);
2094 
2095  src += 8;
2096  dst += 8;
2097  }
2098 }
2099 
2100 static void common_hv_8ht_8vt_and_aver_dst_64w_lsx(const uint8_t *src,
2101  int32_t src_stride,
2102  uint8_t *dst,
2103  int32_t dst_stride,
2104  const int8_t *filter_horiz,
2105  const int8_t *filter_vert,
2106  int32_t height)
2107 {
2108  int32_t multiple8_cnt;
2109 
2110  for (multiple8_cnt = 8; multiple8_cnt--;) {
2111  common_hv_8ht_8vt_and_aver_dst_8w_lsx(src, src_stride, dst, dst_stride,
2112  filter_horiz, filter_vert,
2113  height);
2114 
2115  src += 8;
2116  dst += 8;
2117  }
2118 }
2119 
2120 static void avg_width8_lsx(const uint8_t *src, int32_t src_stride,
2121  uint8_t *dst, int32_t dst_stride,
2122  int32_t height)
2123 {
2124  int32_t cnt = height >> 2;
2125  uint8_t *dst_tmp = dst;
2126  __m128i src0, src1, dst0, dst1;
2127  __m128i tmp0, tmp1, tmp2, tmp3;
2128 
2129  for (;cnt--;) {
2130  tmp0 = __lsx_vldrepl_d(src, 0);
2131  src += src_stride;
2132  tmp1 = __lsx_vldrepl_d(src, 0);
2133  src += src_stride;
2134  tmp2 = __lsx_vldrepl_d(src, 0);
2135  src += src_stride;
2136  tmp3 = __lsx_vldrepl_d(src, 0);
2137  src += src_stride;
2138  DUP2_ARG2(__lsx_vilvl_d, tmp1, tmp0, tmp3, tmp2, src0, src1);
2139  tmp0 = __lsx_vldrepl_d(dst_tmp, 0);
2140  dst_tmp += dst_stride;
2141  tmp1 = __lsx_vldrepl_d(dst_tmp, 0);
2142  dst_tmp += dst_stride;
2143  tmp2 = __lsx_vldrepl_d(dst_tmp, 0);
2144  dst_tmp += dst_stride;
2145  tmp3 = __lsx_vldrepl_d(dst_tmp, 0);
2146  dst_tmp += dst_stride;
2147  DUP2_ARG2(__lsx_vilvl_d, tmp1, tmp0, tmp3, tmp2, dst0, dst1);
2148  DUP2_ARG2(__lsx_vavgr_bu, src0, dst0, src1, dst1, dst0, dst1);
2149  __lsx_vstelm_d(dst0, dst, 0, 0);
2150  dst += dst_stride;
2151  __lsx_vstelm_d(dst0, dst, 0, 1);
2152  dst += dst_stride;
2153  __lsx_vstelm_d(dst1, dst, 0, 0);
2154  dst += dst_stride;
2155  __lsx_vstelm_d(dst1, dst, 0, 1);
2156  dst += dst_stride;
2157  }
2158 }
2159 
2160 static void avg_width16_lsx(const uint8_t *src, int32_t src_stride,
2161  uint8_t *dst, int32_t dst_stride,
2162  int32_t height)
2163 {
2164  int32_t cnt = height >> 2;
2165  __m128i src0, src1, src2, src3;
2166  __m128i dst0, dst1, dst2, dst3;
2167  int32_t src_stride2 = src_stride << 1;
2168  int32_t src_stride3 = src_stride + src_stride2;
2169  int32_t src_stride4 = src_stride2 << 1;
2170  int32_t dst_stride2 = dst_stride << 1;
2171  int32_t dst_stride3 = dst_stride2 + dst_stride;
2172  int32_t dst_stride4 = dst_stride2 << 1;
2173  uint8_t* _src = (uint8_t*)src;
2174 
2175  for (;cnt--;) {
2176  src0 = __lsx_vld(_src, 0);
2177  DUP2_ARG2(__lsx_vldx, _src, src_stride, _src, src_stride2, src1, src2);
2178  src3 = __lsx_vldx(_src, src_stride3);
2179  _src += src_stride4;
2180 
2181  dst0 = __lsx_vld(dst, 0);
2182  DUP2_ARG2(__lsx_vldx, dst, dst_stride, dst, dst_stride2,
2183  dst1, dst2);
2184  dst3 = __lsx_vldx(dst, dst_stride3);
2185  DUP4_ARG2(__lsx_vavgr_bu, src0, dst0, src1, dst1,
2186  src2, dst2, src3, dst3, dst0, dst1, dst2, dst3);
2187  __lsx_vst(dst0, dst, 0);
2188  __lsx_vstx(dst1, dst, dst_stride);
2189  __lsx_vstx(dst2, dst, dst_stride2);
2190  __lsx_vstx(dst3, dst, dst_stride3);
2191  dst += dst_stride4;
2192  }
2193 }
2194 
2195 static void avg_width32_lsx(const uint8_t *src, int32_t src_stride,
2196  uint8_t *dst, int32_t dst_stride,
2197  int32_t height)
2198 {
2199  int32_t cnt = height >> 2;
2200  uint8_t *src_tmp1 = (uint8_t*)src;
2201  uint8_t *src_tmp2 = src_tmp1 + 16;
2202  uint8_t *dst_tmp1, *dst_tmp2;
2203  __m128i src0, src1, src2, src3, src4, src5, src6, src7;
2204  __m128i dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
2205  int32_t src_stride2 = src_stride << 1;
2206  int32_t src_stride3 = src_stride + src_stride2;
2207  int32_t src_stride4 = src_stride2 << 1;
2208  int32_t dst_stride2 = dst_stride << 1;
2209  int32_t dst_stride3 = dst_stride2 + dst_stride;
2210  int32_t dst_stride4 = dst_stride2 << 1;
2211 
2212  dst_tmp1 = dst;
2213  dst_tmp2 = dst + 16;
2214  for (;cnt--;) {
2215  src0 = __lsx_vld(src_tmp1, 0);
2216  DUP2_ARG2(__lsx_vldx, src_tmp1, src_stride, src_tmp1, src_stride2,
2217  src2, src4);
2218  src6 = __lsx_vldx(src_tmp1, src_stride3);
2219  src_tmp1 += src_stride4;
2220 
2221  src1 = __lsx_vld(src_tmp2, 0);
2222  DUP2_ARG2(__lsx_vldx, src_tmp2, src_stride, src_tmp2, src_stride2,
2223  src3, src5);
2224  src7 = __lsx_vldx(src_tmp2, src_stride3);
2225  src_tmp2 += src_stride4;
2226 
2227  dst0 = __lsx_vld(dst_tmp1, 0);
2228  DUP2_ARG2(__lsx_vldx, dst_tmp1, dst_stride, dst_tmp1, dst_stride2,
2229  dst2, dst4);
2230  dst6 = __lsx_vldx(dst_tmp1, dst_stride3);
2231  dst1 = __lsx_vld(dst_tmp2, 0);
2232  DUP2_ARG2(__lsx_vldx, dst_tmp2, dst_stride, dst_tmp2, dst_stride2,
2233  dst3, dst5);
2234  dst7 = __lsx_vldx(dst_tmp2, dst_stride3);
2235 
2236  DUP4_ARG2(__lsx_vavgr_bu, src0, dst0, src1, dst1,
2237  src2, dst2, src3, dst3, dst0, dst1, dst2, dst3);
2238  DUP4_ARG2(__lsx_vavgr_bu, src4, dst4, src5, dst5,
2239  src6, dst6, src7, dst7, dst4, dst5, dst6, dst7);
2240  __lsx_vst(dst0, dst_tmp1, 0);
2241  __lsx_vstx(dst2, dst_tmp1, dst_stride);
2242  __lsx_vstx(dst4, dst_tmp1, dst_stride2);
2243  __lsx_vstx(dst6, dst_tmp1, dst_stride3);
2244  dst_tmp1 += dst_stride4;
2245  __lsx_vst(dst1, dst_tmp2, 0);
2246  __lsx_vstx(dst3, dst_tmp2, dst_stride);
2247  __lsx_vstx(dst5, dst_tmp2, dst_stride2);
2248  __lsx_vstx(dst7, dst_tmp2, dst_stride3);
2249  dst_tmp2 += dst_stride4;
2250  }
2251 }
2252 
2253 static void avg_width64_lsx(const uint8_t *src, int32_t src_stride,
2254  uint8_t *dst, int32_t dst_stride,
2255  int32_t height)
2256 {
2257  int32_t cnt = height >> 2;
2258  uint8_t *dst_tmp = dst;
2259  __m128i src0, src1, src2, src3, src4, src5, src6, src7;
2260  __m128i src8, src9, src10, src11, src12, src13, src14, src15;
2261  __m128i dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
2262  __m128i dst8, dst9, dst10, dst11, dst12, dst13, dst14, dst15;
2263 
2264  for (;cnt--;) {
2265  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
2266  src0, src1, src2, src3);
2267  src += src_stride;
2268  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
2269  src4, src5, src6, src7);
2270  src += src_stride;
2271  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
2272  src8, src9, src10, src11);
2273  src += src_stride;
2274  DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48,
2275  src12, src13, src14, src15);
2276  src += src_stride;
2277  DUP4_ARG2(__lsx_vld, dst_tmp, 0, dst_tmp, 16, dst_tmp, 32, dst_tmp, 48,
2278  dst0, dst1, dst2, dst3);
2279  dst_tmp += dst_stride;
2280  DUP4_ARG2(__lsx_vld, dst_tmp, 0, dst_tmp, 16, dst_tmp, 32, dst_tmp, 48,
2281  dst4, dst5, dst6, dst7);
2282  dst_tmp += dst_stride;
2283  DUP4_ARG2(__lsx_vld, dst_tmp, 0, dst_tmp, 16, dst_tmp, 32, dst_tmp, 48,
2284  dst8, dst9, dst10, dst11);
2285  dst_tmp += dst_stride;
2286  DUP4_ARG2(__lsx_vld, dst_tmp, 0, dst_tmp, 16, dst_tmp, 32, dst_tmp, 48,
2287  dst12, dst13, dst14, dst15);
2288  dst_tmp += dst_stride;
2289  DUP4_ARG2(__lsx_vavgr_bu, src0, dst0, src1, dst1,
2290  src2, dst2, src3, dst3, dst0, dst1, dst2, dst3);
2291  DUP4_ARG2(__lsx_vavgr_bu, src4, dst4, src5, dst5,
2292  src6, dst6, src7, dst7, dst4, dst5, dst6, dst7);
2293  DUP4_ARG2(__lsx_vavgr_bu, src8, dst8, src9, dst9, src10,
2294  dst10, src11, dst11, dst8, dst9, dst10, dst11);
2295  DUP4_ARG2(__lsx_vavgr_bu, src12, dst12, src13, dst13, src14,
2296  dst14, src15, dst15, dst12, dst13, dst14, dst15);
2297  __lsx_vst(dst0, dst, 0);
2298  __lsx_vst(dst1, dst, 16);
2299  __lsx_vst(dst2, dst, 32);
2300  __lsx_vst(dst3, dst, 48);
2301  dst += dst_stride;
2302  __lsx_vst(dst4, dst, 0);
2303  __lsx_vst(dst5, dst, 16);
2304  __lsx_vst(dst6, dst, 32);
2305  __lsx_vst(dst7, dst, 48);
2306  dst += dst_stride;
2307  __lsx_vst(dst8, dst, 0);
2308  __lsx_vst(dst9, dst, 16);
2309  __lsx_vst(dst10, dst, 32);
2310  __lsx_vst(dst11, dst, 48);
2311  dst += dst_stride;
2312  __lsx_vst(dst12, dst, 0);
2313  __lsx_vst(dst13, dst, 16);
2314  __lsx_vst(dst14, dst, 32);
2315  __lsx_vst(dst15, dst, 48);
2316  dst += dst_stride;
2317  }
2318 }
2319 
2320 static const int8_t vp9_subpel_filters_lsx[3][15][8] = {
2321  [FILTER_8TAP_REGULAR] = {
2322  {0, 1, -5, 126, 8, -3, 1, 0},
2323  {-1, 3, -10, 122, 18, -6, 2, 0},
2324  {-1, 4, -13, 118, 27, -9, 3, -1},
2325  {-1, 4, -16, 112, 37, -11, 4, -1},
2326  {-1, 5, -18, 105, 48, -14, 4, -1},
2327  {-1, 5, -19, 97, 58, -16, 5, -1},
2328  {-1, 6, -19, 88, 68, -18, 5, -1},
2329  {-1, 6, -19, 78, 78, -19, 6, -1},
2330  {-1, 5, -18, 68, 88, -19, 6, -1},
2331  {-1, 5, -16, 58, 97, -19, 5, -1},
2332  {-1, 4, -14, 48, 105, -18, 5, -1},
2333  {-1, 4, -11, 37, 112, -16, 4, -1},
2334  {-1, 3, -9, 27, 118, -13, 4, -1},
2335  {0, 2, -6, 18, 122, -10, 3, -1},
2336  {0, 1, -3, 8, 126, -5, 1, 0},
2337  }, [FILTER_8TAP_SHARP] = {
2338  {-1, 3, -7, 127, 8, -3, 1, 0},
2339  {-2, 5, -13, 125, 17, -6, 3, -1},
2340  {-3, 7, -17, 121, 27, -10, 5, -2},
2341  {-4, 9, -20, 115, 37, -13, 6, -2},
2342  {-4, 10, -23, 108, 48, -16, 8, -3},
2343  {-4, 10, -24, 100, 59, -19, 9, -3},
2344  {-4, 11, -24, 90, 70, -21, 10, -4},
2345  {-4, 11, -23, 80, 80, -23, 11, -4},
2346  {-4, 10, -21, 70, 90, -24, 11, -4},
2347  {-3, 9, -19, 59, 100, -24, 10, -4},
2348  {-3, 8, -16, 48, 108, -23, 10, -4},
2349  {-2, 6, -13, 37, 115, -20, 9, -4},
2350  {-2, 5, -10, 27, 121, -17, 7, -3},
2351  {-1, 3, -6, 17, 125, -13, 5, -2},
2352  {0, 1, -3, 8, 127, -7, 3, -1},
2353  }, [FILTER_8TAP_SMOOTH] = {
2354  {-3, -1, 32, 64, 38, 1, -3, 0},
2355  {-2, -2, 29, 63, 41, 2, -3, 0},
2356  {-2, -2, 26, 63, 43, 4, -4, 0},
2357  {-2, -3, 24, 62, 46, 5, -4, 0},
2358  {-2, -3, 21, 60, 49, 7, -4, 0},
2359  {-1, -4, 18, 59, 51, 9, -4, 0},
2360  {-1, -4, 16, 57, 53, 12, -4, -1},
2361  {-1, -4, 14, 55, 55, 14, -4, -1},
2362  {-1, -4, 12, 53, 57, 16, -4, -1},
2363  {0, -4, 9, 51, 59, 18, -4, -1},
2364  {0, -4, 7, 49, 60, 21, -3, -2},
2365  {0, -4, 5, 46, 62, 24, -3, -2},
2366  {0, -4, 4, 43, 63, 26, -2, -2},
2367  {0, -3, 2, 41, 63, 29, -2, -2},
2368  {0, -3, 1, 38, 64, 32, -1, -3},
2369  }
2370 };
2371 
2372 #define VP9_8TAP_LOONGARCH_LSX_FUNC(SIZE, type, type_idx) \
2373 void ff_put_8tap_##type##_##SIZE##h_lsx(uint8_t *dst, ptrdiff_t dststride, \
2374  const uint8_t *src, \
2375  ptrdiff_t srcstride, \
2376  int h, int mx, int my) \
2377 { \
2378  const int8_t *filter = vp9_subpel_filters_lsx[type_idx][mx-1]; \
2379  \
2380  common_hz_8t_##SIZE##w_lsx(src, srcstride, dst, dststride, filter, h); \
2381 } \
2382  \
2383 void ff_put_8tap_##type##_##SIZE##v_lsx(uint8_t *dst, ptrdiff_t dststride, \
2384  const uint8_t *src, \
2385  ptrdiff_t srcstride, \
2386  int h, int mx, int my) \
2387 { \
2388  const int8_t *filter = vp9_subpel_filters_lsx[type_idx][my-1]; \
2389  \
2390  common_vt_8t_##SIZE##w_lsx(src, srcstride, dst, dststride, filter, h); \
2391 } \
2392  \
2393 void ff_put_8tap_##type##_##SIZE##hv_lsx(uint8_t *dst, ptrdiff_t dststride, \
2394  const uint8_t *src, \
2395  ptrdiff_t srcstride, \
2396  int h, int mx, int my) \
2397 { \
2398  const int8_t *hfilter = vp9_subpel_filters_lsx[type_idx][mx-1]; \
2399  const int8_t *vfilter = vp9_subpel_filters_lsx[type_idx][my-1]; \
2400  \
2401  common_hv_8ht_8vt_##SIZE##w_lsx(src, srcstride, dst, dststride, hfilter, \
2402  vfilter, h); \
2403 } \
2404  \
2405 void ff_avg_8tap_##type##_##SIZE##h_lsx(uint8_t *dst, ptrdiff_t dststride, \
2406  const uint8_t *src, \
2407  ptrdiff_t srcstride, \
2408  int h, int mx, int my) \
2409 { \
2410  const int8_t *filter = vp9_subpel_filters_lsx[type_idx][mx-1]; \
2411  \
2412  common_hz_8t_and_aver_dst_##SIZE##w_lsx(src, srcstride, dst, \
2413  dststride, filter, h); \
2414 } \
2415  \
2416 void ff_avg_8tap_##type##_##SIZE##v_lsx(uint8_t *dst, ptrdiff_t dststride, \
2417  const uint8_t *src, \
2418  ptrdiff_t srcstride, \
2419  int h, int mx, int my) \
2420 { \
2421  const int8_t *filter = vp9_subpel_filters_lsx[type_idx][my-1]; \
2422  \
2423  common_vt_8t_and_aver_dst_##SIZE##w_lsx(src, srcstride, dst, dststride, \
2424  filter, h); \
2425 } \
2426  \
2427 void ff_avg_8tap_##type##_##SIZE##hv_lsx(uint8_t *dst, ptrdiff_t dststride, \
2428  const uint8_t *src, \
2429  ptrdiff_t srcstride, \
2430  int h, int mx, int my) \
2431 { \
2432  const int8_t *hfilter = vp9_subpel_filters_lsx[type_idx][mx-1]; \
2433  const int8_t *vfilter = vp9_subpel_filters_lsx[type_idx][my-1]; \
2434  \
2435  common_hv_8ht_8vt_and_aver_dst_##SIZE##w_lsx(src, srcstride, dst, \
2436  dststride, hfilter, \
2437  vfilter, h); \
2438 }
2439 
2440 #define VP9_COPY_LOONGARCH_LSX_FUNC(SIZE) \
2441 void ff_copy##SIZE##_lsx(uint8_t *dst, ptrdiff_t dststride, \
2442  const uint8_t *src, ptrdiff_t srcstride, \
2443  int h, int mx, int my) \
2444 { \
2445  \
2446  copy_width##SIZE##_lsx(src, srcstride, dst, dststride, h); \
2447 } \
2448 void ff_avg##SIZE##_lsx(uint8_t *dst, ptrdiff_t dststride, \
2449  const uint8_t *src, ptrdiff_t srcstride, \
2450  int h, int mx, int my) \
2451 { \
2452  \
2453  avg_width##SIZE##_lsx(src, srcstride, dst, dststride, h); \
2454 }
2455 
2461 
2467 
2473 
2478 
2479 #undef VP9_8TAP_LOONGARCH_LSX_FUNC
2480 #undef VP9_COPY_LOONGARCH_LSX_FUNC
common_vt_8t_8w_lsx
static void common_vt_8t_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:510
common_hz_8t_16w_lsx
static void common_hz_8t_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:314
stride
int stride
Definition: mace.c:144
common_vt_8t_and_aver_dst_4w_lsx
static void common_vt_8t_and_aver_dst_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1533
common_hz_8t_and_aver_dst_32w_lsx
static void common_hz_8t_and_aver_dst_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1423
common_vt_8t_and_aver_dst_64w_lsx
static void common_vt_8t_and_aver_dst_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1828
out
FILE * out
Definition: movenc.c:54
filter1
static void filter1(SUINT32 *dst, const int32_t *src, int32_t coeff, ptrdiff_t len)
Definition: dcadsp.c:358
common_hv_8ht_8vt_and_aver_dst_32w_lsx
static void common_hv_8ht_8vt_and_aver_dst_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:2080
common_vt_8t_and_aver_dst_8w_lsx
static void common_vt_8t_and_aver_dst_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1609
LSX_LD_4
#define LSX_LD_4(_src, _stride, _src0, _src1, _src2, _src3)
Definition: vp9_mc_lsx.c:121
common_vt_8t_16w_mult_lsx
static void common_vt_8t_16w_mult_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height, int32_t width)
Definition: vp9_mc_lsx.c:673
common_hz_8t_64w_lsx
static void common_hz_8t_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:400
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
VP9_COPY_LOONGARCH_LSX_FUNC
#define VP9_COPY_LOONGARCH_LSX_FUNC(SIZE)
Definition: vp9_mc_lsx.c:2440
common_hv_8ht_8vt_and_aver_dst_4w_lsx
static void common_hv_8ht_8vt_and_aver_dst_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:1838
DUP2_ARG2
#define DUP2_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _OUT0, _OUT1)
Definition: loongson_intrinsics.h:58
common_hz_8t_and_aver_dst_4x8_lsx
static void common_hz_8t_and_aver_dst_4x8_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
Definition: vp9_mc_lsx.c:1225
common_hz_8t_and_aver_dst_16w_lsx
static void common_hz_8t_and_aver_dst_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1365
VP9_8TAP_LOONGARCH_LSX_FUNC
#define VP9_8TAP_LOONGARCH_LSX_FUNC(SIZE, type, type_idx)
Definition: vp9_mc_lsx.c:2372
common_hz_8t_8x8mult_lsx
static void common_hz_8t_8x8mult_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:260
common_hz_8t_8x4_lsx
static void common_hz_8t_8x4_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
Definition: vp9_mc_lsx.c:228
FILTER_8TAP_SHARP
@ FILTER_8TAP_SHARP
Definition: vp9.h:67
common_vt_8t_4w_lsx
static void common_vt_8t_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:447
DUP4_ARG2
#define DUP4_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _IN6, _IN7, _OUT0, _OUT1, _OUT2, _OUT3)
Definition: loongson_intrinsics.h:76
width
#define width
copy_width16_lsx
static void copy_width16_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:1066
avg_width8_lsx
static void avg_width8_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:2120
common_vt_8t_16w_lsx
static void common_vt_8t_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:582
HORIZ_8TAP_4WID_4VECS_FILT
#define HORIZ_8TAP_4WID_4VECS_FILT(_src0, _src1, _src2, _src3, _mask0, _mask1, _mask2, _mask3, _filter0, _filter1, _filter2, _filter3, _out0, _out1)
Definition: vp9_mc_lsx.c:36
common_hv_8ht_8vt_16w_lsx
static void common_hv_8ht_8vt_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:991
common_hz_8t_32w_lsx
static void common_hz_8t_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:350
common_hv_8ht_8vt_and_aver_dst_8w_lsx
static void common_hv_8ht_8vt_and_aver_dst_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:1941
common_hv_8ht_8vt_8w_lsx
static void common_hv_8ht_8vt_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:885
src
#define src
Definition: vp8dsp.c:255
FILT_8TAP_DPADD_S_H
#define FILT_8TAP_DPADD_S_H(_reg0, _reg1, _reg2, _reg3, _filter0, _filter1, _filter2, _filter3)
Definition: vp9_mc_lsx.c:91
common_hz_8t_8w_lsx
static void common_hz_8t_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:302
vp9dsp.h
FILTER_8TAP_REGULAR
@ FILTER_8TAP_REGULAR
Definition: vp9.h:66
DUP2_ARG3
#define DUP2_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _OUT0, _OUT1)
Definition: loongson_intrinsics.h:64
common_vt_8t_and_aver_dst_16w_lsx
static void common_vt_8t_and_aver_dst_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1808
common_hv_8ht_8vt_and_aver_dst_64w_lsx
static void common_hv_8ht_8vt_and_aver_dst_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:2100
vp9_subpel_filters_lsx
static const int8_t vp9_subpel_filters_lsx[3][15][8]
Definition: vp9_mc_lsx.c:2320
height
#define height
common_vt_8t_and_aver_dst_32w_lsx
static void common_vt_8t_and_aver_dst_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1818
avg_width16_lsx
static void avg_width16_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:2160
common_hz_8t_4w_lsx
static void common_hz_8t_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:217
src0
#define src0
Definition: h264pred.c:139
src1
#define src1
Definition: h264pred.c:140
copy_width32_lsx
static void copy_width32_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:1093
vp9dsp_loongarch.h
FILTER_8TAP_SMOOTH
@ FILTER_8TAP_SMOOTH
Definition: vp9.h:65
smooth
static float smooth(DeshakeOpenCLContext *deshake_ctx, float *gauss_kernel, int length, float max_val, AVFifoBuffer *values)
Definition: vf_deshake_opencl.c:903
common_vt_8t_32w_lsx
static void common_vt_8t_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:782
common_hv_8ht_8vt_and_aver_dst_16w_lsx
static void common_hv_8ht_8vt_and_aver_dst_16w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:2060
avg_width64_lsx
static void avg_width64_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:2253
copy_width8_lsx
static void copy_width8_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:1039
avg_width32_lsx
static void avg_width32_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:2195
common_hz_8t_4x8_lsx
static void common_hz_8t_4x8_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
Definition: vp9_mc_lsx.c:164
HORIZ_8TAP_8WID_4VECS_FILT
#define HORIZ_8TAP_8WID_4VECS_FILT(_src0, _src1, _src2, _src3, _mask0, _mask1, _mask2, _mask3, _filter0, _filter1, _filter2, _filter3, _out0, _out1, _out2, _out3)
Definition: vp9_mc_lsx.c:61
copy_width64_lsx
static void copy_width64_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, int32_t height)
Definition: vp9_mc_lsx.c:1136
mc_filt_mask_arr
static const uint8_t mc_filt_mask_arr[16 *3]
Definition: vp9_mc_lsx.c:26
common_hv_8ht_8vt_4w_lsx
static void common_hv_8ht_8vt_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:797
common_hz_8t_and_aver_dst_64w_lsx
static void common_hz_8t_and_aver_dst_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1480
common_hv_8ht_8vt_32w_lsx
static void common_hv_8ht_8vt_32w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:1007
common_vt_8t_and_aver_dst_16w_mult_lsx
static void common_vt_8t_and_aver_dst_16w_mult_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height, int32_t width)
Definition: vp9_mc_lsx.c:1693
common_vt_8t_64w_lsx
static void common_vt_8t_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:789
filter0
static void filter0(SUINT32 *dst, const int32_t *src, int32_t coeff, ptrdiff_t len)
Definition: dcadsp.c:350
common_hz_8t_and_aver_dst_4w_lsx
static void common_hz_8t_and_aver_dst_4w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1297
loongson_intrinsics.h
HORIZ_8TAP_FILT
#define HORIZ_8TAP_FILT(_src0, _src1, _mask0, _mask1, _mask2, _mask3, _filt_h0, _filt_h1, _filt_h2, _filt_h3)
Definition: vp9_mc_lsx.c:105
common_hz_8t_4x4_lsx
static void common_hz_8t_4x4_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
Definition: vp9_mc_lsx.c:132
int32_t
int32_t
Definition: audioconvert.c:56
common_hz_8t_and_aver_dst_4x4_lsx
static void common_hz_8t_and_aver_dst_4x4_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter)
Definition: vp9_mc_lsx.c:1180
common_hv_8ht_8vt_64w_lsx
static void common_hv_8ht_8vt_64w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter_horiz, const int8_t *filter_vert, int32_t height)
Definition: vp9_mc_lsx.c:1023
common_hz_8t_and_aver_dst_8w_lsx
static void common_hz_8t_and_aver_dst_8w_lsx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, const int8_t *filter, int32_t height)
Definition: vp9_mc_lsx.c:1310
DUP4_ARG3
#define DUP4_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _IN6, _IN7, _IN8, _IN9, _IN10, _IN11, _OUT0, _OUT1, _OUT2, _OUT3)
Definition: loongson_intrinsics.h:83