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