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

Git pushed a commit to branch master
in repository ffmpeg.

commit a619985145c69906707a8040327d0e80dc6aa8ae
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Thu Jul 9 18:30:49 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Sun Jul 12 23:46:56 2026 +0200

    avcodec/x86/vp9lpf: Combine filter2 and filter4 cases
    
    There are two differences between the filter2 and filter4 case.
    The first one is
    
    if (hev) {
        int f = av_clip_intp2(p1 - q1, BIT_DEPTH - 1);
        f = av_clip_intp2(3 * (q0 - p0) + f, BIT_DEPTH - 1);
    ...
    } else {
        int f = av_clip_intp2(3 * (q0 - p0), BIT_DEPTH - 1);
    ...
    
    which can simply be combined to
    
    int f = hev ? av_clip_intp2(p1 - q1, BIT_DEPTH - 1) : 0;
    f = av_clip_intp2(3 * (q0 - p0) + f, BIT_DEPTH - 1);
    
    which boils down to masking f by hev after the first
    av_clip_intp2().
    
    The second is that two more rows are processed for filter4(),
    but one can simply mask the differential there, too.
    
    So one can just combine both filters into one; doing so saves
    8457B of .text here and improves performance.
    
    Old benchmarks:
      vp9_loop_filter_h_4_8_8bpp_c:                77.3
      vp9_loop_filter_h_4_8_8bpp_mmxext:           60.8 ( 1.27x)
      vp9_loop_filter_h_8_8_8bpp_c:                86.3
      vp9_loop_filter_h_8_8_8bpp_mmxext:           82.9 ( 1.04x)
      vp9_loop_filter_h_16_8_8bpp_c:              139.7
      vp9_loop_filter_h_16_16_8bpp_c:             251.9
      vp9_loop_filter_h_16_16_8bpp_sse2:          164.8 ( 1.44x)
      vp9_loop_filter_h_16_16_8bpp_ssse3:         164.4 ( 1.49x)
      vp9_loop_filter_h_16_16_8bpp_avx:           155.1 ( 1.59x)
      vp9_loop_filter_mix2_h_44_16_8bpp_c:        169.2
      vp9_loop_filter_mix2_h_44_16_8bpp_sse2:      58.0 ( 2.91x)
      vp9_loop_filter_mix2_h_44_16_8bpp_ssse3:     56.6 ( 2.99x)
      vp9_loop_filter_mix2_h_44_16_8bpp_avx:       57.1 ( 2.96x)
      vp9_loop_filter_mix2_h_48_16_8bpp_c:        174.9
      vp9_loop_filter_mix2_h_48_16_8bpp_sse2:      75.4 ( 2.32x)
      vp9_loop_filter_mix2_h_48_16_8bpp_ssse3:     80.6 ( 2.16x)
      vp9_loop_filter_mix2_h_48_16_8bpp_avx:       75.1 ( 2.28x)
      vp9_loop_filter_mix2_h_84_16_8bpp_c:        179.7
      vp9_loop_filter_mix2_h_84_16_8bpp_sse2:      79.5 ( 2.25x)
      vp9_loop_filter_mix2_h_84_16_8bpp_ssse3:     78.2 ( 2.28x)
      vp9_loop_filter_mix2_h_84_16_8bpp_avx:       76.1 ( 2.32x)
      vp9_loop_filter_mix2_h_88_16_8bpp_c:        184.5
      vp9_loop_filter_mix2_h_88_16_8bpp_sse2:      82.5 ( 2.23x)
      vp9_loop_filter_mix2_h_88_16_8bpp_ssse3:     78.7 ( 2.34x)
      vp9_loop_filter_mix2_h_88_16_8bpp_avx:       74.4 ( 2.48x)
      vp9_loop_filter_mix2_v_44_16_8bpp_c:        176.0
      vp9_loop_filter_mix2_v_44_16_8bpp_sse2:      28.4 ( 6.18x)
      vp9_loop_filter_mix2_v_44_16_8bpp_ssse3:     26.3 ( 6.69x)
      vp9_loop_filter_mix2_v_44_16_8bpp_avx:       26.2 ( 6.72x)
      vp9_loop_filter_mix2_v_48_16_8bpp_c:        188.7
      vp9_loop_filter_mix2_v_48_16_8bpp_sse2:      60.4 ( 3.11x)
      vp9_loop_filter_mix2_v_48_16_8bpp_ssse3:     53.6 ( 3.50x)
      vp9_loop_filter_mix2_v_48_16_8bpp_avx:       51.2 ( 3.64x)
      vp9_loop_filter_mix2_v_84_16_8bpp_c:        191.7
      vp9_loop_filter_mix2_v_84_16_8bpp_sse2:      55.2 ( 3.40x)
      vp9_loop_filter_mix2_v_84_16_8bpp_ssse3:     51.6 ( 3.71x)
      vp9_loop_filter_mix2_v_84_16_8bpp_avx:       50.8 ( 3.77x)
      vp9_loop_filter_mix2_v_88_16_8bpp_c:        201.1
      vp9_loop_filter_mix2_v_88_16_8bpp_sse2:      52.1 ( 3.86x)
      vp9_loop_filter_mix2_v_88_16_8bpp_ssse3:     53.9 ( 3.73x)
      vp9_loop_filter_mix2_v_88_16_8bpp_avx:       51.5 ( 3.90x)
      vp9_loop_filter_v_4_8_8bpp_c:                83.7
      vp9_loop_filter_v_4_8_8bpp_mmxext:           29.7 ( 2.81x)
      vp9_loop_filter_v_8_8_8bpp_c:                93.2
      vp9_loop_filter_v_8_8_8bpp_mmxext:           58.7 ( 1.59x)
      vp9_loop_filter_v_16_8_8bpp_c:              156.5
      vp9_loop_filter_v_16_16_8bpp_c:             292.9
      vp9_loop_filter_v_16_16_8bpp_sse2:          117.8 ( 2.43x)
      vp9_loop_filter_v_16_16_8bpp_ssse3:         116.7 ( 2.45x)
      vp9_loop_filter_v_16_16_8bpp_avx:           104.5 ( 2.78x)
    
    New benchmarks:
      vp9_loop_filter_h_4_8_8bpp_c:                77.5
      vp9_loop_filter_h_4_8_8bpp_mmxext:           54.8 ( 1.41x)
      vp9_loop_filter_h_8_8_8bpp_c:                85.5
      vp9_loop_filter_h_8_8_8bpp_mmxext:           75.0 ( 1.12x)
      vp9_loop_filter_h_16_8_8bpp_c:              139.8
      vp9_loop_filter_h_16_16_8bpp_c:             249.7
      vp9_loop_filter_h_16_16_8bpp_sse2:          154.9 ( 1.54x)
      vp9_loop_filter_h_16_16_8bpp_ssse3:         152.9 ( 1.54x)
      vp9_loop_filter_h_16_16_8bpp_avx:           142.1 ( 1.62x)
      vp9_loop_filter_mix2_h_44_16_8bpp_c:        167.8
      vp9_loop_filter_mix2_h_44_16_8bpp_sse2:      52.3 ( 3.21x)
      vp9_loop_filter_mix2_h_44_16_8bpp_ssse3:     52.7 ( 3.18x)
      vp9_loop_filter_mix2_h_44_16_8bpp_avx:       51.9 ( 3.18x)
      vp9_loop_filter_mix2_h_48_16_8bpp_c:        175.1
      vp9_loop_filter_mix2_h_48_16_8bpp_sse2:      73.2 ( 2.39x)
      vp9_loop_filter_mix2_h_48_16_8bpp_ssse3:     74.9 ( 2.28x)
      vp9_loop_filter_mix2_h_48_16_8bpp_avx:       69.0 ( 2.54x)
      vp9_loop_filter_mix2_h_84_16_8bpp_c:        177.7
      vp9_loop_filter_mix2_h_84_16_8bpp_sse2:      72.6 ( 2.45x)
      vp9_loop_filter_mix2_h_84_16_8bpp_ssse3:     71.3 ( 2.48x)
      vp9_loop_filter_mix2_h_84_16_8bpp_avx:       69.3 ( 2.56x)
      vp9_loop_filter_mix2_h_88_16_8bpp_c:        184.3
      vp9_loop_filter_mix2_h_88_16_8bpp_sse2:      69.6 ( 2.59x)
      vp9_loop_filter_mix2_h_88_16_8bpp_ssse3:     70.2 ( 2.62x)
      vp9_loop_filter_mix2_h_88_16_8bpp_avx:       69.3 ( 2.66x)
      vp9_loop_filter_mix2_v_44_16_8bpp_c:        176.3
      vp9_loop_filter_mix2_v_44_16_8bpp_sse2:      22.0 ( 7.98x)
      vp9_loop_filter_mix2_v_44_16_8bpp_ssse3:     21.4 ( 8.23x)
      vp9_loop_filter_mix2_v_44_16_8bpp_avx:       21.6 ( 8.18x)
      vp9_loop_filter_mix2_v_48_16_8bpp_c:        187.8
      vp9_loop_filter_mix2_v_48_16_8bpp_sse2:      49.9 ( 3.75x)
      vp9_loop_filter_mix2_v_48_16_8bpp_ssse3:     47.3 ( 3.96x)
      vp9_loop_filter_mix2_v_48_16_8bpp_avx:       46.1 ( 4.07x)
      vp9_loop_filter_mix2_v_84_16_8bpp_c:        189.7
      vp9_loop_filter_mix2_v_84_16_8bpp_sse2:      51.2 ( 3.58x)
      vp9_loop_filter_mix2_v_84_16_8bpp_ssse3:     48.4 ( 3.90x)
      vp9_loop_filter_mix2_v_84_16_8bpp_avx:       45.9 ( 4.14x)
      vp9_loop_filter_mix2_v_88_16_8bpp_c:        199.8
      vp9_loop_filter_mix2_v_88_16_8bpp_sse2:      51.2 ( 3.88x)
      vp9_loop_filter_mix2_v_88_16_8bpp_ssse3:     50.5 ( 3.93x)
      vp9_loop_filter_mix2_v_88_16_8bpp_avx:       45.4 ( 4.40x)
      vp9_loop_filter_v_4_8_8bpp_c:                83.3
      vp9_loop_filter_v_4_8_8bpp_mmxext:           23.2 ( 3.58x)
      vp9_loop_filter_v_8_8_8bpp_c:                92.6
      vp9_loop_filter_v_8_8_8bpp_mmxext:           52.5 ( 1.76x)
      vp9_loop_filter_v_16_8_8bpp_c:              154.9
      vp9_loop_filter_v_16_16_8bpp_c:             291.3
      vp9_loop_filter_v_16_16_8bpp_sse2:          104.8 ( 2.68x)
      vp9_loop_filter_v_16_16_8bpp_ssse3:         107.5 ( 2.64x)
      vp9_loop_filter_v_16_16_8bpp_avx:            97.7 ( 2.90x)
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/vp9lpf.asm | 131 ++++++++++++++++------------------------------
 1 file changed, 46 insertions(+), 85 deletions(-)

diff --git a/libavcodec/x86/vp9lpf.asm b/libavcodec/x86/vp9lpf.asm
index fd34881014..e4366e8713 100644
--- a/libavcodec/x86/vp9lpf.asm
+++ b/libavcodec/x86/vp9lpf.asm
@@ -219,10 +219,11 @@ SECTION .text
     mova                %5, %1
 %endmacro
 
-%macro SRSHIFT3B_2X 4 ; reg1, reg2, [pb_10], tmp
-    mova                %4, [pb_f8]
-    pand                %1, %4
-    pand                %2, %4
+%macro SRSHIFT3B_2X 3 ; reg1, reg2, tmp
+    mova                %3, [pb_f8]
+    pand                %1, %3
+    pand                %2, %3
+    mova                %3, [pb_10]
     psrlq               %1, 3
     psrlq               %2, 3
     pxor                %1, %3
@@ -771,8 +772,7 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + %4 
+ %%ext, dst, stride
     ; if (fm) {
     ;     if (out && in) filter_14()
     ;     else if (in)   filter_6()
-    ;     else if (hev)  filter_2()
-    ;     else           filter_4()
+    ;     else           filter_2_4()
     ; }
     ;
     ; f14:                                                                     
       fm &  out &  in
@@ -781,86 +781,49 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
     ; f4:  fm & ~f14 & ~f6 & ~f2 => fm & ~(out & in) & ~(~out & in) & ~(~in & 
hev) => fm &  ~in & ~hev
 
     ; (m0: hev, [m1: flat8out], [m2: flat8in], m3: fm, m4: pb_80, m8..15: p5 
p4 p1 p0 q0 q1 q6 q7)
-    ; filter2()
-    SWAP 4, 6
-%if %2 != 44 && %2 != 4
-    SCRATCH              2, 15, rsp+%3+%4
+    ; filter2_4()
 %if %2 == 16
     SCRATCH              1,  8, rsp+%3+%4+16
 %endif
-%endif
-    pxor                m2, m6, rq0                     ; q0 ^ 0x80
-    pxor                m4, m6, rp0                     ; p0 ^ 0x80
-    psubsb              m2, m4                          ; (signed) q0 - p0
-    pxor                m4, m6, rp1                     ; p1 ^ 0x80
-    pxor                m5, m6, rq1                     ; q1 ^ 0x80
-    psubsb              m4, m5                          ; (signed) p1 - q1
-    paddsb              m4, m2                          ;   (q0 - p0) + (p1 - 
q1)
-    paddsb              m4, m2                          ; 2*(q0 - p0) + (p1 - 
q1)
-    paddsb              m4, m2                          ; 3*(q0 - p0) + (p1 - 
q1)
-    paddsb              m6, m4, [pb_4]                  ; m6: f1 = clip(f + 4, 
127)
-    paddsb              m4, [pb_3]                      ; m4: f2 = clip(f + 3, 
127)
-%ifdef m8
-    mova                m14, [pb_10]                    ; will be reused in 
filter4()
-%define rb10 m14
-%else
-%define rb10 [pb_10]
-%endif
-    SRSHIFT3B_2X        m6, m4, rb10, m7                ; f1 and f2 sign byte 
shift by 3
-    SIGN_SUB            m7, rq0, m6, m5                 ; m7 = q0 - f1
-    SIGN_ADD            m1, rp0, m4, m5                 ; m1 = p0 + f2
-%if %2 != 44 && %2 != 4
-%ifdef m8
-    pandn               m6, m15, m3                     ;  ~mask(in) & mask(fm)
-%else
-    mova                m6, [rsp+%3+%4]
-    pandn               m6, m3
-%endif
-    pand                m6, m0                          ; (~mask(in) & 
mask(fm)) & mask(hev)
-%else
-    pand                m6, m3, m0
-%endif
-    MASK_APPLY          m7, rq0, m6, m5                 ; m7 = filter2(q0) & 
mask / we write it in filter4()
-    MASK_APPLY          m1, rp0, m6, m5                 ; m1 = filter2(p0) & 
mask / we write it in filter4()
-
-    ; (m0: hev, m1: p0', m2: q0-p0, m3: fm, m7: q0', [m8: flat8out], m10..13: 
p1 p0 q0 q1, m14: pb_10, [m15: flat8in], )
-    ; filter4()
-    paddsb              m4, m2, m2                      ; 2 * (q0 - p0)
-    paddsb              m2, m4                          ; 3 * (q0 - p0)
-    paddsb              m6, m2, [pb_4]                  ; m6:  f1 = clip(f + 
4, 127)
-    paddsb              m2, [pb_3]                      ; m2: f2 = clip(f + 3, 
127)
-    SRSHIFT3B_2X        m6, m2, rb10, m4                ; f1 and f2 sign byte 
shift by 3
+    pxor                m5, m4, rp1                     ; p1 - 128
+    pxor                m7, m4, rq1                     ; q1 - 128
+    pxor                m6, m4, rq0                     ; q0 - 128
+    psubsb              m5, m7                          ; clip_i8(p1 - q1)
+    pxor                m7, m4, rp0                     ; p0 - 128
+    ; mask so we can treat the !hev and hev cases in parallel
+    pand                m5, m0                          ; hev ? clip_i8(p1 - 
q1) : 0
+    psubsb              m6, m7                          ; clip_i8(q0 - p0)
+    paddsb              m5, m6                          ;   (q0 - p0) + (p1 - 
q1)
+    paddsb              m5, m6                          ; 2*(q0 - p0) + (p1 - 
q1)
+    paddsb              m5, m6                          ; f = 3*(q0 - p0) + 
(p1 - q1)
+    ; zero f unless we are in filter2_4 case to ensure that p0, p1, q0, q1
+    ; are only changed if they should be
 %if %2 != 44 && %2 != 4
-%ifdef m8
-    pandn               m5, m15, m3                     ;               
~mask(in) & mask(fm)
-%else
-    mova                m5, [rsp+%3+%4]
-    pandn               m5, m3
-%endif
-    pandn               m0, m5                          ; ~mask(hev) & 
(~mask(in) & mask(fm))
+    pandn               m7, m2, m3
+    pand                m5, m7
 %else
-    pandn               m0, m3
-%endif
-    SIGN_SUB            m5, rq0, m6, m4                 ; q0 - f1
-    MASK_APPLY          m5, m7, m0, m4                  ; filter4(q0) & mask
-    mova                [Q0], m5
-    SIGN_ADD            m7, rp0, m2, m4                 ; p0 + f2
-    MASK_APPLY          m7, m1, m0, m4                  ; filter4(p0) & mask
-    mova                [P0], m7
-    paddb               m6, [pb_80]                     ;
-    pxor                m1, m1                          ;   f=(f1+1)>>1
-    pavgb               m6, m1                          ;
-    psubb               m6, [pb_40]                     ;
-    SIGN_ADD            m1, rp1, m6, m2                 ; p1 + f
-    SIGN_SUB            m4, rq1, m6, m2                 ; q1 - f
-    MASK_APPLY          m1, rp1, m0, m2                 ; m1 = filter4(p1)
-    MASK_APPLY          m4, rq1, m0, m2                 ; m4 = filter4(q1)
-    mova                [P1], m1
-    mova                [Q1], m4
-
-%if %2 != 44 && %2 != 4
-    UNSCRATCH            2, 15, rsp+%3+%4
-%endif
+    pand                m5, m3
+%endif
+    paddsb              m6, m5, [pb_4]                  ; m6: f1 = clip(f + 4, 
127)
+    paddsb              m5, [pb_3]                      ; m5: f2 = clip(f + 3, 
127)
+    SRSHIFT3B_2X        m6, m5, m7                      ; f1 and f2 sign byte 
shift by 3
+    pandn               m0, m6                          ; hev ? 0 : f1
+    SIGN_SUB            m7, rq0, m6, m1                 ; m7 = q0 - f1
+    SIGN_ADD            m6, rp0, m5, m1                 ; m6 = p0 + f2
+    mova              [Q0], m7
+    mova              [P0], m6
+    pxor                m0, m4                          ; f1 ^ 0x80
+    pxor                m5, m5
+    pavgb               m0, m5
+    psubb               m0, [pb_40]                     ; (f1 + 1) >> 1
+%if %2 == 44 || %2 == 4
+    SWAP                 1, 6                           ; m1 = p0
+    SWAP                 2, 7                           ; m2 = q0
+%endif
+    SIGN_ADD            m6, rp1, m0, m5                 ; p1 + f
+    SIGN_SUB            m7, rq1, m0, m5                 ; q1 - f
+    mova              [P1], m6
+    mova              [Q1], m7
 
     ; ([m1: flat8out], m2: flat8in, m3: fm, m10..13: p1 p0 q0 q1)
     ; filter6()
@@ -1052,10 +1015,8 @@ cglobal vp9_loop_filter_%1_%2_ %+ mmsize, 2, 6, 16, %3 + 
%4 + %%ext, dst, stride
     movhps [Q7],  m7
 %endif
 %elif %2 == 44 || %2 == 4
-    SWAP 0, 1   ; m0 = p1
-    SWAP 1, 7   ; m1 = p0
-    SWAP 2, 5   ; m2 = q0
-    SWAP 3, 4   ; m3 = q1
+    SWAP 0, 6   ; m0 = p1
+    SWAP 3, 7   ; m3 = q1
     DEFINE_REAL_P7_TO_Q7 2
     SBUTTERFLY  bw, 0, 1, 4
     SBUTTERFLY  bw, 2, 3, 4

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

Reply via email to