FFmpeg
hpeldsp_lasx.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 Loongson Technology Corporation Limited
3  * Contributed by Shiyou Yin <yinshiyou-hf@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 
23 #include "hpeldsp_lasx.h"
24 
25 static av_always_inline void
26 put_pixels8_l2_8_lsx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
27  int dst_stride, int src_stride1, int src_stride2, int h)
28 {
29  int stride1_2, stride1_3, stride1_4;
30  int stride2_2, stride2_3, stride2_4;
31  __asm__ volatile (
32  "slli.d %[stride1_2], %[srcStride1], 1 \n\t"
33  "slli.d %[stride2_2], %[srcStride2], 1 \n\t"
34  "add.d %[stride1_3], %[stride1_2], %[srcStride1] \n\t"
35  "add.d %[stride2_3], %[stride2_2], %[srcStride2] \n\t"
36  "slli.d %[stride1_4], %[stride1_2], 1 \n\t"
37  "slli.d %[stride2_4], %[stride2_2], 1 \n\t"
38  "1: \n\t"
39  "vld $vr0, %[src1], 0 \n\t"
40  "vldx $vr1, %[src1], %[srcStride1] \n\t"
41  "vldx $vr2, %[src1], %[stride1_2] \n\t"
42  "vldx $vr3, %[src1], %[stride1_3] \n\t"
43  "add.d %[src1], %[src1], %[stride1_4] \n\t"
44 
45  "vld $vr4, %[src2], 0 \n\t"
46  "vldx $vr5, %[src2], %[srcStride2] \n\t"
47  "vldx $vr6, %[src2], %[stride2_2] \n\t"
48  "vldx $vr7, %[src2], %[stride2_3] \n\t"
49  "add.d %[src2], %[src2], %[stride2_4] \n\t"
50 
51  "addi.d %[h], %[h], -4 \n\t"
52 
53  "vavgr.bu $vr0, $vr4, $vr0 \n\t"
54  "vavgr.bu $vr1, $vr5, $vr1 \n\t"
55  "vavgr.bu $vr2, $vr6, $vr2 \n\t"
56  "vavgr.bu $vr3, $vr7, $vr3 \n\t"
57  "vstelm.d $vr0, %[dst], 0, 0 \n\t"
58  "add.d %[dst], %[dst], %[dstStride] \n\t"
59  "vstelm.d $vr1, %[dst], 0, 0 \n\t"
60  "add.d %[dst], %[dst], %[dstStride] \n\t"
61  "vstelm.d $vr2, %[dst], 0, 0 \n\t"
62  "add.d %[dst], %[dst], %[dstStride] \n\t"
63  "vstelm.d $vr3, %[dst], 0, 0 \n\t"
64  "add.d %[dst], %[dst], %[dstStride] \n\t"
65  "bnez %[h], 1b \n\t"
66 
67  : [dst]"+&r"(dst), [src2]"+&r"(src2), [src1]"+&r"(src1),
68  [h]"+&r"(h), [stride1_2]"=&r"(stride1_2),
69  [stride1_3]"=&r"(stride1_3), [stride1_4]"=&r"(stride1_4),
70  [stride2_2]"=&r"(stride2_2), [stride2_3]"=&r"(stride2_3),
71  [stride2_4]"=&r"(stride2_4)
72  : [dstStride]"r"(dst_stride), [srcStride1]"r"(src_stride1),
73  [srcStride2]"r"(src_stride2)
74  : "memory"
75  );
76 }
77 
78 static av_always_inline void
79 put_pixels16_l2_8_lsx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
80  int dst_stride, int src_stride1, int src_stride2, int h)
81 {
82  int stride1_2, stride1_3, stride1_4;
83  int stride2_2, stride2_3, stride2_4;
84  int dststride2, dststride3, dststride4;
85  __asm__ volatile (
86  "slli.d %[stride1_2], %[srcStride1], 1 \n\t"
87  "slli.d %[stride2_2], %[srcStride2], 1 \n\t"
88  "slli.d %[dststride2], %[dstStride], 1 \n\t"
89  "add.d %[stride1_3], %[stride1_2], %[srcStride1] \n\t"
90  "add.d %[stride2_3], %[stride2_2], %[srcStride2] \n\t"
91  "add.d %[dststride3], %[dststride2], %[dstStride] \n\t"
92  "slli.d %[stride1_4], %[stride1_2], 1 \n\t"
93  "slli.d %[stride2_4], %[stride2_2], 1 \n\t"
94  "slli.d %[dststride4], %[dststride2], 1 \n\t"
95  "1: \n\t"
96  "vld $vr0, %[src1], 0 \n\t"
97  "vldx $vr1, %[src1], %[srcStride1] \n\t"
98  "vldx $vr2, %[src1], %[stride1_2] \n\t"
99  "vldx $vr3, %[src1], %[stride1_3] \n\t"
100  "add.d %[src1], %[src1], %[stride1_4] \n\t"
101 
102  "vld $vr4, %[src2], 0 \n\t"
103  "vldx $vr5, %[src2], %[srcStride2] \n\t"
104  "vldx $vr6, %[src2], %[stride2_2] \n\t"
105  "vldx $vr7, %[src2], %[stride2_3] \n\t"
106  "add.d %[src2], %[src2], %[stride2_4] \n\t"
107 
108  "addi.d %[h], %[h], -4 \n\t"
109 
110  "vavgr.bu $vr0, $vr4, $vr0 \n\t"
111  "vavgr.bu $vr1, $vr5, $vr1 \n\t"
112  "vavgr.bu $vr2, $vr6, $vr2 \n\t"
113  "vavgr.bu $vr3, $vr7, $vr3 \n\t"
114  "vst $vr0, %[dst], 0 \n\t"
115  "vstx $vr1, %[dst], %[dstStride] \n\t"
116  "vstx $vr2, %[dst], %[dststride2] \n\t"
117  "vstx $vr3, %[dst], %[dststride3] \n\t"
118  "add.d %[dst], %[dst], %[dststride4] \n\t"
119  "bnez %[h], 1b \n\t"
120 
121  : [dst]"+&r"(dst), [src2]"+&r"(src2), [src1]"+&r"(src1),
122  [h]"+&r"(h), [stride1_2]"=&r"(stride1_2),
123  [stride1_3]"=&r"(stride1_3), [stride1_4]"=&r"(stride1_4),
124  [stride2_2]"=&r"(stride2_2), [stride2_3]"=&r"(stride2_3),
125  [stride2_4]"=&r"(stride2_4), [dststride2]"=&r"(dststride2),
126  [dststride3]"=&r"(dststride3), [dststride4]"=&r"(dststride4)
127  : [dstStride]"r"(dst_stride), [srcStride1]"r"(src_stride1),
128  [srcStride2]"r"(src_stride2)
129  : "memory"
130  );
131 }
132 
133 void ff_put_pixels8_8_lasx(uint8_t *block, const uint8_t *pixels,
134  ptrdiff_t line_size, int h)
135 {
136  uint64_t tmp[8];
137  int h_8 = h >> 3;
138  int res = h & 7;
139  ptrdiff_t stride2, stride3, stride4;
140 
141  __asm__ volatile (
142  "beqz %[h_8], 2f \n\t"
143  "slli.d %[stride2], %[stride], 1 \n\t"
144  "add.d %[stride3], %[stride2], %[stride] \n\t"
145  "slli.d %[stride4], %[stride2], 1 \n\t"
146  "1: \n\t"
147  "ld.d %[tmp0], %[src], 0x0 \n\t"
148  "ldx.d %[tmp1], %[src], %[stride] \n\t"
149  "ldx.d %[tmp2], %[src], %[stride2] \n\t"
150  "ldx.d %[tmp3], %[src], %[stride3] \n\t"
151  "add.d %[src], %[src], %[stride4] \n\t"
152  "ld.d %[tmp4], %[src], 0x0 \n\t"
153  "ldx.d %[tmp5], %[src], %[stride] \n\t"
154  "ldx.d %[tmp6], %[src], %[stride2] \n\t"
155  "ldx.d %[tmp7], %[src], %[stride3] \n\t"
156  "add.d %[src], %[src], %[stride4] \n\t"
157 
158  "addi.d %[h_8], %[h_8], -1 \n\t"
159 
160  "st.d %[tmp0], %[dst], 0x0 \n\t"
161  "stx.d %[tmp1], %[dst], %[stride] \n\t"
162  "stx.d %[tmp2], %[dst], %[stride2] \n\t"
163  "stx.d %[tmp3], %[dst], %[stride3] \n\t"
164  "add.d %[dst], %[dst], %[stride4] \n\t"
165  "st.d %[tmp4], %[dst], 0x0 \n\t"
166  "stx.d %[tmp5], %[dst], %[stride] \n\t"
167  "stx.d %[tmp6], %[dst], %[stride2] \n\t"
168  "stx.d %[tmp7], %[dst], %[stride3] \n\t"
169  "add.d %[dst], %[dst], %[stride4] \n\t"
170  "bnez %[h_8], 1b \n\t"
171 
172  "2: \n\t"
173  "beqz %[res], 4f \n\t"
174  "3: \n\t"
175  "ld.d %[tmp0], %[src], 0x0 \n\t"
176  "add.d %[src], %[src], %[stride] \n\t"
177  "addi.d %[res], %[res], -1 \n\t"
178  "st.d %[tmp0], %[dst], 0x0 \n\t"
179  "add.d %[dst], %[dst], %[stride] \n\t"
180  "bnez %[res], 3b \n\t"
181  "4: \n\t"
182  : [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
183  [tmp2]"=&r"(tmp[2]), [tmp3]"=&r"(tmp[3]),
184  [tmp4]"=&r"(tmp[4]), [tmp5]"=&r"(tmp[5]),
185  [tmp6]"=&r"(tmp[6]), [tmp7]"=&r"(tmp[7]),
186  [dst]"+&r"(block), [src]"+&r"(pixels),
187  [h_8]"+&r"(h_8), [res]"+&r"(res),
188  [stride2]"=&r"(stride2), [stride3]"=&r"(stride3),
189  [stride4]"=&r"(stride4)
190  : [stride]"r"(line_size)
191  : "memory"
192  );
193 }
194 
195 void ff_put_pixels16_8_lsx(uint8_t *block, const uint8_t *pixels,
196  ptrdiff_t line_size, int h)
197 {
198  int h_8 = h >> 3;
199  int res = h & 7;
200  ptrdiff_t stride2, stride3, stride4;
201 
202  __asm__ volatile (
203  "beqz %[h_8], 2f \n\t"
204  "slli.d %[stride2], %[stride], 1 \n\t"
205  "add.d %[stride3], %[stride2], %[stride] \n\t"
206  "slli.d %[stride4], %[stride2], 1 \n\t"
207  "1: \n\t"
208  "vld $vr0, %[src], 0x0 \n\t"
209  "vldx $vr1, %[src], %[stride] \n\t"
210  "vldx $vr2, %[src], %[stride2] \n\t"
211  "vldx $vr3, %[src], %[stride3] \n\t"
212  "add.d %[src], %[src], %[stride4] \n\t"
213  "vld $vr4, %[src], 0x0 \n\t"
214  "vldx $vr5, %[src], %[stride] \n\t"
215  "vldx $vr6, %[src], %[stride2] \n\t"
216  "vldx $vr7, %[src], %[stride3] \n\t"
217  "add.d %[src], %[src], %[stride4] \n\t"
218 
219  "addi.d %[h_8], %[h_8], -1 \n\t"
220 
221  "vst $vr0, %[dst], 0x0 \n\t"
222  "vstx $vr1, %[dst], %[stride] \n\t"
223  "vstx $vr2, %[dst], %[stride2] \n\t"
224  "vstx $vr3, %[dst], %[stride3] \n\t"
225  "add.d %[dst], %[dst], %[stride4] \n\t"
226  "vst $vr4, %[dst], 0x0 \n\t"
227  "vstx $vr5, %[dst], %[stride] \n\t"
228  "vstx $vr6, %[dst], %[stride2] \n\t"
229  "vstx $vr7, %[dst], %[stride3] \n\t"
230  "add.d %[dst], %[dst], %[stride4] \n\t"
231  "bnez %[h_8], 1b \n\t"
232 
233  "2: \n\t"
234  "beqz %[res], 4f \n\t"
235  "3: \n\t"
236  "vld $vr0, %[src], 0x0 \n\t"
237  "add.d %[src], %[src], %[stride] \n\t"
238  "addi.d %[res], %[res], -1 \n\t"
239  "vst $vr0, %[dst], 0x0 \n\t"
240  "add.d %[dst], %[dst], %[stride] \n\t"
241  "bnez %[res], 3b \n\t"
242  "4: \n\t"
243  : [dst]"+&r"(block), [src]"+&r"(pixels),
244  [h_8]"+&r"(h_8), [res]"+&r"(res),
245  [stride2]"=&r"(stride2), [stride3]"=&r"(stride3),
246  [stride4]"=&r"(stride4)
247  : [stride]"r"(line_size)
248  : "memory"
249  );
250 }
251 
252 void ff_put_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
253  ptrdiff_t line_size, int h)
254 {
255  put_pixels8_l2_8_lsx(block, pixels, pixels + 1, line_size, line_size,
256  line_size, h);
257 }
258 
259 void ff_put_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
260  ptrdiff_t line_size, int h)
261 {
262  put_pixels8_l2_8_lsx(block, pixels, pixels + line_size, line_size,
263  line_size, line_size, h);
264 }
265 
266 void ff_put_pixels16_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
267  ptrdiff_t line_size, int h)
268 {
269  put_pixels16_l2_8_lsx(block, pixels, pixels + 1, line_size, line_size,
270  line_size, h);
271 }
272 
273 void ff_put_pixels16_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
274  ptrdiff_t line_size, int h)
275 {
276  put_pixels16_l2_8_lsx(block, pixels, pixels + line_size, line_size,
277  line_size, line_size, h);
278 }
279 
280 static void common_hz_bil_no_rnd_16x16_lasx(const uint8_t *src,
281  int32_t src_stride,
282  uint8_t *dst, int32_t dst_stride)
283 {
284  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
285  int32_t src_stride_2x = src_stride << 1;
286  int32_t src_stride_4x = src_stride << 2;
287  int32_t src_stride_3x = src_stride_2x + src_stride;
288  uint8_t *_src = (uint8_t*)src;
289 
290  src0 = __lasx_xvld(_src, 0);
291  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
292  src3 = __lasx_xvldx(_src, src_stride_3x);
293  _src += 1;
294  src4 = __lasx_xvld(_src, 0);
295  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
296  src7 = __lasx_xvldx(_src, src_stride_3x);
297  _src += (src_stride_4x -1);
298  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5,
299  src4, 0x20, src7, src6, 0x20, src0, src1, src2, src3);
300  src0 = __lasx_xvavg_bu(src0, src2);
301  src1 = __lasx_xvavg_bu(src1, src3);
302  __lasx_xvstelm_d(src0, dst, 0, 0);
303  __lasx_xvstelm_d(src0, dst, 8, 1);
304  dst += dst_stride;
305  __lasx_xvstelm_d(src0, dst, 0, 2);
306  __lasx_xvstelm_d(src0, dst, 8, 3);
307  dst += dst_stride;
308  __lasx_xvstelm_d(src1, dst, 0, 0);
309  __lasx_xvstelm_d(src1, dst, 8, 1);
310  dst += dst_stride;
311  __lasx_xvstelm_d(src1, dst, 0, 2);
312  __lasx_xvstelm_d(src1, dst, 8, 3);
313  dst += dst_stride;
314 
315  src0 = __lasx_xvld(_src, 0);
316  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
317  src3 = __lasx_xvldx(_src, src_stride_3x);
318  _src += 1;
319  src4 = __lasx_xvld(_src, 0);
320  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
321  src7 = __lasx_xvldx(_src, src_stride_3x);
322  _src += (src_stride_4x - 1);
323  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
324  0x20, src7, src6, 0x20, src0, src1, src2, src3);
325  src0 = __lasx_xvavg_bu(src0, src2);
326  src1 = __lasx_xvavg_bu(src1, src3);
327  __lasx_xvstelm_d(src0, dst, 0, 0);
328  __lasx_xvstelm_d(src0, dst, 8, 1);
329  dst += dst_stride;
330  __lasx_xvstelm_d(src0, dst, 0, 2);
331  __lasx_xvstelm_d(src0, dst, 8, 3);
332  dst += dst_stride;
333  __lasx_xvstelm_d(src1, dst, 0, 0);
334  __lasx_xvstelm_d(src1, dst, 8, 1);
335  dst += dst_stride;
336  __lasx_xvstelm_d(src1, dst, 0, 2);
337  __lasx_xvstelm_d(src1, dst, 8, 3);
338  dst += dst_stride;
339 
340  src0 = __lasx_xvld(_src, 0);
341  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
342  src3 = __lasx_xvldx(_src, src_stride_3x);
343  _src += 1;
344  src4 = __lasx_xvld(_src, 0);
345  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
346  src7 = __lasx_xvldx(_src, src_stride_3x);
347  _src += (src_stride_4x - 1);
348  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
349  0x20, src7, src6, 0x20, src0, src1, src2, src3);
350  src0 = __lasx_xvavg_bu(src0, src2);
351  src1 = __lasx_xvavg_bu(src1, src3);
352  __lasx_xvstelm_d(src0, dst, 0, 0);
353  __lasx_xvstelm_d(src0, dst, 8, 1);
354  dst += dst_stride;
355  __lasx_xvstelm_d(src0, dst, 0, 2);
356  __lasx_xvstelm_d(src0, dst, 8, 3);
357  dst += dst_stride;
358  __lasx_xvstelm_d(src1, dst, 0, 0);
359  __lasx_xvstelm_d(src1, dst, 8, 1);
360  dst += dst_stride;
361  __lasx_xvstelm_d(src1, dst, 0, 2);
362  __lasx_xvstelm_d(src1, dst, 8, 3);
363  dst += dst_stride;
364 
365  src0 = __lasx_xvld(_src, 0);
366  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
367  src3 = __lasx_xvldx(_src, src_stride_3x);
368  _src += 1;
369  src4 = __lasx_xvld(_src, 0);
370  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
371  src7 = __lasx_xvldx(_src, src_stride_3x);
372  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
373  0x20, src7, src6, 0x20, src0, src1, src2, src3);
374  src0 = __lasx_xvavg_bu(src0, src2);
375  src1 = __lasx_xvavg_bu(src1, src3);
376  __lasx_xvstelm_d(src0, dst, 0, 0);
377  __lasx_xvstelm_d(src0, dst, 8, 1);
378  dst += dst_stride;
379  __lasx_xvstelm_d(src0, dst, 0, 2);
380  __lasx_xvstelm_d(src0, dst, 8, 3);
381  dst += dst_stride;
382  __lasx_xvstelm_d(src1, dst, 0, 0);
383  __lasx_xvstelm_d(src1, dst, 8, 1);
384  dst += dst_stride;
385  __lasx_xvstelm_d(src1, dst, 0, 2);
386  __lasx_xvstelm_d(src1, dst, 8, 3);
387 }
388 
389 static void common_hz_bil_no_rnd_8x16_lasx(const uint8_t *src,
390  int32_t src_stride,
391  uint8_t *dst, int32_t dst_stride)
392 {
393  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
394  int32_t src_stride_2x = src_stride << 1;
395  int32_t src_stride_4x = src_stride << 2;
396  int32_t src_stride_3x = src_stride_2x + src_stride;
397  uint8_t* _src = (uint8_t*)src;
398 
399  src0 = __lasx_xvld(_src, 0);
400  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
401  src3 = __lasx_xvldx(_src, src_stride_3x);
402  _src += 1;
403  src4 = __lasx_xvld(_src, 0);
404  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
405  src7 = __lasx_xvldx(_src, src_stride_3x);
406  _src += (src_stride_4x - 1);
407  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
408  0x20, src7, src6, 0x20, src0, src1, src2, src3);
409  src0 = __lasx_xvavg_bu(src0, src2);
410  src1 = __lasx_xvavg_bu(src1, src3);
411  __lasx_xvstelm_d(src0, dst, 0, 0);
412  __lasx_xvstelm_d(src0, dst, 8, 1);
413  dst += dst_stride;
414  __lasx_xvstelm_d(src0, dst, 0, 2);
415  __lasx_xvstelm_d(src0, dst, 8, 3);
416  dst += dst_stride;
417  __lasx_xvstelm_d(src1, dst, 0, 0);
418  __lasx_xvstelm_d(src1, dst, 8, 1);
419  dst += dst_stride;
420  __lasx_xvstelm_d(src1, dst, 0, 2);
421  __lasx_xvstelm_d(src1, dst, 8, 3);
422  dst += dst_stride;
423 
424  src0 = __lasx_xvld(_src, 0);
425  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
426  src3 = __lasx_xvldx(_src, src_stride_3x);
427  _src += 1;
428  src4 = __lasx_xvld(_src, 0);
429  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
430  src7 = __lasx_xvldx(_src, src_stride_3x);
431  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
432  0x20, src7, src6, 0x20, src0, src1, src2, src3);
433  src0 = __lasx_xvavg_bu(src0, src2);
434  src1 = __lasx_xvavg_bu(src1, src3);
435  __lasx_xvstelm_d(src0, dst, 0, 0);
436  __lasx_xvstelm_d(src0, dst, 8, 1);
437  dst += dst_stride;
438  __lasx_xvstelm_d(src0, dst, 0, 2);
439  __lasx_xvstelm_d(src0, dst, 8, 3);
440  dst += dst_stride;
441  __lasx_xvstelm_d(src1, dst, 0, 0);
442  __lasx_xvstelm_d(src1, dst, 8, 1);
443  dst += dst_stride;
444  __lasx_xvstelm_d(src1, dst, 0, 2);
445  __lasx_xvstelm_d(src1, dst, 8, 3);
446 }
447 
448 void ff_put_no_rnd_pixels16_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
449  ptrdiff_t line_size, int h)
450 {
451  if (h == 16) {
452  common_hz_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
453  } else if (h == 8) {
454  common_hz_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
455  }
456 }
457 
458 static void common_vt_bil_no_rnd_16x16_lasx(const uint8_t *src,
459  int32_t src_stride,
460  uint8_t *dst, int32_t dst_stride)
461 {
462  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
463  __m256i src9, src10, src11, src12, src13, src14, src15, src16;
464  int32_t src_stride_2x = src_stride << 1;
465  int32_t src_stride_4x = src_stride << 2;
466  int32_t src_stride_3x = src_stride_2x + src_stride;
467  uint8_t* _src = (uint8_t*)src;
468 
469  src0 = __lasx_xvld(_src, 0);
470  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
471  src3 = __lasx_xvldx(_src, src_stride_3x);
472  _src += src_stride_4x;
473  src4 = __lasx_xvld(_src, 0);
474  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
475  src7 = __lasx_xvldx(_src, src_stride_3x);
476  _src += src_stride_4x;
477  src8 = __lasx_xvld(_src, 0);
478  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src9, src10);
479  src11 = __lasx_xvldx(_src, src_stride_3x);
480  _src += src_stride_4x;
481  src12 = __lasx_xvld(_src, 0);
482  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
483  src13, src14);
484  src15 = __lasx_xvldx(_src, src_stride_3x);
485  _src += src_stride_4x;
486  src16 = __lasx_xvld(_src, 0);
487 
488  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
489  0x20, src4, src3, 0x20, src0, src1, src2, src3);
490  DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
491  0x20, src8, src7, 0x20, src4, src5, src6, src7);
492  DUP4_ARG3(__lasx_xvpermi_q, src9, src8, 0x20, src10, src9, 0x20, src11,
493  src10, 0x20, src12, src11, 0x20, src8, src9, src10, src11);
494  DUP4_ARG3(__lasx_xvpermi_q, src13, src12, 0x20, src14, src13, 0x20, src15,
495  src14, 0x20, src16, src15, 0x20, src12, src13, src14, src15);
496  DUP4_ARG2(__lasx_xvavg_bu, src0, src1, src2, src3, src4, src5, src6, src7,
497  src0, src2, src4, src6);
498  DUP4_ARG2(__lasx_xvavg_bu, src8, src9, src10, src11, src12, src13, src14,
499  src15, src8, src10, src12, src14);
500 
501  __lasx_xvstelm_d(src0, dst, 0, 0);
502  __lasx_xvstelm_d(src0, dst, 8, 1);
503  dst += dst_stride;
504  __lasx_xvstelm_d(src0, dst, 0, 2);
505  __lasx_xvstelm_d(src0, dst, 8, 3);
506  dst += dst_stride;
507  __lasx_xvstelm_d(src2, dst, 0, 0);
508  __lasx_xvstelm_d(src2, dst, 8, 1);
509  dst += dst_stride;
510  __lasx_xvstelm_d(src2, dst, 0, 2);
511  __lasx_xvstelm_d(src2, dst, 8, 3);
512  dst += dst_stride;
513  __lasx_xvstelm_d(src4, dst, 0, 0);
514  __lasx_xvstelm_d(src4, dst, 8, 1);
515  dst += dst_stride;
516  __lasx_xvstelm_d(src4, dst, 0, 2);
517  __lasx_xvstelm_d(src4, dst, 8, 3);
518  dst += dst_stride;
519  __lasx_xvstelm_d(src6, dst, 0, 0);
520  __lasx_xvstelm_d(src6, dst, 8, 1);
521  dst += dst_stride;
522  __lasx_xvstelm_d(src6, dst, 0, 2);
523  __lasx_xvstelm_d(src6, dst, 8, 3);
524  dst += dst_stride;
525  __lasx_xvstelm_d(src8, dst, 0, 0);
526  __lasx_xvstelm_d(src8, dst, 8, 1);
527  dst += dst_stride;
528  __lasx_xvstelm_d(src8, dst, 0, 2);
529  __lasx_xvstelm_d(src8, dst, 8, 3);
530  dst += dst_stride;
531  __lasx_xvstelm_d(src10, dst, 0, 0);
532  __lasx_xvstelm_d(src10, dst, 8, 1);
533  dst += dst_stride;
534  __lasx_xvstelm_d(src10, dst, 0, 2);
535  __lasx_xvstelm_d(src10, dst, 8, 3);
536  dst += dst_stride;
537  __lasx_xvstelm_d(src12, dst, 0, 0);
538  __lasx_xvstelm_d(src12, dst, 8, 1);
539  dst += dst_stride;
540  __lasx_xvstelm_d(src12, dst, 0, 2);
541  __lasx_xvstelm_d(src12, dst, 8, 3);
542  dst += dst_stride;
543  __lasx_xvstelm_d(src14, dst, 0, 0);
544  __lasx_xvstelm_d(src14, dst, 8, 1);
545  dst += dst_stride;
546  __lasx_xvstelm_d(src14, dst, 0, 2);
547  __lasx_xvstelm_d(src14, dst, 8, 3);
548 }
549 
550 static void common_vt_bil_no_rnd_8x16_lasx(const uint8_t *src,
551  int32_t src_stride,
552  uint8_t *dst, int32_t dst_stride)
553 {
554  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
555  int32_t src_stride_2x = src_stride << 1;
556  int32_t src_stride_4x = src_stride << 2;
557  int32_t src_stride_3x = src_stride_2x + src_stride;
558  uint8_t* _src = (uint8_t*)src;
559 
560  src0 = __lasx_xvld(_src, 0);
561  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
562  src3 = __lasx_xvldx(_src, src_stride_3x);
563  _src += src_stride_4x;
564  src4 = __lasx_xvld(_src, 0);
565  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
566  src7 = __lasx_xvldx(_src, src_stride_3x);
567  _src += src_stride_4x;
568  src8 = __lasx_xvld(_src, 0);
569 
570  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
571  0x20, src4, src3, 0x20, src0, src1, src2, src3);
572  DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
573  0x20, src8, src7, 0x20, src4, src5, src6, src7);
574  DUP4_ARG2(__lasx_xvavg_bu, src0, src1, src2, src3, src4, src5, src6, src7,
575  src0, src2, src4, src6);
576 
577  __lasx_xvstelm_d(src0, dst, 0, 0);
578  __lasx_xvstelm_d(src0, dst, 8, 1);
579  dst += dst_stride;
580  __lasx_xvstelm_d(src0, dst, 0, 2);
581  __lasx_xvstelm_d(src0, dst, 8, 3);
582  dst += dst_stride;
583  __lasx_xvstelm_d(src2, dst, 0, 0);
584  __lasx_xvstelm_d(src2, dst, 8, 1);
585  dst += dst_stride;
586  __lasx_xvstelm_d(src2, dst, 0, 2);
587  __lasx_xvstelm_d(src2, dst, 8, 3);
588  dst += dst_stride;
589  __lasx_xvstelm_d(src4, dst, 0, 0);
590  __lasx_xvstelm_d(src4, dst, 8, 1);
591  dst += dst_stride;
592  __lasx_xvstelm_d(src4, dst, 0, 2);
593  __lasx_xvstelm_d(src4, dst, 8, 3);
594  dst += dst_stride;
595  __lasx_xvstelm_d(src6, dst, 0, 0);
596  __lasx_xvstelm_d(src6, dst, 8, 1);
597  dst += dst_stride;
598  __lasx_xvstelm_d(src6, dst, 0, 2);
599  __lasx_xvstelm_d(src6, dst, 8, 3);
600 }
601 
602 void ff_put_no_rnd_pixels16_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
603  ptrdiff_t line_size, int h)
604 {
605  if (h == 16) {
606  common_vt_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
607  } else if (h == 8) {
608  common_vt_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
609  }
610 }
611 
612 static void common_hv_bil_no_rnd_16x16_lasx(const uint8_t *src,
613  int32_t src_stride,
614  uint8_t *dst, int32_t dst_stride)
615 {
616  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
617  __m256i src10, src11, src12, src13, src14, src15, src16, src17;
618  __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
619  int32_t src_stride_2x = src_stride << 1;
620  int32_t src_stride_4x = src_stride << 2;
621  int32_t src_stride_3x = src_stride_2x + src_stride;
622  uint8_t* _src = (uint8_t*)src;
623 
624  src0 = __lasx_xvld(_src, 0);
625  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
626  src3 = __lasx_xvldx(_src, src_stride_3x);
627  _src += src_stride_4x;
628  src4 = __lasx_xvld(_src, 0);
629  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
630  src7 = __lasx_xvldx(_src, src_stride_3x);
631  _src += (1 - src_stride_4x);
632  src9 = __lasx_xvld(_src, 0);
633  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
634  src10, src11);
635  src12 = __lasx_xvldx(_src, src_stride_3x);
636  _src += src_stride_4x;
637  src13 = __lasx_xvld(_src, 0);
638  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
639  src14, src15);
640  src16 = __lasx_xvldx(_src, src_stride_3x);
641  _src += (src_stride_4x - 1);
642  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
643 
644  DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
645  src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
646  DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
647  src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
648  DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02,
649  src8, src9);
650  DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
651  sum0, sum2, sum4, sum6);
652  DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
653  sum1, sum3, sum5, sum7);
654  src8 = __lasx_xvilvl_h(src9, src4);
655  src9 = __lasx_xvilvh_h(src9, src4);
656 
657  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
658  sum3, sum3, src0, src1, src2, src3);
659  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
660  sum7, sum7, src4, src5, src6, src7);
661  DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
662 
663  DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
664  sum0, sum1, sum2, sum3);
665  DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
666  sum4, sum5, sum6, sum7);
667  DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
668  sum0, sum1, sum2, sum3);
669  DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
670  sum4, sum5, sum6, sum7);
671  DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
672  sum7, sum6, 2, sum0, sum1, sum2, sum3);
673  __lasx_xvstelm_d(sum0, dst, 0, 0);
674  __lasx_xvstelm_d(sum0, dst, 8, 1);
675  dst += dst_stride;
676  __lasx_xvstelm_d(sum1, dst, 0, 0);
677  __lasx_xvstelm_d(sum1, dst, 8, 1);
678  dst += dst_stride;
679  __lasx_xvstelm_d(sum2, dst, 0, 0);
680  __lasx_xvstelm_d(sum2, dst, 8, 1);
681  dst += dst_stride;
682  __lasx_xvstelm_d(sum3, dst, 0, 0);
683  __lasx_xvstelm_d(sum3, dst, 8, 1);
684  dst += dst_stride;
685  __lasx_xvstelm_d(sum0, dst, 0, 2);
686  __lasx_xvstelm_d(sum0, dst, 8, 3);
687  dst += dst_stride;
688  __lasx_xvstelm_d(sum1, dst, 0, 2);
689  __lasx_xvstelm_d(sum1, dst, 8, 3);
690  dst += dst_stride;
691  __lasx_xvstelm_d(sum2, dst, 0, 2);
692  __lasx_xvstelm_d(sum2, dst, 8, 3);
693  dst += dst_stride;
694  __lasx_xvstelm_d(sum3, dst, 0, 2);
695  __lasx_xvstelm_d(sum3, dst, 8, 3);
696  dst += dst_stride;
697 
698  src0 = __lasx_xvld(_src, 0);
699  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
700  src3 = __lasx_xvldx(_src, src_stride_3x);
701  _src += src_stride_4x;
702  src4 = __lasx_xvld(_src, 0);
703  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
704  src7 = __lasx_xvldx(_src, src_stride_3x);
705  _src += (1 - src_stride_4x);
706  src9 = __lasx_xvld(_src, 0);
707  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
708  src10, src11);
709  src12 = __lasx_xvldx(_src, src_stride_3x);
710  _src += src_stride_4x;
711  src13 = __lasx_xvld(_src, 0);
712  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
713  src14, src15);
714  src16 = __lasx_xvldx(_src, src_stride_3x);
715  _src += (src_stride_4x - 1);
716  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
717 
718  DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2, src6, 0x02,
719  src3, src7, 0x02, src0, src1, src2, src3);
720  DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10, src14, 0x02,
721  src11, src15, 0x02, src4, src5, src6, src7);
722  DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02, src8, src9);
723 
724  DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
725  sum0, sum2, sum4, sum6);
726  DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
727  sum1, sum3, sum5, sum7);
728  src8 = __lasx_xvilvl_h(src9, src4);
729  src9 = __lasx_xvilvh_h(src9, src4);
730 
731  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
732  sum3, sum3, src0, src1, src2, src3);
733  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
734  sum7, sum7, src4, src5, src6, src7);
735  DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
736 
737  DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
738  sum0, sum1, sum2, sum3);
739  DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
740  sum4, sum5, sum6, sum7);
741  DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
742  sum0, sum1, sum2, sum3);
743  DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
744  sum4, sum5, sum6, sum7);
745  DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
746  sum7, sum6, 2, sum0, sum1, sum2, sum3);
747  __lasx_xvstelm_d(sum0, dst, 0, 0);
748  __lasx_xvstelm_d(sum0, dst, 8, 1);
749  dst += dst_stride;
750  __lasx_xvstelm_d(sum1, dst, 0, 0);
751  __lasx_xvstelm_d(sum1, dst, 8, 1);
752  dst += dst_stride;
753  __lasx_xvstelm_d(sum2, dst, 0, 0);
754  __lasx_xvstelm_d(sum2, dst, 8, 1);
755  dst += dst_stride;
756  __lasx_xvstelm_d(sum3, dst, 0, 0);
757  __lasx_xvstelm_d(sum3, dst, 8, 1);
758  dst += dst_stride;
759  __lasx_xvstelm_d(sum0, dst, 0, 2);
760  __lasx_xvstelm_d(sum0, dst, 8, 3);
761  dst += dst_stride;
762  __lasx_xvstelm_d(sum1, dst, 0, 2);
763  __lasx_xvstelm_d(sum1, dst, 8, 3);
764  dst += dst_stride;
765  __lasx_xvstelm_d(sum2, dst, 0, 2);
766  __lasx_xvstelm_d(sum2, dst, 8, 3);
767  dst += dst_stride;
768  __lasx_xvstelm_d(sum3, dst, 0, 2);
769  __lasx_xvstelm_d(sum3, dst, 8, 3);
770 }
771 
772 static void common_hv_bil_no_rnd_8x16_lasx(const uint8_t *src,
773  int32_t src_stride,
774  uint8_t *dst, int32_t dst_stride)
775 {
776  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
777  __m256i src10, src11, src12, src13, src14, src15, src16, src17;
778  __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
779  int32_t src_stride_2x = src_stride << 1;
780  int32_t src_stride_4x = src_stride << 2;
781  int32_t src_stride_3x = src_stride_2x + src_stride;
782  uint8_t* _src = (uint8_t*)src;
783 
784  src0 = __lasx_xvld(_src, 0);
785  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
786  src3 = __lasx_xvldx(_src, src_stride_3x);
787  _src += src_stride_4x;
788  src4 = __lasx_xvld(_src, 0);
789  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
790  src7 = __lasx_xvldx(_src, src_stride_3x);
791  _src += (1 - src_stride_4x);
792  src9 = __lasx_xvld(_src, 0);
793  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
794  src10, src11);
795  src12 = __lasx_xvldx(_src, src_stride_3x);
796  _src += src_stride_4x;
797  src13 = __lasx_xvld(_src, 0);
798  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
799  src14, src15);
800  src16 = __lasx_xvldx(_src, src_stride_3x);
801  _src += (src_stride_4x - 1);
802  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
803 
804  DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
805  src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
806  DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
807  src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
808  DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02, src8, src9);
809 
810  DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
811  sum0, sum2, sum4, sum6);
812  DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
813  sum1, sum3, sum5, sum7);
814  src8 = __lasx_xvilvl_h(src9, src4);
815  src9 = __lasx_xvilvh_h(src9, src4);
816 
817  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
818  sum3, sum3, src0, src1, src2, src3);
819  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
820  sum7, sum7, src4, src5, src6, src7);
821  DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
822 
823  DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
824  sum0, sum1, sum2, sum3);
825  DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
826  sum4, sum5, sum6, sum7);
827  DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
828  sum0, sum1, sum2, sum3);
829  DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
830  sum4, sum5, sum6, sum7);
831  DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
832  sum7, sum6, 2, sum0, sum1, sum2, sum3);
833  __lasx_xvstelm_d(sum0, dst, 0, 0);
834  __lasx_xvstelm_d(sum0, dst, 8, 1);
835  dst += dst_stride;
836  __lasx_xvstelm_d(sum1, dst, 0, 0);
837  __lasx_xvstelm_d(sum1, dst, 8, 1);
838  dst += dst_stride;
839  __lasx_xvstelm_d(sum2, dst, 0, 0);
840  __lasx_xvstelm_d(sum2, dst, 8, 1);
841  dst += dst_stride;
842  __lasx_xvstelm_d(sum3, dst, 0, 0);
843  __lasx_xvstelm_d(sum3, dst, 8, 1);
844  dst += dst_stride;
845  __lasx_xvstelm_d(sum0, dst, 0, 2);
846  __lasx_xvstelm_d(sum0, dst, 8, 3);
847  dst += dst_stride;
848  __lasx_xvstelm_d(sum1, dst, 0, 2);
849  __lasx_xvstelm_d(sum1, dst, 8, 3);
850  dst += dst_stride;
851  __lasx_xvstelm_d(sum2, dst, 0, 2);
852  __lasx_xvstelm_d(sum2, dst, 8, 3);
853  dst += dst_stride;
854  __lasx_xvstelm_d(sum3, dst, 0, 2);
855  __lasx_xvstelm_d(sum3, dst, 8, 3);
856 }
857 
859  const uint8_t *pixels,
860  ptrdiff_t line_size, int h)
861 {
862  if (h == 16) {
863  common_hv_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
864  } else if (h == 8) {
865  common_hv_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
866  }
867 }
868 
869 static void common_hz_bil_no_rnd_8x8_lasx(const uint8_t *src,
870  int32_t src_stride,
871  uint8_t *dst, int32_t dst_stride)
872 {
873  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
874  __m256i src8, src9, src10, src11, src12, src13, src14, src15;
875  int32_t src_stride_2x = src_stride << 1;
876  int32_t src_stride_4x = src_stride << 2;
877  int32_t dst_stride_2x = dst_stride << 1;
878  int32_t dst_stride_4x = dst_stride << 2;
879  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
880  int32_t src_stride_3x = src_stride_2x + src_stride;
881  uint8_t* _src = (uint8_t*)src;
882 
883  src0 = __lasx_xvld(_src, 0);
884  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
885  src3 = __lasx_xvldx(_src, src_stride_3x);
886  _src += src_stride_4x;
887  src4 = __lasx_xvld(_src, 0);
888  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
889  src7 = __lasx_xvldx(_src, src_stride_3x);
890  _src += (1 - src_stride_4x);
891  src8 = __lasx_xvld(_src, 0);
892  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src9, src10);
893  src11 = __lasx_xvldx(_src, src_stride_3x);
894  _src += src_stride_4x;
895  src12 = __lasx_xvld(_src, 0);
896  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
897  src13, src14);
898  src15 = __lasx_xvldx(_src, src_stride_3x);
899 
900  DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src3, src2, src5, src4, src7,
901  src6, src0, src1, src2, src3);
902  DUP4_ARG2(__lasx_xvpickev_d, src9, src8, src11, src10, src13, src12, src15,
903  src14, src4, src5, src6, src7);
904  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
905  0x20, src7, src6, 0x20, src0, src1, src2, src3);
906  src0 = __lasx_xvavg_bu(src0, src2);
907  src1 = __lasx_xvavg_bu(src1, src3);
908  __lasx_xvstelm_d(src0, dst, 0, 0);
909  __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
910  __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
911  __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
912  dst += dst_stride_4x;
913  __lasx_xvstelm_d(src1, dst, 0, 0);
914  __lasx_xvstelm_d(src1, dst + dst_stride, 0, 1);
915  __lasx_xvstelm_d(src1, dst + dst_stride_2x, 0, 2);
916  __lasx_xvstelm_d(src1, dst + dst_stride_3x, 0, 3);
917 }
918 
919 static void common_hz_bil_no_rnd_4x8_lasx(const uint8_t *src,
920  int32_t src_stride,
921  uint8_t *dst, int32_t dst_stride)
922 {
923  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
924  int32_t src_stride_2x = src_stride << 1;
925  int32_t src_stride_3x = src_stride_2x + src_stride;
926  int32_t dst_stride_2x = dst_stride << 1;
927  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
928  uint8_t *_src = (uint8_t*)src;
929 
930  src0 = __lasx_xvld(_src, 0);
931  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
932  src3 = __lasx_xvldx(_src, src_stride_3x);
933  _src += 1;
934  src4 = __lasx_xvld(_src, 0);
935  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
936  src7 = __lasx_xvldx(_src, src_stride_3x);
937  DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src3, src2, src5, src4, src7, src6,
938  src0, src1, src2, src3);
939  DUP2_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src0, src1);
940  src0 = __lasx_xvavg_bu(src0, src1);
941  __lasx_xvstelm_d(src0, dst, 0, 0);
942  __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
943  __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
944  __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
945 }
946 
947 void ff_put_no_rnd_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
948  ptrdiff_t line_size, int h)
949 {
950  if (h == 8) {
951  common_hz_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
952  } else if (h == 4) {
953  common_hz_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
954  }
955 }
956 
957 static void common_vt_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t src_stride,
958  uint8_t *dst, int32_t dst_stride)
959 {
960  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
961  int32_t src_stride_2x = src_stride << 1;
962  int32_t src_stride_4x = src_stride << 2;
963  int32_t dst_stride_2x = dst_stride << 1;
964  int32_t dst_stride_4x = dst_stride << 2;
965  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
966  int32_t src_stride_3x = src_stride_2x + src_stride;
967  uint8_t* _src = (uint8_t*)src;
968 
969  src0 = __lasx_xvld(_src, 0);
970  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
971  src3 = __lasx_xvldx(_src, src_stride_3x);
972  _src += src_stride_4x;
973  src4 = __lasx_xvld(_src, 0);
974  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
975  src7 = __lasx_xvldx(_src, src_stride_3x);
976  _src += src_stride_4x;
977  src8 = __lasx_xvld(_src, 0);
978 
979  DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src2, src1, src3, src2, src4, src3,
980  src0, src1, src2, src3);
981  DUP4_ARG2(__lasx_xvpickev_d, src5, src4, src6, src5, src7, src6, src8, src7,
982  src4, src5, src6, src7);
983  DUP4_ARG3(__lasx_xvpermi_q, src2, src0, 0x20, src3, src1, 0x20, src6, src4,
984  0x20, src7, src5, 0x20, src0, src1, src2, src3);
985  src0 = __lasx_xvavg_bu(src0, src1);
986  src1 = __lasx_xvavg_bu(src2, src3);
987  __lasx_xvstelm_d(src0, dst, 0, 0);
988  __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
989  __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
990  __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
991  dst += dst_stride_4x;
992  __lasx_xvstelm_d(src1, dst, 0, 0);
993  __lasx_xvstelm_d(src1, dst + dst_stride, 0, 1);
994  __lasx_xvstelm_d(src1, dst + dst_stride_2x, 0, 2);
995  __lasx_xvstelm_d(src1, dst + dst_stride_3x, 0, 3);
996 }
997 
998 static void common_vt_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t src_stride,
999  uint8_t *dst, int32_t dst_stride)
1000 {
1001  __m256i src0, src1, src2, src3, src4;
1002  int32_t src_stride_2x = src_stride << 1;
1003  int32_t src_stride_4x = src_stride << 2;
1004  int32_t dst_stride_2x = dst_stride << 1;
1005  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
1006  int32_t src_stride_3x = src_stride_2x + src_stride;
1007  uint8_t* _src = (uint8_t*)src;
1008 
1009  src0 = __lasx_xvld(_src, 0);
1010  DUP4_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, _src,
1011  src_stride_3x, _src, src_stride_4x, src1, src2, src3, src4);
1012  DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src2, src1, src3, src2, src4, src3,
1013  src0, src1, src2, src3);
1014  DUP2_ARG3(__lasx_xvpermi_q, src2, src0, 0x20, src3, src1, 0x20, src0, src1);
1015  src0 = __lasx_xvavg_bu(src0, src1);
1016  __lasx_xvstelm_d(src0, dst, 0, 0);
1017  __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
1018  __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
1019  __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
1020 }
1021 
1022 void ff_put_no_rnd_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
1023  ptrdiff_t line_size, int h)
1024 {
1025  if (h == 8) {
1026  common_vt_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
1027  } else if (h == 4) {
1028  common_vt_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
1029  }
1030 }
1031 
1032 static void common_hv_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t src_stride,
1033  uint8_t *dst, int32_t dst_stride)
1034 {
1035  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
1036  __m256i src8, src9, src10, src11, src12, src13, src14, src15, src16, src17;
1037  __m256i sum0, sum1, sum2, sum3;
1038  int32_t src_stride_2x = src_stride << 1;
1039  int32_t src_stride_4x = src_stride << 2;
1040  int32_t dst_stride_2x = dst_stride << 1;
1041  int32_t dst_stride_4x = dst_stride << 2;
1042  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
1043  int32_t src_stride_3x = src_stride_2x + src_stride;
1044  uint8_t* _src = (uint8_t*)src;
1045 
1046  src0 = __lasx_xvld(_src, 0);
1047  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
1048  src3 = __lasx_xvldx(_src, src_stride_3x);
1049  _src += src_stride_4x;
1050  src4 = __lasx_xvld(_src, 0);
1051  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
1052  src7 = __lasx_xvldx(_src, src_stride_3x);
1053  _src += (1 - src_stride_4x);
1054  src9 = __lasx_xvld(_src, 0);
1055  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
1056  src10, src11);
1057  src12 = __lasx_xvldx(_src, src_stride_3x);
1058  _src += src_stride_4x;
1059  src13 = __lasx_xvld(_src, 0);
1060  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
1061  src14, src15);
1062  src16 = __lasx_xvldx(_src, src_stride_3x);
1063  _src += (src_stride_4x - 1);
1064  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
1065 
1066  DUP4_ARG2(__lasx_xvilvl_b, src9, src0, src10, src1, src11, src2, src12, src3,
1067  src0, src1, src2, src3);
1068  DUP4_ARG2(__lasx_xvilvl_b, src13, src4, src14, src5, src15, src6, src16, src7,
1069  src4, src5, src6, src7);
1070  src8 = __lasx_xvilvl_b(src17, src8);
1071  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
1072  0x20, src4, src3, 0x20, src0, src1, src2, src3);
1073  DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
1074  0x20, src8, src7, 0x20, src4, src5, src6, src7);
1075  DUP4_ARG2(__lasx_xvhaddw_hu_bu, src0, src0, src1, src1, src2, src2,
1076  src3, src3, src0, src1, src2, src3);
1077  DUP4_ARG2(__lasx_xvhaddw_hu_bu, src4, src4, src5, src5, src6, src6,
1078  src7, src7, src4, src5, src6, src7);
1079  DUP4_ARG2(__lasx_xvadd_h, src0, src1, src2, src3, src4, src5, src6, src7,
1080  sum0, sum1, sum2, sum3);
1081  DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
1082  sum0, sum1, sum2, sum3);
1083  DUP2_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum0, sum1);
1084  __lasx_xvstelm_d(sum0, dst, 0, 0);
1085  __lasx_xvstelm_d(sum0, dst + dst_stride, 0, 2);
1086  __lasx_xvstelm_d(sum0, dst + dst_stride_2x, 0, 1);
1087  __lasx_xvstelm_d(sum0, dst + dst_stride_3x, 0, 3);
1088  dst += dst_stride_4x;
1089  __lasx_xvstelm_d(sum1, dst, 0, 0);
1090  __lasx_xvstelm_d(sum1, dst + dst_stride, 0, 2);
1091  __lasx_xvstelm_d(sum1, dst + dst_stride_2x, 0, 1);
1092  __lasx_xvstelm_d(sum1, dst + dst_stride_3x, 0, 3);
1093 }
1094 
1095 static void common_hv_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t src_stride,
1096  uint8_t *dst, int32_t dst_stride)
1097 {
1098  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
1099  __m256i src8, src9, sum0, sum1;
1100  int32_t src_stride_2x = src_stride << 1;
1101  int32_t src_stride_4x = src_stride << 2;
1102  int32_t dst_stride_2x = dst_stride << 1;
1103  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
1104  int32_t src_stride_3x = src_stride_2x + src_stride;
1105  uint8_t *_src = (uint8_t*)src;
1106 
1107  src0 = __lasx_xvld(_src, 0);
1108  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
1109  src3 = __lasx_xvldx(_src, src_stride_3x);
1110  _src += 1;
1111  src5 = __lasx_xvld(_src, 0);
1112  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src6, src7);
1113  src8 = __lasx_xvldx(_src, src_stride_3x);
1114  _src += (src_stride_4x - 1);
1115  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src4, src9);
1116 
1117  DUP4_ARG2(__lasx_xvilvl_b, src5, src0, src6, src1, src7, src2, src8, src3,
1118  src0, src1, src2, src3);
1119  src4 = __lasx_xvilvl_b(src9, src4);
1120  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
1121  0x20, src4, src3, 0x20, src0, src1, src2, src3);
1122  DUP4_ARG2(__lasx_xvhaddw_hu_bu, src0, src0, src1, src1, src2, src2,
1123  src3, src3, src0, src1, src2, src3);
1124  DUP2_ARG2(__lasx_xvadd_h, src0, src1, src2, src3, sum0, sum1);
1125  sum0 = __lasx_xvaddi_hu(sum0, 1);
1126  sum1 = __lasx_xvaddi_hu(sum1, 1);
1127  sum0 = __lasx_xvsrani_b_h(sum1, sum0, 2);
1128  __lasx_xvstelm_d(sum0, dst, 0, 0);
1129  __lasx_xvstelm_d(sum0, dst + dst_stride, 0, 2);
1130  __lasx_xvstelm_d(sum0, dst + dst_stride_2x, 0, 1);
1131  __lasx_xvstelm_d(sum0, dst + dst_stride_3x, 0, 3);
1132 }
1133 
1134 void ff_put_no_rnd_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
1135  ptrdiff_t line_size, int h)
1136 {
1137  if (h == 8) {
1138  common_hv_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
1139  } else if (h == 4) {
1140  common_hv_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
1141  }
1142 }
1143 
1144 static void common_hv_bil_16w_lasx(const uint8_t *src, int32_t src_stride,
1145  uint8_t *dst, int32_t dst_stride,
1146  uint8_t height)
1147 {
1148  __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
1149  __m256i src10, src11, src12, src13, src14, src15, src16, src17;
1150  __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
1151  uint8_t loop_cnt;
1152  int32_t src_stride_2x = src_stride << 1;
1153  int32_t src_stride_4x = src_stride << 2;
1154  int32_t src_stride_3x = src_stride_2x + src_stride;
1155  uint8_t* _src = (uint8_t*)src;
1156 
1157  for (loop_cnt = (height >> 3); loop_cnt--;) {
1158  src0 = __lasx_xvld(_src, 0);
1159  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
1160  src3 = __lasx_xvldx(_src, src_stride_3x);
1161  _src += src_stride_4x;
1162  src4 = __lasx_xvld(_src, 0);
1163  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
1164  src7 = __lasx_xvldx(_src, src_stride_3x);
1165  _src += (1 - src_stride_4x);
1166  src9 = __lasx_xvld(_src, 0);
1167  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
1168  src10, src11);
1169  src12 = __lasx_xvldx(_src, src_stride_3x);
1170  _src += src_stride_4x;
1171  src13 = __lasx_xvld(_src, 0);
1172  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
1173  src14, src15);
1174  src16 = __lasx_xvldx(_src, src_stride_3x);
1175  _src += (src_stride_4x - 1);
1176  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
1177 
1178  DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
1179  src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
1180  DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
1181  src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
1182  DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02,
1183  src8, src9);
1184 
1185  DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8,
1186  src3, sum0, sum2, sum4, sum6);
1187  DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8,
1188  src3, sum1, sum3, sum5, sum7);
1189  src8 = __lasx_xvilvl_h(src9, src4);
1190  src9 = __lasx_xvilvh_h(src9, src4);
1191 
1192  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
1193  sum3, sum3, src0, src1, src2, src3);
1194  DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
1195  sum7, sum7, src4, src5, src6, src7);
1196  DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
1197 
1198  DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3,
1199  src5, sum0, sum1, sum2, sum3);
1200  DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7,
1201  src9, sum4, sum5, sum6, sum7);
1202  DUP4_ARG3(__lasx_xvsrarni_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5,
1203  sum4, 2, sum7, sum6, 2, sum0, sum1, sum2, sum3);
1204  __lasx_xvstelm_d(sum0, dst, 0, 0);
1205  __lasx_xvstelm_d(sum0, dst, 8, 1);
1206  dst += dst_stride;
1207  __lasx_xvstelm_d(sum1, dst, 0, 0);
1208  __lasx_xvstelm_d(sum1, dst, 8, 1);
1209  dst += dst_stride;
1210  __lasx_xvstelm_d(sum2, dst, 0, 0);
1211  __lasx_xvstelm_d(sum2, dst, 8, 1);
1212  dst += dst_stride;
1213  __lasx_xvstelm_d(sum3, dst, 0, 0);
1214  __lasx_xvstelm_d(sum3, dst, 8, 1);
1215  dst += dst_stride;
1216  __lasx_xvstelm_d(sum0, dst, 0, 2);
1217  __lasx_xvstelm_d(sum0, dst, 8, 3);
1218  dst += dst_stride;
1219  __lasx_xvstelm_d(sum1, dst, 0, 2);
1220  __lasx_xvstelm_d(sum1, dst, 8, 3);
1221  dst += dst_stride;
1222  __lasx_xvstelm_d(sum2, dst, 0, 2);
1223  __lasx_xvstelm_d(sum2, dst, 8, 3);
1224  dst += dst_stride;
1225  __lasx_xvstelm_d(sum3, dst, 0, 2);
1226  __lasx_xvstelm_d(sum3, dst, 8, 3);
1227  dst += dst_stride;
1228  }
1229 }
1230 
1231 void ff_put_pixels16_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
1232  ptrdiff_t line_size, int h)
1233 {
1234  common_hv_bil_16w_lasx(pixels, line_size, block, line_size, h);
1235 }
1236 
1237 static void common_hv_bil_8w_lasx(const uint8_t *src, int32_t src_stride,
1238  uint8_t *dst, int32_t dst_stride,
1239  uint8_t height)
1240 {
1241  __m256i src0, src1, src2, src3, src4, src5, src6, src7;
1242  __m256i src8, src9, sum0, sum1;
1243  uint8_t loop_cnt;
1244  int32_t src_stride_2x = src_stride << 1;
1245  int32_t src_stride_4x = src_stride << 2;
1246  int32_t dst_stride_2x = dst_stride << 1;
1247  int32_t dst_stride_4x = dst_stride << 2;
1248  int32_t dst_stride_3x = dst_stride_2x + dst_stride;
1249  int32_t src_stride_3x = src_stride_2x + src_stride;
1250  uint8_t* _src = (uint8_t*)src;
1251 
1252  DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src0, src5);
1253  _src += src_stride;
1254 
1255  for (loop_cnt = (height >> 2); loop_cnt--;) {
1256  src1 = __lasx_xvld(_src, 0);
1257  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src2, src3);
1258  src4 = __lasx_xvldx(_src, src_stride_3x);
1259  _src += 1;
1260  src6 = __lasx_xvld(_src, 0);
1261  DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src7, src8);
1262  src9 = __lasx_xvldx(_src, src_stride_3x);
1263  _src += (src_stride_4x - 1);
1264  DUP4_ARG2(__lasx_xvilvl_b, src5, src0, src6, src1, src7, src2, src8, src3,
1265  src0, src1, src2, src3);
1266  src5 = __lasx_xvilvl_b(src9, src4);
1267  DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
1268  0x20, src5, src3, 0x20, src0, src1, src2, src3);
1269  DUP4_ARG2(__lasx_xvhaddw_hu_bu, src0, src0, src1, src1, src2, src2,
1270  src3, src3, src0, src1, src2, src3);
1271  DUP2_ARG2(__lasx_xvadd_h, src0, src1, src2, src3, sum0, sum1);
1272  sum0 = __lasx_xvsrarni_b_h(sum1, sum0, 2);
1273  __lasx_xvstelm_d(sum0, dst, 0, 0);
1274  __lasx_xvstelm_d(sum0, dst + dst_stride, 0, 2);
1275  __lasx_xvstelm_d(sum0, dst + dst_stride_2x, 0, 1);
1276  __lasx_xvstelm_d(sum0, dst + dst_stride_3x, 0, 3);
1277  dst += dst_stride_4x;
1278  src0 = src4;
1279  src5 = src9;
1280  }
1281 }
1282 
1283 void ff_put_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
1284  ptrdiff_t line_size, int h)
1285 {
1286  common_hv_bil_8w_lasx(pixels, line_size, block, line_size, h);
1287 }
common_hz_bil_no_rnd_4x8_lasx
static void common_hz_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:919
put_pixels8_l2_8_lsx
static av_always_inline void put_pixels8_l2_8_lsx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h)
Definition: hpeldsp_lasx.c:26
ff_put_no_rnd_pixels16_xy2_8_lasx
void ff_put_no_rnd_pixels16_xy2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:858
common_hv_bil_no_rnd_8x8_lasx
static void common_hv_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:1032
src1
const pixel * src1
Definition: h264pred_template.c:421
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
common_vt_bil_no_rnd_8x8_lasx
static void common_vt_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:957
common_vt_bil_no_rnd_4x8_lasx
static void common_vt_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:998
common_hv_bil_8w_lasx
static void common_hv_bil_8w_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, uint8_t height)
Definition: hpeldsp_lasx.c:1237
ff_put_no_rnd_pixels16_y2_8_lasx
void ff_put_no_rnd_pixels16_y2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:602
DUP2_ARG2
#define DUP2_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _OUT0, _OUT1)
Definition: loongson_intrinsics.h:58
ff_put_pixels16_8_lsx
void ff_put_pixels16_8_lsx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:195
common_vt_bil_no_rnd_16x16_lasx
static void common_vt_bil_no_rnd_16x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:458
ff_put_pixels16_y2_8_lasx
void ff_put_pixels16_y2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:273
common_hv_bil_no_rnd_8x16_lasx
static void common_hv_bil_no_rnd_8x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:772
common_hv_bil_16w_lasx
static void common_hv_bil_16w_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride, uint8_t height)
Definition: hpeldsp_lasx.c:1144
ff_put_pixels8_x2_8_lasx
void ff_put_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:252
common_hz_bil_no_rnd_16x16_lasx
static void common_hz_bil_no_rnd_16x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:280
ff_put_no_rnd_pixels8_x2_8_lasx
void ff_put_no_rnd_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:947
DUP4_ARG2
#define DUP4_ARG2(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _IN6, _IN7, _OUT0, _OUT1, _OUT2, _OUT3)
Definition: loongson_intrinsics.h:76
ff_put_no_rnd_pixels8_xy2_8_lasx
void ff_put_no_rnd_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:1134
common_vt_bil_no_rnd_8x16_lasx
static void common_vt_bil_no_rnd_8x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:550
ff_put_pixels16_x2_8_lasx
void ff_put_pixels16_x2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:266
common_hz_bil_no_rnd_8x8_lasx
static void common_hz_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:869
ff_put_pixels8_xy2_8_lasx
void ff_put_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:1283
common_hv_bil_no_rnd_16x16_lasx
static void common_hv_bil_no_rnd_16x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:612
ff_put_no_rnd_pixels8_y2_8_lasx
void ff_put_no_rnd_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:1022
put_pixels16_l2_8_lsx
static av_always_inline void put_pixels16_l2_8_lsx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, int h)
Definition: hpeldsp_lasx.c:79
DUP2_ARG3
#define DUP2_ARG3(_INS, _IN0, _IN1, _IN2, _IN3, _IN4, _IN5, _OUT0, _OUT1)
Definition: loongson_intrinsics.h:64
height
#define height
src2
const pixel * src2
Definition: h264pred_template.c:422
av_always_inline
#define av_always_inline
Definition: attributes.h:49
ff_put_no_rnd_pixels16_x2_8_lasx
void ff_put_no_rnd_pixels16_x2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:448
stride
#define stride
Definition: h264pred_template.c:537
common_hv_bil_no_rnd_4x8_lasx
static void common_hv_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:1095
__asm__
__asm__(".macro parse_r var r\n\t" "\\var = -1\n\t" _IFC_REG(0) _IFC_REG(1) _IFC_REG(2) _IFC_REG(3) _IFC_REG(4) _IFC_REG(5) _IFC_REG(6) _IFC_REG(7) _IFC_REG(8) _IFC_REG(9) _IFC_REG(10) _IFC_REG(11) _IFC_REG(12) _IFC_REG(13) _IFC_REG(14) _IFC_REG(15) _IFC_REG(16) _IFC_REG(17) _IFC_REG(18) _IFC_REG(19) _IFC_REG(20) _IFC_REG(21) _IFC_REG(22) _IFC_REG(23) _IFC_REG(24) _IFC_REG(25) _IFC_REG(26) _IFC_REG(27) _IFC_REG(28) _IFC_REG(29) _IFC_REG(30) _IFC_REG(31) ".iflt \\var\n\t" ".error \"Unable to parse register name \\r\"\n\t" ".endif\n\t" ".endm")
hpeldsp_lasx.h
src0
const pixel *const src0
Definition: h264pred_template.c:420
common_hz_bil_no_rnd_8x16_lasx
static void common_hz_bil_no_rnd_8x16_lasx(const uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride)
Definition: hpeldsp_lasx.c:389
ff_put_pixels8_8_lasx
void ff_put_pixels8_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:133
loongson_intrinsics.h
ff_put_pixels16_xy2_8_lasx
void ff_put_pixels16_xy2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:1231
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
int32_t
int32_t
Definition: audioconvert.c:56
ff_put_pixels8_y2_8_lasx
void ff_put_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Definition: hpeldsp_lasx.c:259
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
h
h
Definition: vp9dsp_template.c:2038
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