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

Git pushed a commit to branch master
in repository ffmpeg.

commit 8f05c446a1e3f16785b3768623050a23c7d7bfb1
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Fri Jul 24 13:07:35 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Sat Aug 1 16:50:06 2026 +0200

    avcodec/x86/vc1dsp_loopfilter: Use psignw when available
    
    The VC1 loop filter uses something equivalent to
    if (a0_sign ^ clip_sign) {
        if (clip_sign) d = -d;
    } else d = 0;
    which can be mapped to psignw.
    
    Old benchmarks:
      vc1dsp.vc1_h_loop_filter4_bestcase_c:            3.0
      vc1dsp.vc1_h_loop_filter4_bestcase_ssse3:       32.4 ( 0.09x)
      vc1dsp.vc1_h_loop_filter4_worstcase_c:          42.3
      vc1dsp.vc1_h_loop_filter4_worstcase_ssse3:      32.7 ( 1.29x)
      vc1dsp.vc1_h_loop_filter8_bestcase_c:            6.1
      vc1dsp.vc1_h_loop_filter8_bestcase_sse2:        37.1 ( 0.17x)
      vc1dsp.vc1_h_loop_filter8_bestcase_ssse3:       36.4 ( 0.17x)
      vc1dsp.vc1_h_loop_filter8_bestcase_sse4:        36.6 ( 0.17x)
      vc1dsp.vc1_h_loop_filter8_worstcase_c:          87.2
      vc1dsp.vc1_h_loop_filter8_worstcase_sse2:       36.9 ( 2.36x)
      vc1dsp.vc1_h_loop_filter8_worstcase_ssse3:      35.8 ( 2.35x)
      vc1dsp.vc1_h_loop_filter8_worstcase_sse4:       36.7 ( 2.38x)
      vc1dsp.vc1_h_loop_filter16_bestcase_c:          12.0
      vc1dsp.vc1_h_loop_filter16_bestcase_sse2:       40.0 ( 0.30x)
      vc1dsp.vc1_h_loop_filter16_bestcase_ssse3:      39.8 ( 0.30x)
      vc1dsp.vc1_h_loop_filter16_bestcase_sse4:       44.4 ( 0.27x)
      vc1dsp.vc1_h_loop_filter16_worstcase_c:        166.4
      vc1dsp.vc1_h_loop_filter16_worstcase_sse2:      39.9 ( 4.17x)
      vc1dsp.vc1_h_loop_filter16_worstcase_ssse3:     39.7 ( 4.19x)
      vc1dsp.vc1_h_loop_filter16_worstcase_sse4:      43.8 ( 3.80x)
      vc1dsp.vc1_v_loop_filter4_bestcase_c:            3.6
      vc1dsp.vc1_v_loop_filter4_bestcase_ssse3:       16.3 ( 0.22x)
      vc1dsp.vc1_v_loop_filter4_worstcase_c:          49.3
      vc1dsp.vc1_v_loop_filter4_worstcase_ssse3:      16.2 ( 3.04x)
      vc1dsp.vc1_v_loop_filter8_bestcase_c:            6.4
      vc1dsp.vc1_v_loop_filter8_bestcase_sse2:        16.3 ( 0.39x)
      vc1dsp.vc1_v_loop_filter8_bestcase_ssse3:       15.8 ( 0.40x)
      vc1dsp.vc1_v_loop_filter8_worstcase_c:          85.7
      vc1dsp.vc1_v_loop_filter8_worstcase_sse2:       16.3 ( 5.24x)
      vc1dsp.vc1_v_loop_filter8_worstcase_ssse3:      15.8 ( 5.42x)
      vc1dsp.vc1_v_loop_filter16_bestcase_c:          12.7
      vc1dsp.vc1_v_loop_filter16_bestcase_sse2:       24.7 ( 0.52x)
      vc1dsp.vc1_v_loop_filter16_bestcase_ssse3:      22.7 ( 0.56x)
      vc1dsp.vc1_v_loop_filter16_worstcase_c:        169.4
      vc1dsp.vc1_v_loop_filter16_worstcase_sse2:      24.1 ( 7.03x)
      vc1dsp.vc1_v_loop_filter16_worstcase_ssse3:     24.6 ( 6.88x)
    
    New benchmarks:
      vc1dsp.vc1_h_loop_filter4_bestcase_c:            3.0
      vc1dsp.vc1_h_loop_filter4_bestcase_ssse3:       32.0 ( 0.09x)
      vc1dsp.vc1_h_loop_filter4_worstcase_c:          43.2
      vc1dsp.vc1_h_loop_filter4_worstcase_ssse3:      31.8 ( 1.36x)
      vc1dsp.vc1_h_loop_filter8_bestcase_c:            6.0
      vc1dsp.vc1_h_loop_filter8_bestcase_sse2:        36.9 ( 0.16x)
      vc1dsp.vc1_h_loop_filter8_bestcase_ssse3:       35.5 ( 0.17x)
      vc1dsp.vc1_h_loop_filter8_bestcase_sse4:        36.2 ( 0.17x)
      vc1dsp.vc1_h_loop_filter8_worstcase_c:          87.3
      vc1dsp.vc1_h_loop_filter8_worstcase_sse2:       37.6 ( 2.33x)
      vc1dsp.vc1_h_loop_filter8_worstcase_ssse3:      35.3 ( 2.40x)
      vc1dsp.vc1_h_loop_filter8_worstcase_sse4:       36.1 ( 2.42x)
      vc1dsp.vc1_h_loop_filter16_bestcase_c:          11.8
      vc1dsp.vc1_h_loop_filter16_bestcase_sse2:       40.1 ( 0.29x)
      vc1dsp.vc1_h_loop_filter16_bestcase_ssse3:      39.2 ( 0.30x)
      vc1dsp.vc1_h_loop_filter16_bestcase_sse4:       42.9 ( 0.28x)
      vc1dsp.vc1_h_loop_filter16_worstcase_c:        166.5
      vc1dsp.vc1_h_loop_filter16_worstcase_sse2:      39.8 ( 4.18x)
      vc1dsp.vc1_h_loop_filter16_worstcase_ssse3:     39.1 ( 4.26x)
      vc1dsp.vc1_h_loop_filter16_worstcase_sse4:      42.9 ( 3.88x)
      vc1dsp.vc1_v_loop_filter4_bestcase_c:            3.6
      vc1dsp.vc1_v_loop_filter4_bestcase_ssse3:       15.7 ( 0.22x)
      vc1dsp.vc1_v_loop_filter4_worstcase_c:          49.1
      vc1dsp.vc1_v_loop_filter4_worstcase_ssse3:      15.8 ( 3.10x)
      vc1dsp.vc1_v_loop_filter8_bestcase_c:            6.4
      vc1dsp.vc1_v_loop_filter8_bestcase_sse2:        16.3 ( 0.39x)
      vc1dsp.vc1_v_loop_filter8_bestcase_ssse3:       15.3 ( 0.42x)
      vc1dsp.vc1_v_loop_filter8_worstcase_c:          85.7
      vc1dsp.vc1_v_loop_filter8_worstcase_sse2:       16.3 ( 5.26x)
      vc1dsp.vc1_v_loop_filter8_worstcase_ssse3:      15.2 ( 5.62x)
      vc1dsp.vc1_v_loop_filter16_bestcase_c:          13.6
      vc1dsp.vc1_v_loop_filter16_bestcase_sse2:       24.8 ( 0.55x)
      vc1dsp.vc1_v_loop_filter16_bestcase_ssse3:      21.3 ( 0.64x)
      vc1dsp.vc1_v_loop_filter16_worstcase_c:        170.0
      vc1dsp.vc1_v_loop_filter16_worstcase_sse2:      23.9 ( 7.11x)
      vc1dsp.vc1_v_loop_filter16_worstcase_ssse3:     23.3 ( 7.28x)
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/vc1dsp_loopfilter.asm | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/libavcodec/x86/vc1dsp_loopfilter.asm 
b/libavcodec/x86/vc1dsp_loopfilter.asm
index 883896a3ed..7f4783afa7 100644
--- a/libavcodec/x86/vc1dsp_loopfilter.asm
+++ b/libavcodec/x86/vc1dsp_loopfilter.asm
@@ -94,21 +94,40 @@ SECTION .text
     psraw   m4, 3        ; d = (5*(a0 - a3)) >> 3
     pxor    m2, m2
     pminsw  m4, m5       ; d = min(d, clip)
+%if cpuflag(ssse3)
+    ; m3 and m7 are in the -255..255 range, so that every bit in each word's
+    ; upper half coincides with the sign bit. When subtracting as bytes
+    ; the upper byte of every word is 0 if m3 and m7 have the same sign,
+    ; 1 if m7 (a0_sign) is negative/set but m3 is not and -1 else.
+    ; After the right shift by eight bits below, the value of the word
+    ; coincides with the current value of the upper byte.
+    psubb   m3, m7
+    pcmpgtw m5, m2       ; if (clip)
+%else
     psraw   m3, 15
     pcmpgtw m5, m2       ; if (clip)
     pxor    m7, m3       ; a0_sign ^ clip_sign
+%endif
     pand    m6, m5       ; filt3 (C return value)
 
 ; each set of 4 pixels is not filtered if the 3rd is not
     PSHUFLW m5, m6, q2222
+%if cpuflag(ssse3)
+    psraw   m3, 8
+%else
     psraw   m7, 15       ; a0_sign ^ clip_sign as mask
+%endif
     pand    m4, m6
 %if %1 > 4
     pshufhw m5, m5, q2222
 %endif
+%if cpuflag(ssse3)
+    psignw  m4, m3
+%else
     pxor    m4, m3
     pand    m5, m7
     psubw   m4, m3
+%endif
     pand    m4, m5
     psubw   m0, m4
     paddw   m1, m4

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

Reply via email to