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

Git pushed a commit to branch master
in repository ffmpeg.

commit 2e3bc3ebb268666146e4a902a3afe8e8dbd802ad
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Sun Jul 5 10:07:02 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Sun Jul 12 23:46:56 2026 +0200

    avcodec/x86/vp9lpf: Combine comparisons
    
    The VP9 loop filter involves comparing several unsigned
    values against the same value and combines the results:
    a <= I && b <= I && ...
    This is equivalent to max(a,b,...) <= I and using this
    form is beneficial: Each comparison needs one pxor*
    and one pcmpgtb and every comparison except the first
    uses one por to combine the result. Switching to max
    instead results in one comparison and (operands - 1)
    pmaxub to create the maximum; the latter can be relaxed
    to por if the final comparator is one**, as it is for
    flat8{in,out}.
    
    Doing so saves 4113B of .text here and is beneficial
    for performance:
    
    Old benchmarks:
      vp9_loop_filter_h_4_8_8bpp_c:                78.0
      vp9_loop_filter_h_4_8_8bpp_mmxext:           74.2 ( 1.05x)
      vp9_loop_filter_h_8_8_8bpp_c:                85.0
      vp9_loop_filter_h_8_8_8bpp_mmxext:          101.9 ( 0.83x)
      vp9_loop_filter_h_16_8_8bpp_c:              140.3
      vp9_loop_filter_h_16_16_8bpp_c:             250.7
      vp9_loop_filter_h_16_16_8bpp_sse2:          176.1 ( 1.39x)
      vp9_loop_filter_h_16_16_8bpp_ssse3:         172.9 ( 1.38x)
      vp9_loop_filter_h_16_16_8bpp_avx:           165.5 ( 1.46x)
      vp9_loop_filter_mix2_h_44_16_8bpp_c:        167.5
      vp9_loop_filter_mix2_h_44_16_8bpp_sse2:      70.5 ( 2.32x)
      vp9_loop_filter_mix2_h_44_16_8bpp_ssse3:     69.7 ( 2.40x)
      vp9_loop_filter_mix2_h_44_16_8bpp_avx:       70.3 ( 2.38x)
      vp9_loop_filter_mix2_h_48_16_8bpp_c:        175.5
      vp9_loop_filter_mix2_h_48_16_8bpp_sse2:      93.3 ( 1.87x)
      vp9_loop_filter_mix2_h_48_16_8bpp_ssse3:     93.3 ( 1.87x)
      vp9_loop_filter_mix2_h_48_16_8bpp_avx:       90.1 ( 1.95x)
      vp9_loop_filter_mix2_h_84_16_8bpp_c:        177.1
      vp9_loop_filter_mix2_h_84_16_8bpp_sse2:      94.3 ( 1.82x)
      vp9_loop_filter_mix2_h_84_16_8bpp_ssse3:     90.6 ( 1.92x)
      vp9_loop_filter_mix2_h_84_16_8bpp_avx:       88.8 ( 1.99x)
      vp9_loop_filter_mix2_h_88_16_8bpp_c:        186.4
      vp9_loop_filter_mix2_h_88_16_8bpp_sse2:      94.7 ( 1.95x)
      vp9_loop_filter_mix2_h_88_16_8bpp_ssse3:     93.7 ( 1.98x)
      vp9_loop_filter_mix2_h_88_16_8bpp_avx:       89.7 ( 2.07x)
      vp9_loop_filter_mix2_v_44_16_8bpp_c:        176.0
      vp9_loop_filter_mix2_v_44_16_8bpp_sse2:      29.7 ( 5.92x)
      vp9_loop_filter_mix2_v_44_16_8bpp_ssse3:     29.3 ( 6.02x)
      vp9_loop_filter_mix2_v_44_16_8bpp_avx:       30.5 ( 5.76x)
      vp9_loop_filter_mix2_v_48_16_8bpp_c:        187.7
      vp9_loop_filter_mix2_v_48_16_8bpp_sse2:      65.1 ( 2.82x)
      vp9_loop_filter_mix2_v_48_16_8bpp_ssse3:     65.2 ( 2.84x)
      vp9_loop_filter_mix2_v_48_16_8bpp_avx:       56.0 ( 3.35x)
      vp9_loop_filter_mix2_v_84_16_8bpp_c:        188.3
      vp9_loop_filter_mix2_v_84_16_8bpp_sse2:      60.7 ( 3.03x)
      vp9_loop_filter_mix2_v_84_16_8bpp_ssse3:     64.8 ( 2.80x)
      vp9_loop_filter_mix2_v_84_16_8bpp_avx:       56.8 ( 3.21x)
      vp9_loop_filter_mix2_v_88_16_8bpp_c:        199.4
      vp9_loop_filter_mix2_v_88_16_8bpp_sse2:      65.8 ( 3.01x)
      vp9_loop_filter_mix2_v_88_16_8bpp_ssse3:     57.6 ( 3.46x)
      vp9_loop_filter_mix2_v_88_16_8bpp_avx:       56.3 ( 3.53x)
      vp9_loop_filter_v_4_8_8bpp_c:                82.8
      vp9_loop_filter_v_4_8_8bpp_mmxext:           32.4 ( 2.50x)
      vp9_loop_filter_v_8_8_8bpp_c:                91.9
      vp9_loop_filter_v_8_8_8bpp_mmxext:           65.6 ( 1.40x)
      vp9_loop_filter_v_16_8_8bpp_c:              156.2
      vp9_loop_filter_v_16_16_8bpp_c:             291.3
      vp9_loop_filter_v_16_16_8bpp_sse2:          125.7 ( 2.25x)
      vp9_loop_filter_v_16_16_8bpp_ssse3:         123.1 ( 2.31x)
      vp9_loop_filter_v_16_16_8bpp_avx:           115.3 ( 2.51x)
    
    New benchmarks:
      vp9_loop_filter_h_4_8_8bpp_c:                78.8
      vp9_loop_filter_h_4_8_8bpp_mmxext:           62.4 ( 1.26x)
      vp9_loop_filter_h_8_8_8bpp_c:                85.8
      vp9_loop_filter_h_8_8_8bpp_mmxext:           86.5 ( 0.97x)
      vp9_loop_filter_h_16_8_8bpp_c:              139.3
      vp9_loop_filter_h_16_16_8bpp_c:             251.3
      vp9_loop_filter_h_16_16_8bpp_sse2:          164.7 ( 1.45x)
      vp9_loop_filter_h_16_16_8bpp_ssse3:         164.2 ( 1.49x)
      vp9_loop_filter_h_16_16_8bpp_avx:           155.2 ( 1.56x)
      vp9_loop_filter_mix2_h_44_16_8bpp_c:        168.3
      vp9_loop_filter_mix2_h_44_16_8bpp_sse2:      60.1 ( 2.80x)
      vp9_loop_filter_mix2_h_44_16_8bpp_ssse3:     60.1 ( 2.80x)
      vp9_loop_filter_mix2_h_44_16_8bpp_avx:       60.4 ( 2.79x)
      vp9_loop_filter_mix2_h_48_16_8bpp_c:        178.1
      vp9_loop_filter_mix2_h_48_16_8bpp_sse2:      83.5 ( 2.07x)
      vp9_loop_filter_mix2_h_48_16_8bpp_ssse3:     84.0 ( 2.02x)
      vp9_loop_filter_mix2_h_48_16_8bpp_avx:       78.0 ( 2.28x)
      vp9_loop_filter_mix2_h_84_16_8bpp_c:        181.7
      vp9_loop_filter_mix2_h_84_16_8bpp_sse2:      78.3 ( 2.20x)
      vp9_loop_filter_mix2_h_84_16_8bpp_ssse3:     85.1 ( 2.12x)
      vp9_loop_filter_mix2_h_84_16_8bpp_avx:       79.8 ( 2.27x)
      vp9_loop_filter_mix2_h_88_16_8bpp_c:        184.8
      vp9_loop_filter_mix2_h_88_16_8bpp_sse2:      85.6 ( 2.14x)
      vp9_loop_filter_mix2_h_88_16_8bpp_ssse3:     85.1 ( 2.09x)
      vp9_loop_filter_mix2_h_88_16_8bpp_avx:       77.6 ( 2.38x)
      vp9_loop_filter_mix2_v_44_16_8bpp_c:        176.0
      vp9_loop_filter_mix2_v_44_16_8bpp_sse2:      28.1 ( 6.27x)
      vp9_loop_filter_mix2_v_44_16_8bpp_ssse3:     32.3 ( 5.42x)
      vp9_loop_filter_mix2_v_44_16_8bpp_avx:       27.4 ( 6.43x)
      vp9_loop_filter_mix2_v_48_16_8bpp_c:        187.4
      vp9_loop_filter_mix2_v_48_16_8bpp_sse2:      55.3 ( 3.39x)
      vp9_loop_filter_mix2_v_48_16_8bpp_ssse3:     54.7 ( 3.42x)
      vp9_loop_filter_mix2_v_48_16_8bpp_avx:       53.7 ( 3.48x)
      vp9_loop_filter_mix2_v_84_16_8bpp_c:        189.6
      vp9_loop_filter_mix2_v_84_16_8bpp_sse2:      62.5 ( 3.00x)
      vp9_loop_filter_mix2_v_84_16_8bpp_ssse3:     61.3 ( 3.07x)
      vp9_loop_filter_mix2_v_84_16_8bpp_avx:       54.3 ( 3.47x)
      vp9_loop_filter_mix2_v_88_16_8bpp_c:        199.5
      vp9_loop_filter_mix2_v_88_16_8bpp_sse2:      55.1 ( 3.52x)
      vp9_loop_filter_mix2_v_88_16_8bpp_ssse3:     54.4 ( 3.66x)
      vp9_loop_filter_mix2_v_88_16_8bpp_avx:       53.0 ( 3.69x)
      vp9_loop_filter_v_4_8_8bpp_c:                84.3
      vp9_loop_filter_v_4_8_8bpp_mmxext:           32.0 ( 2.62x)
      vp9_loop_filter_v_8_8_8bpp_c:                94.3
      vp9_loop_filter_v_8_8_8bpp_mmxext:           63.7 ( 1.48x)
      vp9_loop_filter_v_16_8_8bpp_c:              155.8
      vp9_loop_filter_v_16_16_8bpp_c:             292.0
      vp9_loop_filter_v_16_16_8bpp_sse2:          119.5 ( 2.39x)
      vp9_loop_filter_v_16_16_8bpp_ssse3:         119.1 ( 2.39x)
      vp9_loop_filter_v_16_16_8bpp_avx:           111.0 ( 2.61x)
    
    *: to shift unsigned values to signed ones for pcmpgtb
    **: or any comparison like <= 2^n-1
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/vp9lpf.asm | 101 ++++++++++++++++++++--------------------------
 1 file changed, 43 insertions(+), 58 deletions(-)

diff --git a/libavcodec/x86/vp9lpf.asm b/libavcodec/x86/vp9lpf.asm
index 92e5d03ad7..8509b61ebc 100644
--- a/libavcodec/x86/vp9lpf.asm
+++ b/libavcodec/x86/vp9lpf.asm
@@ -89,12 +89,6 @@ SECTION .text
     pcmpgtb             %1, %2
 %endmacro
 
-; %1 = abs(%2-%3) > %4
-%macro ABSSUB_GT 5-6 [pb_80]; dst, src1, src2, cmp, tmp, [pb_80]
-    ABSSUB              %1, %2, %3, %5      ; dst = abs(src1-src2)
-    CMP_GT              %1, %4, %6          ; dst > cmp
-%endmacro
-
 %macro MASK_APPLY 4 ; %1=new_data/dst %2=old_data %3=mask %4=tmp
     pand                %1, %3              ; new &= mask
     pandn               %4, %3, %2          ; tmp = ~mask & old
@@ -618,17 +612,18 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
 %define rq2 [Q2]
 %define rq3 [Q3]
 %endif
-    ABSSUB_GT           m5, rp3, rp2, m2, m7, m0        ; m5 = abs(p3-p2) <= I
-    ABSSUB_GT           m1, rp2, rp1, m2, m7, m0        ; m1 = abs(p2-p1) <= I
-    por                 m5, m1
-    ABSSUB_GT           m1, rp1, rp0, m2, m7, m0        ; m1 = abs(p1-p0) <= I
-    por                 m5, m1
-    ABSSUB_GT           m1, rq0, rq1, m2, m7, m0        ; m1 = abs(q1-q0) <= I
-    por                 m5, m1
-    ABSSUB_GT           m1, rq1, rq2, m2, m7, m0        ; m1 = abs(q2-q1) <= I
-    por                 m5, m1
-    ABSSUB_GT           m1, rq2, rq3, m2, m7, m0        ; m1 = abs(q3-q2) <= I
-    por                 m5, m1
+    ABSSUB              m5, rp3, rp2, m7                ; m5 = abs(p3-p2)
+    ABSSUB              m1, rp2, rp1, m7                ; m1 = abs(p2-p1)
+    pmaxub              m5, m1
+    ABSSUB              m1, rp1, rp0, m7                ; m1 = abs(p1-p0)
+    pmaxub              m5, m1
+    ABSSUB              m1, rq0, rq1, m7                ; m1 = abs(q1-q0)
+    pmaxub              m5, m1
+    ABSSUB              m1, rq1, rq2, m7                ; m1 = abs(q2-q1)
+    pmaxub              m5, m1
+    ABSSUB              m1, rq2, rq3, m7                ; m1 = abs(q3-q2)
+    pmaxub              m5, m1
+    CMP_GT              m5, m2, m0
     ABSSUB              m1, rp0, rq0, m7                ; abs(p0-q0)
     paddusb             m1, m1                          ; abs(p0-q0) * 2
     ABSSUB              m2, rp1, rq1, m7                ; abs(p1-q1)
@@ -641,44 +636,35 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
     SWAP                 1, 3
     pxor                m3, [pb_ff]
 
-    ; (m3: fm, m8..15: p3 p2 p1 p0 q0 q1 q2 q3)
+    ; (m0: pb_80, m3: fm, m8..15: p3 p2 p1 p0 q0 q1 q2 q3)
     ; calc flat8in (if not 44_16) and hev masks
 %if %2 != 44 && %2 != 4
     mova                m6, [pb_81]                     ; [1 1 1 1 ...] ^ 0x80
-    ABSSUB_GT           m2, rp3, rp0, m6, m5            ; abs(p3 - p0) <= 1
-%ifdef m8
-    mova                m8, [pb_80]
-%define rb80 m8
-%else
-%define rb80 [pb_80]
-%endif
-    ABSSUB_GT           m1, rp2, rp0, m6, m5, rb80      ; abs(p2 - p0) <= 1
-    por                 m2, m1
-    ABSSUB              m4, rp1, rp0, m5                ; abs(p1 - p0)
+    ABSSUB              m2, rp1, rp0, m5                ; abs(p1 - p0)
 %if %2 <= 16
 %if cpuflag(ssse3)
-    pxor                m0, m0
+    pxor                m5, m5
 %endif
-    SPLATB_REG          m7, H, m0                       ; H H H H ...
+    SPLATB_REG          m7, H, m5                       ; H H H H ...
 %else
     movd                m7, Hd
     SPLATB_MIX          m7
 %endif
-    pxor                m7, rb80
-    pxor                m4, rb80
-    pcmpgtb             m0, m4, m7                      ; abs(p1 - p0) > H 
(1/2 hev condition)
-    CMP_GT              m4, m6                          ; abs(p1 - p0) <= 1
-    por                 m2, m4                          ; (flat8in)
-    ABSSUB              m4, rq1, rq0, m1                ; abs(q1 - q0)
-    pxor                m4, rb80
-    pcmpgtb             m5, m4, m7                      ; abs(q1 - q0) > H 
(2/2 hev condition)
-    por                 m0, m5                          ; hev final value
-    CMP_GT              m4, m6                          ; abs(q1 - q0) <= 1
-    por                 m2, m4                          ; (flat8in)
-    ABSSUB_GT           m1, rq2, rq0, m6, m5, rb80      ; abs(q2 - q0) <= 1
+    ABSSUB              m4, rq1, rq0, m5                ; abs(q1 - q0)
+    pmaxub              m4, m2                          ; max(abs(q1 - q0), 
abs(p1 - p0))
+    ABSSUB              m2, rp2, rp0, m5                ; abs(p2 - 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
-    ABSSUB_GT           m1, rq3, rq0, m6, m5, rb80      ; abs(q3 - q0) <= 1
-    por                 m2, m1                          ; flat8in final value
+    CMP_GT              m2, m6, m0                      ; flat8in
+    SWAP                0, 4
     pxor                m2, [pb_ff]
 %if %2 == 84 || %2 == 48
     pand                m2, [mask_mix%2]
@@ -695,13 +681,11 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
     SPLATB_REG          m7, H, m0                       ; H H H H ...
 %endif
     pxor                m7, m6
-    ABSSUB              m4, rp1, rp0, m1                ; abs(p1 - p0)
-    pxor                m4, m6
-    pcmpgtb             m0, m4, m7                      ; abs(p1 - p0) > H 
(1/2 hev condition)
+    ABSSUB              m0, rp1, rp0, m1                ; abs(p1 - p0)
     ABSSUB              m4, rq1, rq0, m1                ; abs(q1 - q0)
-    pxor                m4, m6
-    pcmpgtb             m5, m4, m7                      ; abs(q1 - q0) > H 
(2/2 hev condition)
-    por                 m0, m5                          ; hev final value
+    pmaxub              m0, m4                          ; max(abs(p1 - p0), 
abs(q1 - q0))
+    pxor                m0, m6
+    pcmpgtb             m0, m7                          ; max > H; hev final 
value
 %endif
 
 %if %2 == 16
@@ -716,8 +700,8 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + %4 
+ %%ext, dst, stride
 %define rp7 [P7]
 %define rp6 [P6]
 %endif
-    ABSSUB_GT           m1, rp7, rp0, m6, m5            ; abs(p7 - p0) <= 1
-    ABSSUB_GT           m7, rp6, rp0, m6, m5            ; abs(p6 - p0) <= 1
+    ABSSUB              m7, rp7, rp0, m5                ; abs(p7 - p0)
+    ABSSUB              m1, rp6, rp0, m5                ; abs(p6 - p0)
     por                 m1, m7
 %ifdef m8
     mova                m8, [P5]
@@ -728,9 +712,9 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + %4 
+ %%ext, dst, stride
 %define rp5 [P5]
 %define rp4 [P4]
 %endif
-    ABSSUB_GT           m7, rp5, rp0, m6, m5            ; abs(p5 - p0) <= 1
+    ABSSUB              m7, rp5, rp0, m5                ; abs(p5 - p0)
     por                 m1, m7
-    ABSSUB_GT           m7, rp4, rp0, m6, m5            ; abs(p4 - p0) <= 1
+    ABSSUB              m7, rp4, rp0, m5                ; abs(p4 - p0)
     por                 m1, m7
 %ifdef m8
     mova                m14, [Q4]
@@ -741,9 +725,9 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + %4 
+ %%ext, dst, stride
 %define rq4 [Q4]
 %define rq5 [Q5]
 %endif
-    ABSSUB_GT           m7, rq4, rq0, m6, m5            ; abs(q4 - q0) <= 1
+    ABSSUB              m7, rq4, rq0, m5                ; abs(q4 - q0)
     por                 m1, m7
-    ABSSUB_GT           m7, rq5, rq0, m6, m5            ; abs(q5 - q0) <= 1
+    ABSSUB              m7, rq5, rq0, m5                ; abs(q5 - q0)
     por                 m1, m7
 %ifdef m8
     mova                m14, [Q6]
@@ -754,10 +738,11 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
 %define rq6 [Q6]
 %define rq7 [Q7]
 %endif
-    ABSSUB_GT           m7, rq6, rq0, m6, m5            ; abs(q4 - q0) <= 1
+    ABSSUB              m7, rq6, rq0, m5                ; abs(q4 - q0)
     por                 m1, m7
-    ABSSUB_GT           m7, rq7, rq0, m6, m5            ; abs(q5 - q0) <= 1
+    ABSSUB              m7, rq7, rq0, m5                ; abs(q5 - q0)
     por                 m1, m7                          ; flat8out final value
+    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