This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit fee9a4fedfc0d89b6213d7b8f1c12efaf7fbaa43
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Wed Jul 8 19:20:04 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Sun Jul 12 23:46:56 2026 +0200

    avcodec/x86/vp9lpf: Improve deriving masks
    
    Deriving the fm, flat8in and flat8out masks involves
    calculating max{abs(a_i-a), 1<=i<=N} (with N being two or four).
    The current code does this by calculating the abs individually
    (two psubusb and a por), followed by combining the results
    (another por or pmaxub). But there is a better way:
    Calculate the min m and max M of the a_i. Then the result equals
    max{(M-a)^+,(a-m)^+}, which can be calculated with two
    psubusb, followed by combining the result. E.g. for N=2
    this saves two por and exchanges two psubusb with pmaxub/pminub.
    
    Doing so saves 2062B of .text here; performance is basically
    flat (the length of the critical section is unchanged).
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/vp9lpf.asm | 148 +++++++++++++++++++++++++++-------------------
 1 file changed, 86 insertions(+), 62 deletions(-)

diff --git a/libavcodec/x86/vp9lpf.asm b/libavcodec/x86/vp9lpf.asm
index 8ccba1f09b..7447992ea9 100644
--- a/libavcodec/x86/vp9lpf.asm
+++ b/libavcodec/x86/vp9lpf.asm
@@ -81,6 +81,73 @@ SECTION .text
     por                 %1, %4
 %endmacro
 
+%macro MINMAX 3-5 ; maxdst, mindst, src, scratch reg, [initial value]
+%if %0 == 5
+    %ifnum sizeof%5 ; register
+        %define %%srcmax %5
+        %define %%srcmin %5
+    %else
+        mova            %2, %5
+        %define %%srcmax %2
+        %define %%srcmin %2
+    %endif
+%else
+    %define %%srcmax %1
+    %define %%srcmin %2
+%endif
+
+%ifnum sizeof%3  ; src is register
+    %define %%src %3
+%else            ; src is memory
+    %ifnidn %4, ""
+        %define %%src %4
+        mova            %4, %3
+    %else
+        %define %%src %3
+    %endif
+%endif
+
+    pmaxub              %1, %%srcmax, %%src
+    pminub              %2, %%srcmin, %%src
+%endmacro
+
+%macro ABSDIFF_MAX 5-6 ; max [dst], min, common subtrahend, combine op, 
scratch reg, [dst]
+%ifidn %5, ""
+    ; no spare reg; must have separate dst reg
+    %define %%sub
+    psubusb             %1, %3
+    %4                  %6, %1
+    mova                %1, %3
+    psubusb             %1, %2
+    %4                  %6, %1
+%else
+%ifnum sizeof%3
+    psubusb             %1, %3
+    %define %%sub %3
+%else
+    mova                %5, %3
+    psubusb             %1, %5
+    %define %%sub %5
+%endif
+%if avx_enabled
+    %define %%min       %2
+    psubusb             %2, %%sub, %2
+%else
+    %define %%min       %5
+    %ifnidn %%sub, %5
+        mova            %5, %%sub
+    %endif
+    psubusb             %5, %2
+%endif
+%if %0 == 6
+    %4                  %6, %1
+    %4                  %6, %%min
+%else
+    %4                  %1, %%min
+%endif
+%endif
+%endmacro
+
 ; %1 = %1>%2
 %macro CMP_GT 2-3 ; src/dst, cmp, pb_80
 %if %0 == 3
@@ -612,17 +679,14 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
 %define rq2 [Q2]
 %define rq3 [Q3]
 %endif
-    ABSSUB              m5, rp3, rp2, m7                ; m5 = abs(p3-p2)
-    ABSSUB              m1, rp2, rp1, m7                ; m1 = abs(p2-p1)
-    pmaxub              m5, m1
+    MINMAX              m5, m1, rp1, m6, rp3            ; max(p1,p3), 
min(p1,p3)
+    ABSDIFF_MAX         m5, m1, rp2, pmaxub, m6         ; 
max(abs(p3-p2),abs(p2-p1))
     ABSSUB              m1, rp1, rp0, m7                ; m1 = abs(p1-p0)
     ABSSUB              m4, rq0, rq1, m7                ; m1 = abs(q1-q0)
     pmaxub              m4, m1
+    MINMAX              m1, m6, rq3, m7, rq1            ; max(q1,q3), 
min(q1,q3)
     pmaxub              m5, m4
-    ABSSUB              m1, rq1, rq2, m7                ; m1 = abs(q2-q1)
-    pmaxub              m5, m1
-    ABSSUB              m1, rq2, rq3, m7                ; m1 = abs(q3-q2)
-    pmaxub              m5, m1
+    ABSDIFF_MAX         m1, m6, rq2, pmaxub, m7, m5
     CMP_GT              m5, m2, m0
     ABSSUB              m1, rp0, rq0, m7                ; abs(p0-q0)
     paddusb             m1, m1                          ; abs(p0-q0) * 2
@@ -640,6 +704,7 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + %4 
+ %%ext, dst, stride
     ;  m8..15: p3 p2 p1 p0 q0 q1 q2 q3)
     ; calc flat8in (if not 44_16) and hev masks
 %if %2 != 44 && %2 != 4
+    MINMAX              m2, m1, rp2, m5, rp3            ; max(p2,p3), 
min(p2,p3)
     mova                m6, [pb_81]                     ; [1 1 1 1 ...] ^ 0x80
 %if %2 <= 16
 %if cpuflag(ssse3)
@@ -650,17 +715,14 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
     movd                m7, Hd
     SPLATB_MIX          m7
 %endif
-    ABSSUB              m2, rp2, rp0, m5                ; abs(p2 - p0)
+    ABSDIFF_MAX         m2, m1, rp0, por, m5            ; 
max(abs(p2-p0),abs(p3-p0))
     pxor                m7, m0
     por                 m2, m4
     pxor                m4, m0
     pcmpgtb             m4, m7                          ; hev: max(abs(q1 - 
q0), abs(p1 - p0)) > H
-    ABSSUB              m1, rp3, rp0, m5                ; abs(p3 - p0)
-    por                 m2, m1
-    ABSSUB              m1, rq2, rq0, m5                ; abs(q2 - q0)
-    por                 m2, m1
-    ABSSUB              m1, rq3, rq0, m5                ; abs(q3 - q0)
-    por                 m2, m1
+
+    MINMAX              m7, m1, rq3, m5, rq2            ; max(q2,q3), 
min(q2,q3)
+    ABSDIFF_MAX         m7, m1, rq0, por, m5, m2
     CMP_GT              m2, m6, m0                      ; flat8in
     pxor                m2, [pb_ff]
 %if %2 == 84 || %2 == 48
@@ -686,57 +748,19 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
 %if %2 == 16
     ; (m0: hev, m2: flat8in, m3: fm, m6: pb_81, m9..15: p2 p1 p0 q0 q1 q2 q3)
     ; calc flat8out mask
+    MINMAX              m1, m7, [P6], m5, [P7]           ; max(p6, p7), 
min(p6,p7)
+    MINMAX              m1, m7, [P5], m5                 ; max(p5,p6,p7), 
min(p5,p6,p7)
+    MINMAX              m1, m7, [P4], m5                 ; max(p4...p7), 
min(p4...p7)
+    ABSDIFF_MAX         m1, m7, rp0, por, m5
 %ifdef m8
-    mova                m8, [P7]
-    mova                m9, [P6]
-%define rp7 m8
-%define rp6 m9
+    %define M8 m8
 %else
-%define rp7 [P7]
-%define rp6 [P6]
-%endif
-    ABSSUB              m7, rp7, rp0, m5                ; abs(p7 - p0)
-    ABSSUB              m1, rp6, rp0, m5                ; abs(p6 - p0)
-    por                 m1, m7
-%ifdef m8
-    mova                m8, [P5]
-    mova                m9, [P4]
-%define rp5 m8
-%define rp4 m9
-%else
-%define rp5 [P5]
-%define rp4 [P4]
-%endif
-    ABSSUB              m7, rp5, rp0, m5                ; abs(p5 - p0)
-    por                 m1, m7
-    ABSSUB              m7, rp4, rp0, m5                ; abs(p4 - p0)
-    por                 m1, m7
-%ifdef m8
-    mova                m14, [Q4]
-    mova                m15, [Q5]
-%define rq4 m14
-%define rq5 m15
-%else
-%define rq4 [Q4]
-%define rq5 [Q5]
-%endif
-    ABSSUB              m7, rq4, rq0, m5                ; abs(q4 - q0)
-    por                 m1, m7
-    ABSSUB              m7, rq5, rq0, m5                ; abs(q5 - q0)
-    por                 m1, m7
-%ifdef m8
-    mova                m14, [Q6]
-    mova                m15, [Q7]
-%define rq6 m14
-%define rq7 m15
-%else
-%define rq6 [Q6]
-%define rq7 [Q7]
+    %define M8 ""
 %endif
-    ABSSUB              m7, rq6, rq0, m5                ; abs(q4 - q0)
-    por                 m1, m7
-    ABSSUB              m7, rq7, rq0, m5                ; abs(q5 - q0)
-    por                 m1, m7                          ; flat8out final value
+    MINMAX              m5, m7, [Q5], M8, [Q4]           ; max(q4,q5), 
min(q4,q5)
+    MINMAX              m5, m7, [Q6], M8                 ; max(q4,q5,q6), 
min(q4,q5,q6)
+    MINMAX              m5, m7, [Q7], M8                 ; max(q4...q7), 
min(q4...q7)
+    ABSDIFF_MAX         m5, m7, rq0, por, M8, m1
     CMP_GT              m1, m6, [pb_80]
     pxor                m1, [pb_ff]
 %endif

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

Reply via email to