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