[PR] avfilter/x86/vf_atadenoise: Minor improvements (PR #24010)

mkver via ffmpeg-devel <[email protected]> Tue, 04 Aug 2026 18:18:20 -0000
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178586750076.59.11148719080219679752@29965ddac10e>
PR #24010 opened by mkver
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24010
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24010.patch


>From 5a1c155dbbbf4278729f3a4e3fe91ecd25e3ae6b Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 16:28:02 +0200
Subject: [PATCH 1/6] avfilter/x86/vf_atadenoise: Reduce number of registers
 used

Saves a push+pop on Win64 and some REX prefixes everywhere.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index ea80e3aa59..a2ff961803 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -151,7 +151,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
     RET
 
 INIT_XMM sse4
-cglobal atadenoise_filter_row8_serial, 6,10,13, src, dst, srcf, w, mid, size, i, j, srcfx, x
+cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i, j, srcfx, x
     movsxdifnidn    wq, wd
     movsxdifnidn  midq, midd
     movsxdifnidn sizeq, sized
@@ -176,7 +176,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,13, src, dst, srcf, w, mid, size, i,
         punpcklbw   m0, m2
         mova        m7, m0
         mova        m8, [pw_one]
-        mova       m12, m10
+        mova       m11, m10
 
         .loop0:
             dec              jq
@@ -189,27 +189,27 @@ cglobal atadenoise_filter_row8_serial, 6,10,13, src, dst, srcf, w, mid, size, i,
             mova             m9, m1
             psubw            m1, m0
             pabsw            m1, m1
-            paddw           m11, m1
+            paddw            m3, m1
             pcmpgtw          m1, m4
-            mova             m6, m11
-            pcmpgtw          m6, m5
+            pcmpgtw          m6, m3, m5
             por              m6, m1
             pxor             m6, m10
-            pand            m12, m6
-            pand             m9, m12
+            pand            m11, m6
+            pand             m9, m11
             paddw            m7, m9
-            mova             m6, m12
+            mova             m6, m11
             psrlw            m6, 15
             paddw            m8, m6
 
-            ptest           m12, m12
+            ptest           m11, m11
             jz .end_loop0
 
             cmp              jq, 0
             jg .loop0
 
         .end_loop0:
-            mova       m12, m10
+            pxor        m3, m3
+            mova       m11, m10
 
         .loop1:
             inc              iq
@@ -228,14 +228,14 @@ cglobal atadenoise_filter_row8_serial, 6,10,13, src, dst, srcf, w, mid, size, i,
             pcmpgtw          m6, m5
             por              m6, m1
             pxor             m6, m10
-            pand            m12, m6
-            pand             m9, m12
+            pand            m11, m6
+            pand             m9, m11
             paddw            m7, m9
-            mova             m6, m12
+            mova             m6, m11
             psrlw            m6, 15
             paddw            m8, m6
 
-            ptest           m12, m12
+            ptest           m11, m11
             jz .finish
 
             cmp              iq, sizeq
-- 
2.52.0


>From 203873b14d0f2bd91e638cf69a57953a824a7329 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 16:34:08 +0200
Subject: [PATCH 2/6] avfilter/x86/vf_atadenoise: Don't load too much data

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index a2ff961803..36a6d9ca83 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -58,7 +58,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
         mov         jq, midq
         pxor        m3, m3
         pxor       m11, m11
-        movu        m0, [srcq + xq]
+        movq        m0, [srcq + xq]
         mova       m12, m10
         punpcklbw   m0, m2
         mova        m7, m0
@@ -71,7 +71,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mov          srcfxq, [srcfq + jq * 8]
             add          srcfxq, wq
 
-            movu             m1, [srcfxq + xq]
+            movq             m1, [srcfxq + xq]
             punpcklbw        m1, m2
             mova             m9, m1
             psubw            m1, m0
@@ -92,7 +92,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mov          srcfxq, [srcfq + iq * 8]
             add          srcfxq, wq
 
-            movu             m1, [srcfxq + xq]
+            movq             m1, [srcfxq + xq]
             punpcklbw        m1, m2
             mova             m9, m1
             psubw            m1, m0
@@ -172,7 +172,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
         mov         jq, midq
         pxor        m3, m3
         pxor       m11, m11
-        movu        m0, [srcq + xq]
+        movq        m0, [srcq + xq]
         punpcklbw   m0, m2
         mova        m7, m0
         mova        m8, [pw_one]
@@ -184,7 +184,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             mov          srcfxq, [srcfq + jq * 8]
             add          srcfxq, wq
 
-            movu             m1, [srcfxq + xq]
+            movq             m1, [srcfxq + xq]
             punpcklbw        m1, m2
             mova             m9, m1
             psubw            m1, m0
@@ -217,7 +217,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             mov          srcfxq, [srcfq + iq * 8]
             add          srcfxq, wq
 
-            movu             m1, [srcfxq + xq]
+            movq             m1, [srcfxq + xq]
             punpcklbw        m1, m2
             mova             m9, m1
             psubw            m1, m0
-- 
2.52.0


>From 96ef2ff05cbde04d834c1631171d955f45398131 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 16:51:29 +0200
Subject: [PATCH 3/6] avfilter/x86/vf_atadenoise: Combine stores

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 38 ++++++++++++-------------------
 1 file changed, 14 insertions(+), 24 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index 36a6d9ca83..bb495c5819 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -126,25 +126,20 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
 
         punpcklwd            m7, m2
         punpcklwd            m8, m2
-        cvtdq2ps             m7, m7
-        cvtdq2ps             m8, m8
-        divps                m7, m8
-        cvttps2dq            m7, m7
-        packssdw             m7, m7
-        packuswb             m7, m7
-
-        movd        [dstq + xq], m7
-
         punpckhwd            m1, m2
         punpckhwd            m6, m2
+        cvtdq2ps             m7, m7
+        cvtdq2ps             m8, m8
         cvtdq2ps             m1, m1
         cvtdq2ps             m6, m6
+        divps                m7, m8
         divps                m1, m6
+        cvttps2dq            m7, m7
         cvttps2dq            m1, m1
-        packssdw             m1, m1
-        packuswb             m1, m1
+        packssdw             m7, m1
+        packuswb             m7, m7
 
-        movd    [dstq + xq + 4], m1
+        movq        [dstq + xq], m7
 
         add                  xq, mmsize/2
     jl .loop
@@ -251,25 +246,20 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
 
         punpcklwd            m7, m2
         punpcklwd            m8, m2
-        cvtdq2ps             m7, m7
-        cvtdq2ps             m8, m8
-        divps                m7, m8
-        cvttps2dq            m7, m7
-        packssdw             m7, m7
-        packuswb             m7, m7
-
-        movd        [dstq + xq], m7
-
         punpckhwd            m1, m2
         punpckhwd            m6, m2
+        cvtdq2ps             m7, m7
+        cvtdq2ps             m8, m8
         cvtdq2ps             m1, m1
         cvtdq2ps             m6, m6
+        divps                m7, m8
         divps                m1, m6
+        cvttps2dq            m7, m7
         cvttps2dq            m1, m1
-        packssdw             m1, m1
-        packuswb             m1, m1
+        packssdw             m7, m1
+        packuswb             m7, m7
 
-        movd    [dstq + xq + 4], m1
+        movq        [dstq + xq], m7
 
         add                  xq, mmsize/2
     jl .loop
-- 
2.52.0


>From 40341cb2d2db58842410dfb191729d1fe9d02ea6 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 18:06:45 +0200
Subject: [PATCH 4/6] avfilter/x86/vf_atadenoise: Avoid negating mask

Possible by using pandn.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index bb495c5819..9726084f31 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -81,11 +81,10 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mova             m6, m11
             pcmpgtw          m6, m5
             por              m6, m1
-            pxor             m6, m10
-            pand            m12, m6
-            pand             m9, m12
+            pandn            m6, m12
+            mova            m12, m6
+            pand             m9, m6
             paddw            m7, m9
-            mova             m6, m12
             psrlw            m6, 15
             paddw            m8, m6
 
@@ -102,11 +101,10 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mova             m6, m3
             pcmpgtw          m6, m5
             por              m6, m1
-            pxor             m6, m10
-            pand            m12, m6
-            pand             m9, m12
+            pandn            m6, m12
+            mova            m12, m6
+            pand             m9, m6
             paddw            m7, m9
-            mova             m6, m12
             psrlw            m6, 15
             paddw            m8, m6
 
@@ -188,11 +186,10 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             pcmpgtw          m1, m4
             pcmpgtw          m6, m3, m5
             por              m6, m1
-            pxor             m6, m10
-            pand            m11, m6
-            pand             m9, m11
+            pandn            m6, m11
+            mova            m11, m6
+            pand             m9, m6
             paddw            m7, m9
-            mova             m6, m11
             psrlw            m6, 15
             paddw            m8, m6
 
@@ -222,11 +219,10 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             mova             m6, m3
             pcmpgtw          m6, m5
             por              m6, m1
-            pxor             m6, m10
-            pand            m11, m6
-            pand             m9, m11
+            pandn            m6, m11
+            mova            m11, m6
+            pand             m9, m6
             paddw            m7, m9
-            mova             m6, m11
             psrlw            m6, 15
             paddw            m8, m6
 
-- 
2.52.0


>From 3af89bb60e19178b7ca336a3f221ba88f4946971 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 18:12:12 +0200
Subject: [PATCH 5/6] avfilter/x86/vf_atadenoise: Avoid shifting unnecessarily

For a word mask register (where all the values are either
0x0 or 0xFFFF) a right logical shift by 15 is equivalent
to negating, so instead of negating the mask and then adding
it to another register one can simply subtract the mask from
the other register.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index 9726084f31..c1217d38ce 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -85,8 +85,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mova            m12, m6
             pand             m9, m6
             paddw            m7, m9
-            psrlw            m6, 15
-            paddw            m8, m6
+            psubw            m8, m6
 
             mov          srcfxq, [srcfq + iq * 8]
             add          srcfxq, wq
@@ -105,8 +104,7 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             mova            m12, m6
             pand             m9, m6
             paddw            m7, m9
-            psrlw            m6, 15
-            paddw            m8, m6
+            psubw            m8, m6
 
             ptest           m12, m12
             jz .finish
@@ -190,8 +188,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             mova            m11, m6
             pand             m9, m6
             paddw            m7, m9
-            psrlw            m6, 15
-            paddw            m8, m6
+            psubw            m8, m6
 
             ptest           m11, m11
             jz .end_loop0
@@ -223,8 +220,7 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             mova            m11, m6
             pand             m9, m6
             paddw            m7, m9
-            psrlw            m6, 15
-            paddw            m8, m6
+            psubw            m8, m6
 
             ptest           m11, m11
             jz .finish
-- 
2.52.0


>From bb2f39b788b32b8d352abe0213277220c6f54d43 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Tue, 4 Aug 2026 18:21:11 +0200
Subject: [PATCH 6/6] avfilter/x86/vf_atadenoise: Test earlier

ptest has quite a bit of latency, so it should be scheduled earlier.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavfilter/x86/vf_atadenoise.asm | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
index c1217d38ce..33e5417f4d 100644
--- a/libavfilter/x86/vf_atadenoise.asm
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -101,12 +101,12 @@ cglobal atadenoise_filter_row8, 6,10,13, src, dst, srcf, w, mid, size, i, j, src
             pcmpgtw          m6, m5
             por              m6, m1
             pandn            m6, m12
+            ptest            m6, m6
             mova            m12, m6
             pand             m9, m6
             paddw            m7, m9
             psubw            m8, m6
 
-            ptest           m12, m12
             jz .finish
 
             cmp              iq, sizeq
@@ -185,12 +185,12 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             pcmpgtw          m6, m3, m5
             por              m6, m1
             pandn            m6, m11
+            ptest            m6, m6
             mova            m11, m6
             pand             m9, m6
             paddw            m7, m9
             psubw            m8, m6
 
-            ptest           m11, m11
             jz .end_loop0
 
             cmp              jq, 0
@@ -217,12 +217,12 @@ cglobal atadenoise_filter_row8_serial, 6,10,12, src, dst, srcf, w, mid, size, i,
             pcmpgtw          m6, m5
             por              m6, m1
             pandn            m6, m11
+            ptest            m6, m6
             mova            m11, m6
             pand             m9, m6
             paddw            m7, m9
             psubw            m8, m6
 
-            ptest           m11, m11
             jz .finish
 
             cmp              iq, sizeq
-- 
2.52.0

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