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]
