The branch, master has been updated
       via  f7551e7505d389fcc14a8e16bcd13ab770658990 (commit)
      from  413346bd06c33226254dacc829f128a6b6c337d7 (commit)


- Log -----------------------------------------------------------------
commit f7551e7505d389fcc14a8e16bcd13ab770658990
Author:     yuanhecai <[email protected]>
AuthorDate: Mon Nov 17 17:32:53 2025 +0800
Commit:     HecaiYuan <[email protected]>
CommitDate: Wed Dec 3 01:36:01 2025 +0000

    avcodec: fix checkasm-hpeldsp failed on LA

diff --git a/libavcodec/loongarch/hpeldsp_init_loongarch.c 
b/libavcodec/loongarch/hpeldsp_init_loongarch.c
index 1690be5438..ffdfb69bba 100644
--- a/libavcodec/loongarch/hpeldsp_init_loongarch.c
+++ b/libavcodec/loongarch/hpeldsp_init_loongarch.c
@@ -45,6 +45,6 @@ void ff_hpeldsp_init_loongarch(HpelDSPContext *c, int flags)
         c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_8_lasx;
         c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_8_lasx;
         c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_8_lasx;
-        c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_8_lasx;
+        c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_8_lsx;
     }
 }
diff --git a/libavcodec/loongarch/hpeldsp_lasx.c 
b/libavcodec/loongarch/hpeldsp_lasx.c
index dd2ae173da..68cab715b9 100644
--- a/libavcodec/loongarch/hpeldsp_lasx.c
+++ b/libavcodec/loongarch/hpeldsp_lasx.c
@@ -192,61 +192,33 @@ void ff_put_pixels8_8_lasx(uint8_t *block, const uint8_t 
*pixels,
     );
 }
 
+/**
+ * For widths 16, h is always a positive multiple of 4.
+ * The function processes 4 rows per iteration.
+ */
 void ff_put_pixels16_8_lsx(uint8_t *block, const uint8_t *pixels,
                            ptrdiff_t line_size, int h)
 {
-    int h_8 = h >> 3;
-    int res = h & 7;
-    ptrdiff_t stride2, stride3, stride4;
-
-    __asm__ volatile (
-        "beqz     %[h_8],                           2f            \n\t"
-        "slli.d   %[stride2],    %[stride],         1             \n\t"
-        "add.d    %[stride3],    %[stride2],        %[stride]     \n\t"
-        "slli.d   %[stride4],    %[stride2],        1             \n\t"
-        "1:                                                       \n\t"
-        "vld      $vr0,          %[src],            0x0           \n\t"
-        "vldx     $vr1,          %[src],            %[stride]     \n\t"
-        "vldx     $vr2,          %[src],            %[stride2]    \n\t"
-        "vldx     $vr3,          %[src],            %[stride3]    \n\t"
-        "add.d    %[src],        %[src],            %[stride4]    \n\t"
-        "vld      $vr4,          %[src],            0x0           \n\t"
-        "vldx     $vr5,          %[src],            %[stride]     \n\t"
-        "vldx     $vr6,          %[src],            %[stride2]    \n\t"
-        "vldx     $vr7,          %[src],            %[stride3]    \n\t"
-        "add.d    %[src],        %[src],            %[stride4]    \n\t"
-
-        "addi.d   %[h_8],        %[h_8],            -1            \n\t"
-
-        "vst      $vr0,          %[dst],            0x0           \n\t"
-        "vstx     $vr1,          %[dst],            %[stride]     \n\t"
-        "vstx     $vr2,          %[dst],            %[stride2]    \n\t"
-        "vstx     $vr3,          %[dst],            %[stride3]    \n\t"
-        "add.d    %[dst],        %[dst],            %[stride4]    \n\t"
-        "vst      $vr4,          %[dst],            0x0           \n\t"
-        "vstx     $vr5,          %[dst],            %[stride]     \n\t"
-        "vstx     $vr6,          %[dst],            %[stride2]    \n\t"
-        "vstx     $vr7,          %[dst],            %[stride3]    \n\t"
-        "add.d    %[dst],        %[dst],            %[stride4]    \n\t"
-        "bnez     %[h_8],        1b                               \n\t"
-
-        "2:                                                       \n\t"
-        "beqz     %[res],        4f                               \n\t"
-        "3:                                                       \n\t"
-        "vld      $vr0,          %[src],            0x0           \n\t"
-        "add.d    %[src],        %[src],            %[stride]     \n\t"
-        "addi.d   %[res],        %[res],            -1            \n\t"
-        "vst      $vr0,          %[dst],            0x0           \n\t"
-        "add.d    %[dst],        %[dst],            %[stride]     \n\t"
-        "bnez     %[res],        3b                               \n\t"
-        "4:                                                       \n\t"
-        : [dst]"+&r"(block),          [src]"+&r"(pixels),
-          [h_8]"+&r"(h_8),            [res]"+&r"(res),
-          [stride2]"=&r"(stride2),    [stride3]"=&r"(stride3),
-          [stride4]"=&r"(stride4)
-        : [stride]"r"(line_size)
-        : "memory"
-    );
+    int h_4 = h >> 2;
+    ptrdiff_t stride2 = line_size << 1;
+    ptrdiff_t stride3 = stride2 + line_size;
+    ptrdiff_t stride4 = line_size << 2;
+    __m128i src0, src1, src2, src3;
+
+    for (int i = 0; i < h_4; i++) {
+        src0 = __lsx_vld(pixels, 0);
+        src1 = __lsx_vldx(pixels, line_size);
+        src2 = __lsx_vldx(pixels, stride2);
+        src3 = __lsx_vldx(pixels, stride3);
+
+        __lsx_vst(src0, block, 0);
+        __lsx_vstx(src1, block, line_size);
+        __lsx_vstx(src2, block, stride2);
+        __lsx_vstx(src3, block, stride3);
+
+        pixels += stride4;
+        block += stride4;
+    }
 }
 
 void ff_put_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
@@ -277,961 +249,253 @@ void ff_put_pixels16_y2_8_lasx(uint8_t *block, const 
uint8_t *pixels,
                           line_size, line_size, h);
 }
 
-static void common_hz_bil_no_rnd_16x16_lasx(const uint8_t *src,
-                                            int32_t src_stride,
-                                            uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t *_src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x -1);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5,
-              src4, 0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-    dst += dst_stride;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-    dst += dst_stride;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-    dst += dst_stride;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-}
-
-static void common_hz_bil_no_rnd_8x16_lasx(const uint8_t *src,
-                                           int32_t src_stride,
-                                           uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-    dst += dst_stride;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src1, dst, 0, 2);
-    __lasx_xvstelm_d(src1, dst, 8, 3);
-}
-
+/**
+ * For widths 16, h is always a positive multiple of 4.
+ * The function processes 4 rows per iteration.
+ */
 void ff_put_no_rnd_pixels16_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                       ptrdiff_t line_size, int h)
 {
-    if (h == 16) {
-        common_hz_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
-    } else if (h == 8) {
-        common_hz_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
+    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
+    int32_t h_4 = h >> 2;
+    int32_t stride2x = line_size << 1;
+    int32_t stride4x = line_size << 2;
+    int32_t stride3x = stride2x + line_size;
+    uint8_t* _src = (uint8_t*)pixels + 1;
+
+    for (int i = 0; i < h_4; i++) {
+        src0 = __lasx_xvld(pixels, 0);
+        DUP2_ARG2(__lasx_xvldx, pixels, line_size, pixels, stride2x, src1, 
src2);
+        src3 = __lasx_xvldx(pixels, stride3x);
+        src4 = __lasx_xvld(_src, 0);
+        DUP2_ARG2(__lasx_xvldx, _src, line_size, _src, stride2x, src5, src6);
+        src7 = __lasx_xvldx(_src, stride3x);
+        DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, 
src4,
+                  0x20, src7, src6, 0x20, src0, src1, src2, src3);
+        src0 = __lasx_xvavg_bu(src0, src2);
+        src1 = __lasx_xvavg_bu(src1, src3);
+        __lasx_xvstelm_d(src0, block, 0, 0);
+        __lasx_xvstelm_d(src0, block, 8, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 2);
+        __lasx_xvstelm_d(src0, block, 8, 3);
+        block += line_size;
+        __lasx_xvstelm_d(src1, block, 0, 0);
+        __lasx_xvstelm_d(src1, block, 8, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src1, block, 0, 2);
+        __lasx_xvstelm_d(src1, block, 8, 3);
+        block += line_size;
+
+        _src += stride4x;
+        pixels += stride4x;
     }
 }
 
-static void common_vt_bil_no_rnd_16x16_lasx(const uint8_t *src,
-                                            int32_t src_stride,
-                                            uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
-    __m256i src9, src10, src11, src12, src13, src14, src15, src16;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src8 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src9, 
src10);
-    src11 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src12 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src13, src14);
-    src15 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src16 = __lasx_xvld(_src, 0);
-
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
-              0x20, src4, src3, 0x20, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
-              0x20, src8, src7, 0x20, src4, src5, src6, src7);
-    DUP4_ARG3(__lasx_xvpermi_q, src9, src8, 0x20, src10, src9, 0x20, src11,
-              src10, 0x20, src12, src11, 0x20, src8, src9, src10, src11);
-    DUP4_ARG3(__lasx_xvpermi_q, src13, src12, 0x20, src14, src13, 0x20, src15,
-              src14, 0x20, src16, src15, 0x20, src12, src13, src14, src15);
-    DUP4_ARG2(__lasx_xvavg_bu, src0, src1, src2, src3, src4, src5, src6, src7,
-              src0, src2, src4, src6);
-    DUP4_ARG2(__lasx_xvavg_bu, src8, src9, src10, src11, src12, src13, src14,
-              src15, src8, src10, src12, src14);
-
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src2, dst, 0, 0);
-    __lasx_xvstelm_d(src2, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src2, dst, 0, 2);
-    __lasx_xvstelm_d(src2, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src4, dst, 0, 0);
-    __lasx_xvstelm_d(src4, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src4, dst, 0, 2);
-    __lasx_xvstelm_d(src4, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src6, dst, 0, 0);
-    __lasx_xvstelm_d(src6, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src6, dst, 0, 2);
-    __lasx_xvstelm_d(src6, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src8, dst, 0, 0);
-    __lasx_xvstelm_d(src8, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src8, dst, 0, 2);
-    __lasx_xvstelm_d(src8, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src10, dst, 0, 0);
-    __lasx_xvstelm_d(src10, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src10, dst, 0, 2);
-    __lasx_xvstelm_d(src10, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src12, dst, 0, 0);
-    __lasx_xvstelm_d(src12, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src12, dst, 0, 2);
-    __lasx_xvstelm_d(src12, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src14, dst, 0, 0);
-    __lasx_xvstelm_d(src14, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src14, dst, 0, 2);
-    __lasx_xvstelm_d(src14, dst, 8, 3);
-}
-
-static void common_vt_bil_no_rnd_8x16_lasx(const uint8_t *src,
-                                           int32_t src_stride,
-                                           uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src8 = __lasx_xvld(_src, 0);
-
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
-              0x20, src4, src3, 0x20, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
-              0x20, src8, src7, 0x20, src4, src5, src6, src7);
-    DUP4_ARG2(__lasx_xvavg_bu, src0, src1, src2, src3, src4, src5, src6, src7,
-              src0, src2, src4, src6);
-
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src0, dst, 0, 2);
-    __lasx_xvstelm_d(src0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src2, dst, 0, 0);
-    __lasx_xvstelm_d(src2, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src2, dst, 0, 2);
-    __lasx_xvstelm_d(src2, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src4, dst, 0, 0);
-    __lasx_xvstelm_d(src4, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src4, dst, 0, 2);
-    __lasx_xvstelm_d(src4, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src6, dst, 0, 0);
-    __lasx_xvstelm_d(src6, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(src6, dst, 0, 2);
-    __lasx_xvstelm_d(src6, dst, 8, 3);
-}
-
+/**
+ * For widths 16, h is always a positive multiple of 4.
+ * The function processes 4 rows per iteration.
+ */
 void ff_put_no_rnd_pixels16_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                       ptrdiff_t line_size, int h)
 {
-    if (h == 16) {
-        common_vt_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
-    } else if (h == 8) {
-        common_vt_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
-    }
-}
-
-static void common_hv_bil_no_rnd_16x16_lasx(const uint8_t *src,
-                                            int32_t src_stride,
-                                            uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
-    __m256i src10, src11, src12, src13, src14, src15, src16, src17;
-    __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (1 - src_stride_4x);
-    src9 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src10, src11);
-    src12 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src13 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src14, src15);
-    src16 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
-
-    DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
-              src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
-              src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
-    DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02,
-              src8, src9);
-    DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum0, sum2, sum4, sum6);
-    DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum1, sum3, sum5, sum7);
-    src8 = __lasx_xvilvl_h(src9, src4);
-    src9 = __lasx_xvilvh_h(src9, src4);
-
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
-              sum3, sum3, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
-              sum7, sum7, src4, src5, src6, src7);
-    DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
-
-    DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
-              sum7, sum6, 2, sum0, sum1, sum2, sum3);
-    __lasx_xvstelm_d(sum0, dst, 0, 0);
-    __lasx_xvstelm_d(sum0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 0);
-    __lasx_xvstelm_d(sum1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 0);
-    __lasx_xvstelm_d(sum2, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 0);
-    __lasx_xvstelm_d(sum3, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum0, dst, 0, 2);
-    __lasx_xvstelm_d(sum0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 2);
-    __lasx_xvstelm_d(sum1, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 2);
-    __lasx_xvstelm_d(sum2, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 2);
-    __lasx_xvstelm_d(sum3, dst, 8, 3);
-    dst += dst_stride;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (1 - src_stride_4x);
-    src9 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src10, src11);
-    src12 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src13 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src14, src15);
-    src16 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
-
-    DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2, 
src6, 0x02,
-              src3, src7, 0x02, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10, 
src14, 0x02,
-              src11, src15, 0x02, src4, src5, src6, src7);
-    DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02, src8, 
src9);
-
-    DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum0, sum2, sum4, sum6);
-    DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum1, sum3, sum5, sum7);
-    src8 = __lasx_xvilvl_h(src9, src4);
-    src9 = __lasx_xvilvh_h(src9, src4);
-
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
-              sum3, sum3, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
-              sum7, sum7, src4, src5, src6, src7);
-    DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
-
-    DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
-              sum7, sum6, 2, sum0, sum1, sum2, sum3);
-    __lasx_xvstelm_d(sum0, dst, 0, 0);
-    __lasx_xvstelm_d(sum0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 0);
-    __lasx_xvstelm_d(sum1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 0);
-    __lasx_xvstelm_d(sum2, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 0);
-    __lasx_xvstelm_d(sum3, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum0, dst, 0, 2);
-    __lasx_xvstelm_d(sum0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 2);
-    __lasx_xvstelm_d(sum1, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 2);
-    __lasx_xvstelm_d(sum2, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 2);
-    __lasx_xvstelm_d(sum3, dst, 8, 3);
-}
-
-static void common_hv_bil_no_rnd_8x16_lasx(const uint8_t *src,
-                                           int32_t src_stride,
-                                           uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
-    __m256i src10, src11, src12, src13, src14, src15, src16, src17;
-    __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (1 - src_stride_4x);
-    src9 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src10, src11);
-    src12 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src13 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src14, src15);
-    src16 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
-
-    DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
-              src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
-              src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
-    DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02, src8, 
src9);
-
-    DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum0, sum2, sum4, sum6);
-    DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8, src3,
-              sum1, sum3, sum5, sum7);
-    src8 = __lasx_xvilvl_h(src9, src4);
-    src9 = __lasx_xvilvh_h(src9, src4);
+    __m256i src0, src1, src2, src3, src4;
+    int32_t stride2x = line_size << 1;
+    int32_t stride4x = line_size << 2;
+    int32_t stride3x = stride2x + line_size;
+    uint8_t* _src = (uint8_t*)pixels;
+    int32_t h_4 = h >> 2;
 
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
-              sum3, sum3, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
-              sum7, sum7, src4, src5, src6, src7);
-    DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
+    for (int i = 0; i < h_4; i++) {
+        src0 = __lasx_xvld(_src, 0);
+        DUP2_ARG2(__lasx_xvldx, _src, line_size, _src, stride2x, src1, src2);
+        src3 = __lasx_xvldx(_src, stride3x);
+        _src += stride4x;
+        src4 = __lasx_xvld(_src, 0);
 
-    DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3, src5,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7, src9,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum4, 1, sum5, 1, sum6, 1, sum7, 1,
-              sum4, sum5, sum6, sum7);
-    DUP4_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5, sum4, 2,
-              sum7, sum6, 2, sum0, sum1, sum2, sum3);
-    __lasx_xvstelm_d(sum0, dst, 0, 0);
-    __lasx_xvstelm_d(sum0, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 0);
-    __lasx_xvstelm_d(sum1, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 0);
-    __lasx_xvstelm_d(sum2, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 0);
-    __lasx_xvstelm_d(sum3, dst, 8, 1);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum0, dst, 0, 2);
-    __lasx_xvstelm_d(sum0, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum1, dst, 0, 2);
-    __lasx_xvstelm_d(sum1, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum2, dst, 0, 2);
-    __lasx_xvstelm_d(sum2, dst, 8, 3);
-    dst += dst_stride;
-    __lasx_xvstelm_d(sum3, dst, 0, 2);
-    __lasx_xvstelm_d(sum3, dst, 8, 3);
+        DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, 
src2,
+                  0x20, src4, src3, 0x20, src0, src1, src2, src3);
+        DUP2_ARG2(__lasx_xvavg_bu, src0, src1, src2, src3, src0, src2);
+
+        __lasx_xvstelm_d(src0, block, 0, 0);
+        __lasx_xvstelm_d(src0, block, 8, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 2);
+        __lasx_xvstelm_d(src0, block, 8, 3);
+        block += line_size;
+        __lasx_xvstelm_d(src2, block, 0, 0);
+        __lasx_xvstelm_d(src2, block, 8, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src2, block, 0, 2);
+        __lasx_xvstelm_d(src2, block, 8, 3);
+        block += line_size;
+    }
 }
 
 void ff_put_no_rnd_pixels16_xy2_8_lasx(uint8_t *block,
                                        const uint8_t *pixels,
                                        ptrdiff_t line_size, int h)
 {
-    if (h == 16) {
-        common_hv_bil_no_rnd_16x16_lasx(pixels, line_size, block, line_size);
-    } else if (h == 8) {
-        common_hv_bil_no_rnd_8x16_lasx(pixels, line_size, block, line_size);
-    }
-}
-
-static void common_hz_bil_no_rnd_8x8_lasx(const uint8_t *src,
-                                          int32_t src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    __m256i src8, src9, src10, src11, src12, src13, src14, src15;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_4x = dst_stride << 2;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
+    __m256i src0, src1, src2, src3;
+    __m256i sum0, sum1, sum2;
+    src0 = __lasx_xvld(pixels, 0);
+    src1 = __lasx_xvld(pixels, 1);
+    src2 = __lasx_vext2xv_hu_bu(src0);
+    src3 = __lasx_vext2xv_hu_bu(src1);
+    sum0 = __lasx_xvadd_h(src2, src3);
+    sum0 = __lasx_xvaddi_hu(sum0, 1);
 
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (1 - src_stride_4x);
-    src8 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src9, 
src10);
-    src11 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src12 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src13, src14);
-    src15 = __lasx_xvldx(_src, src_stride_3x);
+    for (int i= 0; i < h; i++) {
+        pixels += line_size;
+        src0 = __lasx_xvld(pixels, 0);
+        src1 = __lasx_xvld(pixels, 1);
 
-    DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src3, src2, src5, src4, src7,
-              src6, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvpickev_d, src9, src8, src11, src10, src13, src12, src15,
-              src14, src4, src5, src6, src7);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src5, src4,
-              0x20, src7, src6, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src2);
-    src1 = __lasx_xvavg_bu(src1, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
-    dst += dst_stride_4x;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src1, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src1, dst + dst_stride_3x, 0, 3);
-}
+        src2 = __lasx_vext2xv_hu_bu(src0);
+        src3 = __lasx_vext2xv_hu_bu(src1);
+        sum1 = __lasx_xvadd_h(src2, src3);
+        sum2 = __lasx_xvadd_h(sum0, sum1);
+        sum2 = __lasx_xvsrani_b_h(sum2, sum2, 2);
 
-static void common_hz_bil_no_rnd_4x8_lasx(const uint8_t *src,
-                                          int32_t src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    uint8_t *_src = (uint8_t*)src;
+        sum0 = __lasx_xvaddi_hu(sum1, 1);
+        __lasx_xvstelm_d(sum2, block, 0, 0);
+        __lasx_xvstelm_d(sum2, block, 8, 3);
 
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src3, src2, src5, src4, src7, 
src6,
-              src0, src1, src2, src3);
-    DUP2_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src0, 
src1);
-    src0 = __lasx_xvavg_bu(src0, src1);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
+        block += line_size;
+    }
 }
 
+/**
+ * For widths 8, h is always a positive multiple of 4.
+ * The function processes 4 rows per iteration.
+ */
 void ff_put_no_rnd_pixels8_x2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                      ptrdiff_t line_size, int h)
 {
-    if (h == 8) {
-        common_hz_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
-    } else if (h == 4) {
-        common_hz_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
+    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
+    int32_t stride2x = line_size << 1;
+    int32_t stride3x = stride2x + line_size;
+    int32_t stride4x = line_size << 2;
+    uint8_t *_src = (uint8_t*)pixels + 1;
+    int32_t h_4 = h >> 2;
+
+    for (int i = 0; i < h_4; i++) {
+        src0 = __lasx_xvld(pixels, 0);
+        DUP2_ARG2(__lasx_xvldx, pixels, line_size, pixels, stride2x, src1, 
src2);
+        src3 = __lasx_xvldx(pixels, stride3x);
+        src4 = __lasx_xvld(_src, 0);
+        DUP2_ARG2(__lasx_xvldx, _src, line_size, _src, stride2x, src5, src6);
+        src7 = __lasx_xvldx(_src, stride3x);
+        DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src3, src2, src5, src4, src7, 
src6,
+                  src0, src1, src2, src3);
+        DUP2_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src3, src2, 0x20, src0, 
src1);
+        src0 = __lasx_xvavg_bu(src0, src1);
+        __lasx_xvstelm_d(src0, block, 0, 0);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 2);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 3);
+        block += line_size;
+
+        pixels += stride4x;
+        _src += stride4x;
     }
 }
 
-static void common_vt_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t 
src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_4x = dst_stride << 2;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src8 = __lasx_xvld(_src, 0);
-
-    DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src2, src1, src3, src2, src4, 
src3,
-              src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvpickev_d, src5, src4, src6, src5, src7, src6, src8, 
src7,
-              src4, src5, src6, src7);
-    DUP4_ARG3(__lasx_xvpermi_q, src2, src0, 0x20, src3, src1, 0x20, src6, src4,
-              0x20, src7, src5, 0x20, src0, src1, src2, src3);
-    src0 = __lasx_xvavg_bu(src0, src1);
-    src1 = __lasx_xvavg_bu(src2, src3);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
-    dst += dst_stride_4x;
-    __lasx_xvstelm_d(src1, dst, 0, 0);
-    __lasx_xvstelm_d(src1, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src1, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src1, dst + dst_stride_3x, 0, 3);
-}
-
-static void common_vt_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t 
src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP4_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, _src,
-              src_stride_3x, _src, src_stride_4x, src1, src2, src3, src4);
-    DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src2, src1, src3, src2, src4, 
src3,
-              src0, src1, src2, src3);
-    DUP2_ARG3(__lasx_xvpermi_q, src2, src0, 0x20, src3, src1, 0x20, src0, 
src1);
-    src0 = __lasx_xvavg_bu(src0, src1);
-    __lasx_xvstelm_d(src0, dst, 0, 0);
-    __lasx_xvstelm_d(src0, dst + dst_stride, 0, 1);
-    __lasx_xvstelm_d(src0, dst + dst_stride_2x, 0, 2);
-    __lasx_xvstelm_d(src0, dst + dst_stride_3x, 0, 3);
-}
-
+/**
+ * For widths 8, h is always a positive multiple of 4.
+ * The function processes 4 rows per iteration.
+ */
 void ff_put_no_rnd_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                      ptrdiff_t line_size, int h)
 {
-    if (h == 8) {
-        common_vt_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
-    } else if (h == 4) {
-        common_vt_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
-    }
-}
-
-static void common_hv_bil_no_rnd_8x8_lasx(const uint8_t *src, int32_t 
src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    __m256i src8, src9, src10, src11, src12, src13, src14, src15, src16, src17;
-    __m256i sum0, sum1, sum2, sum3;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_4x = dst_stride << 2;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src4 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, src6);
-    src7 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (1 - src_stride_4x);
-    src9 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src10, src11);
-    src12 = __lasx_xvldx(_src, src_stride_3x);
-    _src += src_stride_4x;
-    src13 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-              src14, src15);
-    src16 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
-
-    DUP4_ARG2(__lasx_xvilvl_b, src9, src0, src10, src1, src11, src2, src12, 
src3,
-              src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvilvl_b, src13, src4, src14, src5, src15, src6, src16, 
src7,
-              src4, src5, src6, src7);
-    src8 = __lasx_xvilvl_b(src17, src8);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
-              0x20, src4, src3, 0x20, src0, src1, src2, src3);
-    DUP4_ARG3(__lasx_xvpermi_q, src5, src4, 0x20, src6, src5, 0x20, src7, src6,
-              0x20, src8, src7, 0x20, src4, src5, src6, src7);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, src0, src0, src1, src1, src2, src2,
-              src3, src3, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, src4, src4, src5, src5, src6, src6,
-              src7, src7, src4, src5, src6, src7);
-    DUP4_ARG2(__lasx_xvadd_h, src0, src1, src2, src3, src4, src5, src6, src7,
-              sum0, sum1, sum2, sum3);
-    DUP4_ARG2(__lasx_xvaddi_hu, sum0, 1, sum1, 1, sum2, 1, sum3, 1,
-              sum0, sum1, sum2, sum3);
-    DUP2_ARG3(__lasx_xvsrani_b_h, sum1, sum0, 2, sum3, sum2, 2, sum0, sum1);
-    __lasx_xvstelm_d(sum0, dst, 0, 0);
-    __lasx_xvstelm_d(sum0, dst + dst_stride, 0, 2);
-    __lasx_xvstelm_d(sum0, dst + dst_stride_2x, 0, 1);
-    __lasx_xvstelm_d(sum0, dst + dst_stride_3x, 0, 3);
-    dst += dst_stride_4x;
-    __lasx_xvstelm_d(sum1, dst, 0, 0);
-    __lasx_xvstelm_d(sum1, dst + dst_stride, 0, 2);
-    __lasx_xvstelm_d(sum1, dst + dst_stride_2x, 0, 1);
-    __lasx_xvstelm_d(sum1, dst + dst_stride_3x, 0, 3);
-}
-
-static void common_hv_bil_no_rnd_4x8_lasx(const uint8_t *src, int32_t 
src_stride,
-                                          uint8_t *dst, int32_t dst_stride)
-{
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7;
-    __m256i src8, src9, sum0, sum1;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t dst_stride_2x = dst_stride << 1;
-    int32_t dst_stride_3x = dst_stride_2x + dst_stride;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t *_src = (uint8_t*)src;
-
-    src0 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, src2);
-    src3 = __lasx_xvldx(_src, src_stride_3x);
-    _src += 1;
-    src5 = __lasx_xvld(_src, 0);
-    DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src6, src7);
-    src8 = __lasx_xvldx(_src, src_stride_3x);
-    _src += (src_stride_4x - 1);
-    DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src4, src9);
-
-    DUP4_ARG2(__lasx_xvilvl_b, src5, src0, src6, src1, src7, src2, src8, src3,
-              src0, src1, src2, src3);
-    src4 = __lasx_xvilvl_b(src9, src4);
-    DUP4_ARG3(__lasx_xvpermi_q, src1, src0, 0x20, src2, src1, 0x20, src3, src2,
-              0x20, src4, src3, 0x20, src0, src1, src2, src3);
-    DUP4_ARG2(__lasx_xvhaddw_hu_bu, src0, src0, src1, src1, src2, src2,
-              src3, src3, src0, src1, src2, src3);
-    DUP2_ARG2(__lasx_xvadd_h, src0, src1, src2, src3, sum0, sum1);
-    sum0 = __lasx_xvaddi_hu(sum0, 1);
-    sum1 = __lasx_xvaddi_hu(sum1, 1);
-    sum0 = __lasx_xvsrani_b_h(sum1, sum0, 2);
-    __lasx_xvstelm_d(sum0, dst, 0, 0);
-    __lasx_xvstelm_d(sum0, dst + dst_stride, 0, 2);
-    __lasx_xvstelm_d(sum0, dst + dst_stride_2x, 0, 1);
-    __lasx_xvstelm_d(sum0, dst + dst_stride_3x, 0, 3);
-}
+    __m256i src0, src1, src2, src3, src4;
+    int32_t stride2x = line_size << 1;
+    int32_t stride4x = line_size << 2;
+    int32_t stride3x = stride2x + line_size;
+    uint8_t* _src = (uint8_t*)pixels;
+    int32_t h_4 = h >> 2;
 
-void ff_put_no_rnd_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
-                                      ptrdiff_t line_size, int h)
-{
-    if (h == 8) {
-        common_hv_bil_no_rnd_8x8_lasx(pixels, line_size, block, line_size);
-    } else if (h == 4) {
-        common_hv_bil_no_rnd_4x8_lasx(pixels, line_size, block, line_size);
+    for (int i = 0; i < h_4; i++) {
+        src0 = __lasx_xvld(_src, 0);
+        DUP4_ARG2(__lasx_xvldx, _src, line_size, _src, stride2x, _src,
+                  stride3x, _src, stride4x, src1, src2, src3, src4);
+        DUP4_ARG2(__lasx_xvpickev_d, src1, src0, src2, src1, src3, src2, src4, 
src3,
+                  src0, src1, src2, src3);
+        DUP2_ARG3(__lasx_xvpermi_q, src2, src0, 0x20, src3, src1, 0x20, src0, 
src1);
+        src0 = __lasx_xvavg_bu(src0, src1);
+        __lasx_xvstelm_d(src0, block, 0, 0);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 1);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 2);
+        block += line_size;
+        __lasx_xvstelm_d(src0, block, 0, 3);
+        block += line_size;
+
+        _src += stride4x;
     }
 }
 
-static void common_hv_bil_16w_lasx(const uint8_t *src, int32_t src_stride,
-                                   uint8_t *dst, int32_t dst_stride,
-                                   uint8_t height)
+void ff_put_no_rnd_pixels8_xy2_8_lsx(uint8_t *block, const uint8_t *pixels,
+                                     ptrdiff_t line_size, int h)
 {
-    __m256i src0, src1, src2, src3, src4, src5, src6, src7, src8, src9;
-    __m256i src10, src11, src12, src13, src14, src15, src16, src17;
-    __m256i sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
-    uint8_t loop_cnt;
-    int32_t src_stride_2x = src_stride << 1;
-    int32_t src_stride_4x = src_stride << 2;
-    int32_t src_stride_3x = src_stride_2x + src_stride;
-    uint8_t* _src = (uint8_t*)src;
-
-    for (loop_cnt = (height >> 3); loop_cnt--;) {
-        src0 = __lasx_xvld(_src, 0);
-        DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src1, 
src2);
-        src3 = __lasx_xvldx(_src, src_stride_3x);
-        _src += src_stride_4x;
-        src4 = __lasx_xvld(_src, 0);
-        DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x, src5, 
src6);
-        src7 = __lasx_xvldx(_src, src_stride_3x);
-        _src += (1 - src_stride_4x);
-        src9 = __lasx_xvld(_src, 0);
-        DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-                  src10, src11);
-        src12 = __lasx_xvldx(_src, src_stride_3x);
-        _src += src_stride_4x;
-        src13 = __lasx_xvld(_src, 0);
-        DUP2_ARG2(__lasx_xvldx, _src, src_stride, _src, src_stride_2x,
-                  src14, src15);
-        src16 = __lasx_xvldx(_src, src_stride_3x);
-        _src += (src_stride_4x - 1);
-        DUP2_ARG2(__lasx_xvld, _src, 0, _src, 1, src8, src17);
-
-        DUP4_ARG3(__lasx_xvpermi_q, src0, src4, 0x02, src1, src5, 0x02, src2,
-                  src6, 0x02, src3, src7, 0x02, src0, src1, src2, src3);
-        DUP4_ARG3(__lasx_xvpermi_q, src4, src8, 0x02, src9, src13, 0x02, src10,
-                  src14, 0x02, src11, src15, 0x02, src4, src5, src6, src7);
-        DUP2_ARG3(__lasx_xvpermi_q, src12, src16, 0x02, src13, src17, 0x02,
-                   src8, src9);
-
-        DUP4_ARG2(__lasx_xvilvl_h, src5, src0, src6, src1, src7, src2, src8,
-                  src3, sum0, sum2, sum4, sum6);
-        DUP4_ARG2(__lasx_xvilvh_h, src5, src0, src6, src1, src7, src2, src8,
-                  src3, sum1, sum3, sum5, sum7);
-        src8 = __lasx_xvilvl_h(src9, src4);
-        src9 = __lasx_xvilvh_h(src9, src4);
-
-        DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum0, sum0, sum1, sum1, sum2, sum2,
-                  sum3, sum3, src0, src1, src2, src3);
-        DUP4_ARG2(__lasx_xvhaddw_hu_bu, sum4, sum4, sum5, sum5, sum6, sum6,
-                  sum7, sum7, src4, src5, src6, src7);
-        DUP2_ARG2(__lasx_xvhaddw_hu_bu, src8, src8, src9, src9, src8, src9);
-
-        DUP4_ARG2(__lasx_xvadd_h, src0, src2, src1, src3, src2, src4, src3,
-                  src5, sum0, sum1, sum2, sum3);
-        DUP4_ARG2(__lasx_xvadd_h, src4, src6, src5, src7, src6, src8, src7,
-                  src9, sum4, sum5, sum6, sum7);
-        DUP4_ARG3(__lasx_xvsrarni_b_h, sum1, sum0, 2, sum3, sum2, 2, sum5,
-                  sum4, 2, sum7, sum6, 2, sum0, sum1, sum2, sum3);
-        __lasx_xvstelm_d(sum0, dst, 0, 0);
-        __lasx_xvstelm_d(sum0, dst, 8, 1);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum1, dst, 0, 0);
-        __lasx_xvstelm_d(sum1, dst, 8, 1);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum2, dst, 0, 0);
-        __lasx_xvstelm_d(sum2, dst, 8, 1);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum3, dst, 0, 0);
-        __lasx_xvstelm_d(sum3, dst, 8, 1);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum0, dst, 0, 2);
-        __lasx_xvstelm_d(sum0, dst, 8, 3);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum1, dst, 0, 2);
-        __lasx_xvstelm_d(sum1, dst, 8, 3);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum2, dst, 0, 2);
-        __lasx_xvstelm_d(sum2, dst, 8, 3);
-        dst += dst_stride;
-        __lasx_xvstelm_d(sum3, dst, 0, 2);
-        __lasx_xvstelm_d(sum3, dst, 8, 3);
-        dst += dst_stride;
+    __m128i src0, src1, src2, src3;
+    __m128i sum0, sum1, sum2;
+
+    src0 = __lsx_vld(pixels, 0);
+    src1 = __lsx_vld(pixels, 1);
+    src2 = __lsx_vsllwil_hu_bu(src0, 0);
+    src3 = __lsx_vsllwil_hu_bu(src1, 0);
+    sum0 = __lsx_vadd_h(src2, src3);
+    sum0 = __lsx_vaddi_hu(sum0, 1);
+
+    for (int i = 0; i < h; i++) {
+        pixels += line_size;
+        src0 = __lsx_vld(pixels, 0);
+        src1 = __lsx_vld(pixels, 1);
+        src2 = __lsx_vsllwil_hu_bu(src0, 0);
+        src3 = __lsx_vsllwil_hu_bu(src1, 0);
+        sum1 = __lsx_vadd_h(src2, src3);
+        sum2 = __lsx_vadd_h(sum0, sum1);
+        sum2 = __lsx_vsrani_b_h(sum2, sum2, 2);
+
+        sum0 = __lsx_vaddi_hu(sum1, 1);
+        __lsx_vstelm_d(sum2, block, 0, 0);
+
+        block += line_size;
     }
 }
 
 void ff_put_pixels16_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                 ptrdiff_t line_size, int h)
 {
-    common_hv_bil_16w_lasx(pixels, line_size, block, line_size, h);
+    __m256i src0, src1, src2, src3;
+    __m256i sum0, sum1, sum2;
+
+    src0 = __lasx_xvld(pixels, 0);
+    src1 = __lasx_xvld(pixels, 1);
+    src2 = __lasx_vext2xv_hu_bu(src0);
+    src3 = __lasx_vext2xv_hu_bu(src1);
+    sum0 = __lasx_xvadd_h(src2, src3);
+    sum0 = __lasx_xvaddi_hu(sum0, 2);
+
+    for (int i = 0; i < h; i++) {
+        pixels += line_size;
+        src0 = __lasx_xvld(pixels, 0);
+        src1 = __lasx_xvld(pixels, 1);
+
+        src2 = __lasx_vext2xv_hu_bu(src0);
+        src3 = __lasx_vext2xv_hu_bu(src1);
+        sum1 = __lasx_xvadd_h(src2, src3);
+        sum2 = __lasx_xvadd_h(sum0, sum1);
+        sum2 = __lasx_xvsrani_b_h(sum2, sum2, 2);
+        sum0 = __lasx_xvaddi_hu(sum1, 2);
+        __lasx_xvstelm_d(sum2, block, 0, 0);
+        __lasx_xvstelm_d(sum2, block, 8, 3);
+        block += line_size;
+    }
 }
 
 static void common_hv_bil_8w_lasx(const uint8_t *src, int32_t src_stride,
diff --git a/libavcodec/loongarch/hpeldsp_lasx.h 
b/libavcodec/loongarch/hpeldsp_lasx.h
index 2e035eade8..df3987d308 100644
--- a/libavcodec/loongarch/hpeldsp_lasx.h
+++ b/libavcodec/loongarch/hpeldsp_lasx.h
@@ -49,8 +49,8 @@ void ff_put_no_rnd_pixels8_x2_8_lasx(uint8_t *block, const 
uint8_t *pixels,
                                      ptrdiff_t line_size, int h);
 void ff_put_no_rnd_pixels8_y2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                      ptrdiff_t line_size, int h);
-void ff_put_no_rnd_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
-                                      ptrdiff_t line_size, int h);
+void ff_put_no_rnd_pixels8_xy2_8_lsx(uint8_t *block, const uint8_t *pixels,
+                                     ptrdiff_t line_size, int h);
 void ff_put_pixels8_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,
                                ptrdiff_t line_size, int h);
 void ff_put_pixels16_xy2_8_lasx(uint8_t *block, const uint8_t *pixels,

-----------------------------------------------------------------------

Summary of changes:
 libavcodec/loongarch/hpeldsp_init_loongarch.c |    2 +-
 libavcodec/loongarch/hpeldsp_lasx.c           | 1192 +++++--------------------
 libavcodec/loongarch/hpeldsp_lasx.h           |    4 +-
 3 files changed, 231 insertions(+), 967 deletions(-)


hooks/post-receive
-- 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to