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]
