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]
