• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
25 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)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
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)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 
ff_put_pixels8_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
ff_put_pixels16_8_lsx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
ff_put_pixels8_x2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
ff_put_pixels8_y2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
ff_put_pixels16_x2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
ff_put_pixels16_y2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_hz_bil_no_rnd_16x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_hz_bil_no_rnd_8x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels16_x2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_vt_bil_no_rnd_16x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_vt_bil_no_rnd_8x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels16_y2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_hv_bil_no_rnd_16x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_hv_bil_no_rnd_8x16_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels16_xy2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)858 void 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 
common_hz_bil_no_rnd_8x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_hz_bil_no_rnd_4x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels8_x2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_vt_bil_no_rnd_8x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_vt_bil_no_rnd_4x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels8_y2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_hv_bil_no_rnd_8x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
common_hv_bil_no_rnd_4x8_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride)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 
ff_put_no_rnd_pixels8_xy2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_hv_bil_16w_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride,uint8_t height)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 
ff_put_pixels16_xy2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 
common_hv_bil_8w_lasx(const uint8_t * src,int32_t src_stride,uint8_t * dst,int32_t dst_stride,uint8_t height)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 
ff_put_pixels8_xy2_8_lasx(uint8_t * block,const uint8_t * pixels,ptrdiff_t line_size,int h)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 }
1288