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
22#include "libavutil/loongarch/loongson_intrinsics.h"
23#include "hpeldsp_lasx.h"
24
25static av_always_inline void
26put_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
78static av_always_inline void
79put_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
133void 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
195void 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
252void 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
259void 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
266void 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
273void 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
280static 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
389static 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
448void 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
458static 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
550static 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
602void 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
612static 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
772static 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
858void ff_put_no_rnd_pixels16_xy2_8_lasx(uint8_t *block,
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
869static 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
919static 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
947void 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
957static 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
998static 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
1022void 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
1032static 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
1095static 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
1134void 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
1144static 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
1231void 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
1237static 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
1283void 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}
1288