PR #24814 opened by Zhao Zhili (quink)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24814
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24814.patch

# Summary of changes

Briefly describe what this PR does and why.

<!--
If this PR requires new FATE test samples, attach them to the PR and
list their target paths below (relative to the fate-suite root).

Attached filenames must match the sample's filename:

```fate-samples
# e.g. vorbis/new-sample.ogg
```
-->



>From 1307249f615731e660eba0397dfff6c1a4e83914 Mon Sep 17 00:00:00 2001
From: Zhao Zhili <[email protected]>
Date: Wed, 30 Sep 2026 19:23:36 +0800
Subject: [PATCH 1/4] aarch64/h26x: factor the weighted qpel hv vertical row
 step into macros

No functional changes.
---
 libavcodec/aarch64/h26x/qpel_neon.S | 353 +++++++---------------------
 1 file changed, 89 insertions(+), 264 deletions(-)

diff --git a/libavcodec/aarch64/h26x/qpel_neon.S 
b/libavcodec/aarch64/h26x/qpel_neon.S
index 25925665dc..e06e7f4356 100644
--- a/libavcodec/aarch64/h26x/qpel_neon.S
+++ b/libavcodec/aarch64/h26x/qpel_neon.S
@@ -5491,6 +5491,14 @@ DISABLE_I8MM
         smlal2          \dst\().4s, \src7\().8h, v0.h[7]
 .endm
 
+.macro qpel_uni_w_hv4_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
+        ldr             \tmp, [sp]
+        add             sp, sp, x10
+        QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        subs            w22, w22, #1
+        QPEL_UNI_W_HV_4
+.endm
+
 function hevc_put_hevc_qpel_uni_w_hv4_8_end_neon
         ldr             d16, [sp]
         ldr             d17, [sp, x10]
@@ -5504,60 +5512,28 @@ function hevc_put_hevc_qpel_uni_w_hv4_8_end_neon
         ldr             d22, [sp]
         add             sp, sp, x10
 1:
-        ldr             d23, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v16, v17, v18, v19, v20, v21, v22, v23
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d23, v16, v17, v18, v19, v20, v21, v22, v23
         b.eq            2f
 
-        ldr             d16, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v17, v18, v19, v20, v21, v22, v23, v16
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d16, v17, v18, v19, v20, v21, v22, v23, v16
         b.eq            2f
 
-        ldr             d17, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v18, v19, v20, v21, v22, v23, v16, v17
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d17, v18, v19, v20, v21, v22, v23, v16, v17
         b.eq            2f
 
-        ldr             d18, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v19, v20, v21, v22, v23, v16, v17, v18
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d18, v19, v20, v21, v22, v23, v16, v17, v18
         b.eq            2f
 
-        ldr             d19, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v20, v21, v22, v23, v16, v17, v18, v19
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d19, v20, v21, v22, v23, v16, v17, v18, v19
         b.eq            2f
 
-        ldr             d20, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v21, v22, v23, v16, v17, v18, v19, v20
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d20, v21, v22, v23, v16, v17, v18, v19, v20
         b.eq            2f
 
-        ldr             d21, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v22, v23, v16, v17, v18, v19, v20, v21
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d21, v22, v23, v16, v17, v18, v19, v20, v21
         b.eq            2f
 
-        ldr             d22, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v23, v16, v17, v18, v19, v20, v21, v22
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_4
+        qpel_uni_w_hv4_end_step d22, v23, v16, v17, v18, v19, v20, v21, v22
         b.hi            1b
 
 2:
@@ -5583,6 +5559,15 @@ endfunc
         st1             {v24.h}[2], [x15]
 .endm
 
+.macro qpel_uni_w_hv6_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
+        ldr             \tmp, [sp]
+        add             sp, sp, x10
+        QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H2  v27, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        subs            w22, w22, #1
+        QPEL_UNI_W_HV_6
+.endm
+
 function hevc_put_hevc_qpel_uni_w_hv6_8_end_neon
         ldr             q16, [sp]
         ldr             q17, [sp, x10]
@@ -5596,68 +5581,28 @@ function hevc_put_hevc_qpel_uni_w_hv6_8_end_neon
         ldr             q22, [sp]
         add             sp, sp, x10
 1:
-        ldr             q23, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H2  v27, v16, v17, v18, v19, v20, v21, v22, v23
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q23, v16, v17, v18, v19, v20, v21, v22, v23
         b.eq            2f
 
-        ldr             q16, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H2  v27, v17, v18, v19, v20, v21, v22, v23, v16
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q16, v17, v18, v19, v20, v21, v22, v23, v16
         b.eq            2f
 
-        ldr             q17, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H2  v27, v18, v19, v20, v21, v22, v23, v16, v17
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q17, v18, v19, v20, v21, v22, v23, v16, v17
         b.eq            2f
 
-        ldr             q18, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H2  v27, v19, v20, v21, v22, v23, v16, v17, v18
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q18, v19, v20, v21, v22, v23, v16, v17, v18
         b.eq            2f
 
-        ldr             q19, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H2  v27, v20, v21, v22, v23, v16, v17, v18, v19
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q19, v20, v21, v22, v23, v16, v17, v18, v19
         b.eq            2f
 
-        ldr             q20, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H2  v27, v21, v22, v23, v16, v17, v18, v19, v20
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q20, v21, v22, v23, v16, v17, v18, v19, v20
         b.eq            2f
 
-        ldr             q21, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H2  v27, v22, v23, v16, v17, v18, v19, v20, v21
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q21, v22, v23, v16, v17, v18, v19, v20, v21
         b.eq            2f
 
-        ldr             q22, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H2  v27, v23, v16, v17, v18, v19, v20, v21, v22
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_6
+        qpel_uni_w_hv6_end_step q22, v23, v16, v17, v18, v19, v20, v21, v22
         b.hi            1b
 
 2:
@@ -5680,6 +5625,15 @@ endfunc
         st1             {v24.d}[0], [x20], x21
 .endm
 
+.macro qpel_uni_w_hv8_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
+        ldr             \tmp, [sp]
+        add             sp, sp, x10
+        QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H2  v27, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        subs            w22, w22, #1
+        QPEL_UNI_W_HV_8
+.endm
+
 function hevc_put_hevc_qpel_uni_w_hv8_8_end_neon
         ldr             q16, [sp]
         ldr             q17, [sp, x10]
@@ -5693,68 +5647,28 @@ function hevc_put_hevc_qpel_uni_w_hv8_8_end_neon
         ldr             q22, [sp]
         add             sp, sp, x10
 1:
-        ldr             q23, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H2  v27, v16, v17, v18, v19, v20, v21, v22, v23
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q23, v16, v17, v18, v19, v20, v21, v22, v23
         b.eq            2f
 
-        ldr             q16, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H2  v27, v17, v18, v19, v20, v21, v22, v23, v16
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q16, v17, v18, v19, v20, v21, v22, v23, v16
         b.eq            2f
 
-        ldr             q17, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H2  v27, v18, v19, v20, v21, v22, v23, v16, v17
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q17, v18, v19, v20, v21, v22, v23, v16, v17
         b.eq            2f
 
-        ldr             q18, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H2  v27, v19, v20, v21, v22, v23, v16, v17, v18
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q18, v19, v20, v21, v22, v23, v16, v17, v18
         b.eq            2f
 
-        ldr             q19, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H2  v27, v20, v21, v22, v23, v16, v17, v18, v19
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q19, v20, v21, v22, v23, v16, v17, v18, v19
         b.eq            2f
 
-        ldr             q20, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H2  v27, v21, v22, v23, v16, v17, v18, v19, v20
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q20, v21, v22, v23, v16, v17, v18, v19, v20
         b.eq            2f
 
-        ldr             q21, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H2  v27, v22, v23, v16, v17, v18, v19, v20, v21
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q21, v22, v23, v16, v17, v18, v19, v20, v21
         b.eq            2f
 
-        ldr             q22, [sp]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v26, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H2  v27, v23, v16, v17, v18, v19, v20, v21, v22
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_8
+        qpel_uni_w_hv8_end_step q22, v23, v16, v17, v18, v19, v20, v21, v22
         b.hi            1b
 
 2:
@@ -5789,6 +5703,17 @@ endfunc
         st1             {v26.s}[0], [x15]
 .endm
 
+.macro qpel_uni_w_hv12_end_step tmp0, tmp1, src0, src1, src2, src3, src4, 
src5, src6, src7, src8, src9, src10, src11, src12, src13, src14, src15
+        ldr             \tmp0, [sp]
+        ldr             \tmp1, [sp, #16]
+        add             sp, sp, x10
+        QPEL_FILTER_H   v24, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H2  v25, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H   v26, \src8, \src9, \src10, \src11, \src12, \src13, 
\src14, \src15
+        subs            w22, w22, #1
+        QPEL_UNI_W_HV_12
+.endm
+
 function hevc_put_hevc_qpel_uni_w_hv12_8_end_neon
         // Load first 7 rows of 12 elements each
         // Each row: q16-q22 (first 8 elements) + d1-d7 (elements 8-11)
@@ -5814,84 +5739,28 @@ function hevc_put_hevc_qpel_uni_w_hv12_8_end_neon
         ldr             d7, [sp, #16]
         add             sp, sp, x10
 1:
-        ldr             q23, [sp]
-        ldr             d31, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H2  v25, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H   v26,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v31
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q23, d31, v16, v17, v18, v19, v20, v21, v22, 
v23, v1, v2, v3, v4, v5, v6, v7, v31
         b.eq            2f
 
-        ldr             q16, [sp]
-        ldr             d1, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H2  v25, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H   v26,  v2,  v3,  v4,  v5,  v6,  v7, v31,  v1
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q16, d1, v17, v18, v19, v20, v21, v22, v23, 
v16, v2, v3, v4, v5, v6, v7, v31, v1
         b.eq            2f
 
-        ldr             q17, [sp]
-        ldr             d2, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H2  v25, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H   v26,  v3,  v4,  v5,  v6,  v7, v31,  v1,  v2
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q17, d2, v18, v19, v20, v21, v22, v23, v16, 
v17, v3, v4, v5, v6, v7, v31, v1, v2
         b.eq            2f
 
-        ldr             q18, [sp]
-        ldr             d3, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H2  v25, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H   v26,  v4,  v5,  v6,  v7, v31,  v1,  v2,  v3
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q18, d3, v19, v20, v21, v22, v23, v16, v17, 
v18, v4, v5, v6, v7, v31, v1, v2, v3
         b.eq            2f
 
-        ldr             q19, [sp]
-        ldr             d4, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H2  v25, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H   v26,  v5,  v6,  v7, v31,  v1,  v2,  v3,  v4
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q19, d4, v20, v21, v22, v23, v16, v17, v18, 
v19, v5, v6, v7, v31, v1, v2, v3, v4
         b.eq            2f
 
-        ldr             q20, [sp]
-        ldr             d5, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H2  v25, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H   v26,  v6,  v7, v31,  v1,  v2,  v3,  v4,  v5
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q20, d5, v21, v22, v23, v16, v17, v18, v19, 
v20, v6, v7, v31, v1, v2, v3, v4, v5
         b.eq            2f
 
-        ldr             q21, [sp]
-        ldr             d6, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H2  v25, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H   v26,  v7, v31,  v1,  v2,  v3,  v4,  v5,  v6
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q21, d6, v22, v23, v16, v17, v18, v19, v20, 
v21, v7, v31, v1, v2, v3, v4, v5, v6
         b.eq            2f
 
-        ldr             q22, [sp]
-        ldr             d7, [sp, #16]
-        add             sp, sp, x10
-        QPEL_FILTER_H   v24, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H2  v25, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H   v26, v31,  v1,  v2,  v3,  v4,  v5,  v6,  v7
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_12
+        qpel_uni_w_hv12_end_step q22, d7, v23, v16, v17, v18, v19, v20, v21, 
v22, v31, v1, v2, v3, v4, v5, v6, v7
         b.hi            1b
 
 2:
@@ -5926,6 +5795,17 @@ endfunc
         st1             {v24.16b}, [x20], x21
 .endm
 
+.macro qpel_uni_w_hv16_end_step tmp0, tmp1, src0, src1, src2, src3, src4, 
src5, src6, src7, src8, src9, src10, src11, src12, src13, src14, src15
+        ldp             \tmp0, \tmp1, [x11]
+        add             x11, x11, x10
+        QPEL_FILTER_H   v24, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H2  v25, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
+        QPEL_FILTER_H   v26, \src8, \src9, \src10, \src11, \src12, \src13, 
\src14, \src15
+        QPEL_FILTER_H2  v27, \src8, \src9, \src10, \src11, \src12, \src13, 
\src14, \src15
+        subs            w22, w22, #1
+        QPEL_UNI_W_HV_16
+.endm
+
 function hevc_put_hevc_qpel_uni_w_hv16_8_end_neon
         mov             x11, sp
         mov             w12, w22
@@ -5947,85 +5827,30 @@ function hevc_put_hevc_qpel_uni_w_hv16_8_end_neon
         ldp             q22, q7, [x11]
         add             x11, x11, x10
 1:
-        ldp             q23, q31, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H2  v25, v16, v17, v18, v19, v20, v21, v22, v23
-        QPEL_FILTER_H   v26,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v31
-        QPEL_FILTER_H2  v27,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v31
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q23, q31, v16, v17, v18, v19, v20, v21, v22, 
v23, v1, v2, v3, v4, v5, v6, v7, v31
         b.eq            2f
 
-        ldp             q16, q1, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H2  v25, v17, v18, v19, v20, v21, v22, v23, v16
-        QPEL_FILTER_H   v26,  v2,  v3,  v4,  v5,  v6,  v7, v31,  v1
-        QPEL_FILTER_H2  v27,  v2,  v3,  v4,  v5,  v6,  v7, v31,  v1
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q16, q1, v17, v18, v19, v20, v21, v22, v23, 
v16, v2, v3, v4, v5, v6, v7, v31, v1
         b.eq            2f
 
-        ldp             q17, q2, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H2  v25, v18, v19, v20, v21, v22, v23, v16, v17
-        QPEL_FILTER_H   v26,  v3,  v4,  v5,  v6,  v7, v31,  v1,  v2
-        QPEL_FILTER_H2  v27,  v3,  v4,  v5,  v6,  v7, v31,  v1,  v2
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q17, q2, v18, v19, v20, v21, v22, v23, v16, 
v17, v3, v4, v5, v6, v7, v31, v1, v2
         b.eq            2f
 
-        ldp             q18, q3, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H2  v25, v19, v20, v21, v22, v23, v16, v17, v18
-        QPEL_FILTER_H   v26,  v4,  v5,  v6,  v7, v31,  v1,  v2,  v3
-        QPEL_FILTER_H2  v27,  v4,  v5,  v6,  v7, v31,  v1,  v2,  v3
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q18, q3, v19, v20, v21, v22, v23, v16, v17, 
v18, v4, v5, v6, v7, v31, v1, v2, v3
         b.eq            2f
 
-        ldp             q19, q4, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H2  v25, v20, v21, v22, v23, v16, v17, v18, v19
-        QPEL_FILTER_H   v26,  v5,  v6,  v7, v31,  v1,  v2,  v3,  v4
-        QPEL_FILTER_H2  v27,  v5,  v6,  v7, v31,  v1,  v2,  v3,  v4
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q19, q4, v20, v21, v22, v23, v16, v17, v18, 
v19, v5, v6, v7, v31, v1, v2, v3, v4
         b.eq            2f
 
-        ldp             q20, q5, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H2  v25, v21, v22, v23, v16, v17, v18, v19, v20
-        QPEL_FILTER_H   v26,  v6,  v7, v31,  v1,  v2,  v3,  v4,  v5
-        QPEL_FILTER_H2  v27,  v6,  v7, v31,  v1,  v2,  v3,  v4,  v5
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q20, q5, v21, v22, v23, v16, v17, v18, v19, 
v20, v6, v7, v31, v1, v2, v3, v4, v5
         b.eq            2f
 
-        ldp             q21, q6, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H2  v25, v22, v23, v16, v17, v18, v19, v20, v21
-        QPEL_FILTER_H   v26,  v7, v31,  v1,  v2,  v3,  v4,  v5,  v6
-        QPEL_FILTER_H2  v27,  v7, v31,  v1,  v2,  v3,  v4,  v5,  v6
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q21, q6, v22, v23, v16, v17, v18, v19, v20, 
v21, v7, v31, v1, v2, v3, v4, v5, v6
         b.eq            2f
 
-        ldp             q22, q7, [x11]
-        add             x11, x11, x10
-        QPEL_FILTER_H   v24, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H2  v25, v23, v16, v17, v18, v19, v20, v21, v22
-        QPEL_FILTER_H   v26, v31,  v1,  v2,  v3,  v4,  v5,  v6,  v7
-        QPEL_FILTER_H2  v27, v31,  v1,  v2,  v3,  v4,  v5,  v6,  v7
-        subs            w22, w22, #1
-        QPEL_UNI_W_HV_16
+        qpel_uni_w_hv16_end_step q22, q7, v23, v16, v17, v18, v19, v20, v21, 
v22, v31, v1, v2, v3, v4, v5, v6, v7
         b.hi            1b
+
 2:
         subs            w27, w27, #16
         add             x11, x14, #32
-- 
2.52.0


>From 1d56e153dbd90dd4070dc535cdea6806753a6815 Mon Sep 17 00:00:00 2001
From: Zhao Zhili <[email protected]>
Date: Wed, 30 Sep 2026 19:23:54 +0800
Subject: [PATCH 2/4] aarch64/h26x: share the weighted qpel hv vertical tail up
 to 8 wide

No functional changes.
---
 libavcodec/aarch64/h26x/qpel_neon.S | 125 +++++-----------------------
 1 file changed, 22 insertions(+), 103 deletions(-)

diff --git a/libavcodec/aarch64/h26x/qpel_neon.S 
b/libavcodec/aarch64/h26x/qpel_neon.S
index e06e7f4356..51eac7469c 100644
--- a/libavcodec/aarch64/h26x/qpel_neon.S
+++ b/libavcodec/aarch64/h26x/qpel_neon.S
@@ -5499,46 +5499,41 @@ DISABLE_I8MM
         QPEL_UNI_W_HV_4
 .endm
 
-function hevc_put_hevc_qpel_uni_w_hv4_8_end_neon
-        ldr             d16, [sp]
-        ldr             d17, [sp, x10]
+.macro qpel_uni_w_hv_tail reg, step
+        ldr             \reg\()16, [sp]
+        ldr             \reg\()17, [sp, x10]
         add             sp, sp, x10, lsl #1
-        ldr             d18, [sp]
-        ldr             d19, [sp, x10]
+        ldr             \reg\()18, [sp]
+        ldr             \reg\()19, [sp, x10]
         add             sp, sp, x10, lsl #1
-        ldr             d20, [sp]
-        ldr             d21, [sp, x10]
+        ldr             \reg\()20, [sp]
+        ldr             \reg\()21, [sp, x10]
         add             sp, sp, x10, lsl #1
-        ldr             d22, [sp]
+        ldr             \reg\()22, [sp]
         add             sp, sp, x10
-1:
-        qpel_uni_w_hv4_end_step d23, v16, v17, v18, v19, v20, v21, v22, v23
+1:      \step           \reg\()23, v16, v17, v18, v19, v20, v21, v22, v23
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d16, v17, v18, v19, v20, v21, v22, v23, v16
+        \step           \reg\()16, v17, v18, v19, v20, v21, v22, v23, v16
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d17, v18, v19, v20, v21, v22, v23, v16, v17
+        \step           \reg\()17, v18, v19, v20, v21, v22, v23, v16, v17
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d18, v19, v20, v21, v22, v23, v16, v17, v18
+        \step           \reg\()18, v19, v20, v21, v22, v23, v16, v17, v18
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d19, v20, v21, v22, v23, v16, v17, v18, v19
+        \step           \reg\()19, v20, v21, v22, v23, v16, v17, v18, v19
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d20, v21, v22, v23, v16, v17, v18, v19, v20
+        \step           \reg\()20, v21, v22, v23, v16, v17, v18, v19, v20
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d21, v22, v23, v16, v17, v18, v19, v20, v21
+        \step           \reg\()21, v22, v23, v16, v17, v18, v19, v20, v21
         b.eq            2f
-
-        qpel_uni_w_hv4_end_step d22, v23, v16, v17, v18, v19, v20, v21, v22
+        \step           \reg\()22, v23, v16, v17, v18, v19, v20, v21, v22
         b.hi            1b
-
 2:
         QPEL_UNI_W_HV_END
         ret
+.endm
+
+function hevc_put_hevc_qpel_uni_w_hv4_8_end_neon
+        qpel_uni_w_hv_tail d, qpel_uni_w_hv4_end_step
 endfunc
 
 // hv6: process 6 pixels (4 + 2), use 8-element loads/stores
@@ -5569,45 +5564,7 @@ endfunc
 .endm
 
 function hevc_put_hevc_qpel_uni_w_hv6_8_end_neon
-        ldr             q16, [sp]
-        ldr             q17, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q18, [sp]
-        ldr             q19, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q20, [sp]
-        ldr             q21, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q22, [sp]
-        add             sp, sp, x10
-1:
-        qpel_uni_w_hv6_end_step q23, v16, v17, v18, v19, v20, v21, v22, v23
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q16, v17, v18, v19, v20, v21, v22, v23, v16
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q17, v18, v19, v20, v21, v22, v23, v16, v17
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q18, v19, v20, v21, v22, v23, v16, v17, v18
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q19, v20, v21, v22, v23, v16, v17, v18, v19
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q20, v21, v22, v23, v16, v17, v18, v19, v20
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q21, v22, v23, v16, v17, v18, v19, v20, v21
-        b.eq            2f
-
-        qpel_uni_w_hv6_end_step q22, v23, v16, v17, v18, v19, v20, v21, v22
-        b.hi            1b
-
-2:
-        QPEL_UNI_W_HV_END
-        ret
+        qpel_uni_w_hv_tail q, qpel_uni_w_hv6_end_step
 endfunc
 
 .macro QPEL_UNI_W_HV_8
@@ -5635,45 +5592,7 @@ endfunc
 .endm
 
 function hevc_put_hevc_qpel_uni_w_hv8_8_end_neon
-        ldr             q16, [sp]
-        ldr             q17, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q18, [sp]
-        ldr             q19, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q20, [sp]
-        ldr             q21, [sp, x10]
-        add             sp, sp, x10, lsl #1
-        ldr             q22, [sp]
-        add             sp, sp, x10
-1:
-        qpel_uni_w_hv8_end_step q23, v16, v17, v18, v19, v20, v21, v22, v23
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q16, v17, v18, v19, v20, v21, v22, v23, v16
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q17, v18, v19, v20, v21, v22, v23, v16, v17
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q18, v19, v20, v21, v22, v23, v16, v17, v18
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q19, v20, v21, v22, v23, v16, v17, v18, v19
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q20, v21, v22, v23, v16, v17, v18, v19, v20
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q21, v22, v23, v16, v17, v18, v19, v20, v21
-        b.eq            2f
-
-        qpel_uni_w_hv8_end_step q22, v23, v16, v17, v18, v19, v20, v21, v22
-        b.hi            1b
-
-2:
-        QPEL_UNI_W_HV_END
-        ret
+        qpel_uni_w_hv_tail q, qpel_uni_w_hv8_end_step
 endfunc
 
 // hv12: process 12 pixels = 8 + 4
-- 
2.52.0


>From 99c894812615ad5535f47ac2d108abd0dfdf416d Mon Sep 17 00:00:00 2001
From: Zhao Zhili <[email protected]>
Date: Wed, 30 Sep 2026 19:55:14 +0800
Subject: [PATCH 3/4] aarch64/h26x: load a weighted qpel hv row with one
 instruction

The unweighted step macros in this file let a post-indexed load walk the
intermediate plane, while these weighted steps loaded a row and then advanced
sp with a separate add. Fold the advance into the load.

The step macro now names its row register without a width letter, which is
what the next change needs in order to drive these tails from calc_all.
---
 libavcodec/aarch64/h26x/qpel_neon.S | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/libavcodec/aarch64/h26x/qpel_neon.S 
b/libavcodec/aarch64/h26x/qpel_neon.S
index 51eac7469c..b8f5f17df7 100644
--- a/libavcodec/aarch64/h26x/qpel_neon.S
+++ b/libavcodec/aarch64/h26x/qpel_neon.S
@@ -5492,8 +5492,7 @@ DISABLE_I8MM
 .endm
 
 .macro qpel_uni_w_hv4_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
-        ldr             \tmp, [sp]
-        add             sp, sp, x10
+        ld1             {\tmp\().4h}, [sp], x10
         QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
         subs            w22, w22, #1
         QPEL_UNI_W_HV_4
@@ -5511,21 +5510,21 @@ DISABLE_I8MM
         add             sp, sp, x10, lsl #1
         ldr             \reg\()22, [sp]
         add             sp, sp, x10
-1:      \step           \reg\()23, v16, v17, v18, v19, v20, v21, v22, v23
+1:      \step           v23, v16, v17, v18, v19, v20, v21, v22, v23
         b.eq            2f
-        \step           \reg\()16, v17, v18, v19, v20, v21, v22, v23, v16
+        \step           v16, v17, v18, v19, v20, v21, v22, v23, v16
         b.eq            2f
-        \step           \reg\()17, v18, v19, v20, v21, v22, v23, v16, v17
+        \step           v17, v18, v19, v20, v21, v22, v23, v16, v17
         b.eq            2f
-        \step           \reg\()18, v19, v20, v21, v22, v23, v16, v17, v18
+        \step           v18, v19, v20, v21, v22, v23, v16, v17, v18
         b.eq            2f
-        \step           \reg\()19, v20, v21, v22, v23, v16, v17, v18, v19
+        \step           v19, v20, v21, v22, v23, v16, v17, v18, v19
         b.eq            2f
-        \step           \reg\()20, v21, v22, v23, v16, v17, v18, v19, v20
+        \step           v20, v21, v22, v23, v16, v17, v18, v19, v20
         b.eq            2f
-        \step           \reg\()21, v22, v23, v16, v17, v18, v19, v20, v21
+        \step           v21, v22, v23, v16, v17, v18, v19, v20, v21
         b.eq            2f
-        \step           \reg\()22, v23, v16, v17, v18, v19, v20, v21, v22
+        \step           v22, v23, v16, v17, v18, v19, v20, v21, v22
         b.hi            1b
 2:
         QPEL_UNI_W_HV_END
@@ -5555,8 +5554,7 @@ endfunc
 .endm
 
 .macro qpel_uni_w_hv6_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
-        ldr             \tmp, [sp]
-        add             sp, sp, x10
+        ld1             {\tmp\().8h}, [sp], x10
         QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
         QPEL_FILTER_H2  v27, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
         subs            w22, w22, #1
@@ -5583,8 +5581,7 @@ endfunc
 .endm
 
 .macro qpel_uni_w_hv8_end_step tmp, src0, src1, src2, src3, src4, src5, src6, 
src7
-        ldr             \tmp, [sp]
-        add             sp, sp, x10
+        ld1             {\tmp\().8h}, [sp], x10
         QPEL_FILTER_H   v26, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
         QPEL_FILTER_H2  v27, \src0, \src1, \src2, \src3, \src4, \src5, \src6, 
\src7
         subs            w22, w22, #1
-- 
2.52.0


>From 072b3b04ed3285b30a425fddb2257fe0971656d8 Mon Sep 17 00:00:00 2001
From: Zhao Zhili <[email protected]>
Date: Wed, 30 Sep 2026 19:55:14 +0800
Subject: [PATCH 4/4] aarch64/h26x: reuse the shared qpel hv window rotation

The eight positions of the eight-row window are the same walk for every
vertical tail, and calc_all already carries it. The wider weighted tails stay
as they are: calc_all2 fixes its window to v16..v31, so handing them over means
moving their accumulators and weight vectors out of that range first.

No functional changes.
---
 libavcodec/aarch64/h26x/qpel_neon.S | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)

diff --git a/libavcodec/aarch64/h26x/qpel_neon.S 
b/libavcodec/aarch64/h26x/qpel_neon.S
index b8f5f17df7..c65e3d750b 100644
--- a/libavcodec/aarch64/h26x/qpel_neon.S
+++ b/libavcodec/aarch64/h26x/qpel_neon.S
@@ -5510,22 +5510,7 @@ DISABLE_I8MM
         add             sp, sp, x10, lsl #1
         ldr             \reg\()22, [sp]
         add             sp, sp, x10
-1:      \step           v23, v16, v17, v18, v19, v20, v21, v22, v23
-        b.eq            2f
-        \step           v16, v17, v18, v19, v20, v21, v22, v23, v16
-        b.eq            2f
-        \step           v17, v18, v19, v20, v21, v22, v23, v16, v17
-        b.eq            2f
-        \step           v18, v19, v20, v21, v22, v23, v16, v17, v18
-        b.eq            2f
-        \step           v19, v20, v21, v22, v23, v16, v17, v18, v19
-        b.eq            2f
-        \step           v20, v21, v22, v23, v16, v17, v18, v19, v20
-        b.eq            2f
-        \step           v21, v22, v23, v16, v17, v18, v19, v20, v21
-        b.eq            2f
-        \step           v22, v23, v16, v17, v18, v19, v20, v21, v22
-        b.hi            1b
+1:      calc_all        \step
 2:
         QPEL_UNI_W_HV_END
         ret
-- 
2.52.0

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

Reply via email to