This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit b4d11f4046335a1e992d75e4ef9890844f7cf742 Author: Andreas Rheinhardt <[email protected]> AuthorDate: Thu Jul 30 15:59:53 2026 +0200 Commit: Andreas Rheinhardt <[email protected]> CommitDate: Sun Aug 2 18:36:51 2026 +0200 avcodec/x86/lossless_videodsp: Optimize add_gradient_pred Combinations of shift and add like pslldq m3, m2, 1 paddb m2, m3 are linear in the input register m2. This implies that instead of applying the same sequence of shifts and adds to two different registers and adding said registers one can just add the register first and then apply said sequence of shifts and adds once. Old benchmarks: add_gradient_pred_c: 2296.2 add_gradient_pred_ssse3: 570.4 ( 3.95x) add_gradient_pred_avx2: 308.8 ( 7.29x) New benchmarks: add_gradient_pred_c: 2315.6 add_gradient_pred_ssse3: 344.0 ( 6.72x) add_gradient_pred_avx2: 205.2 (11.28x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/lossless_videodsp.asm | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/libavcodec/x86/lossless_videodsp.asm b/libavcodec/x86/lossless_videodsp.asm index 1761a2f08f..53adc67977 100644 --- a/libavcodec/x86/lossless_videodsp.asm +++ b/libavcodec/x86/lossless_videodsp.asm @@ -276,7 +276,7 @@ cglobal add_left_pred_int16_unaligned, 4,4,7, dst, src, mask, w, left ; void add_gradient_pred(uint8_t *src, const ptrdiff_t stride, const ptrdiff_t width) ;--------------------------------------------------------------------------------------------- %macro ADD_GRADIENT_PRED 0 -cglobal add_gradient_pred, 3,4,5, src, stride, width, tmp +cglobal add_gradient_pred, 3,4,4, src, stride, width, tmp mova xm0, [pb_15] ;load src - 1 in xm1 @@ -294,13 +294,13 @@ cglobal add_gradient_pred, 3,4,5, src, stride, width, tmp .loop: lea tmpq, [srcq + strideq] - mova m2, [tmpq + widthq] ; A = src[x-stride] + mova m2, [srcq + widthq] ; current val (src[x]) + paddb m2, [tmpq + widthq] ; add A = src[x-stride] movu m3, [tmpq + widthq - 1] ; B = src[x - (stride + 1)] - mova m4, [srcq + widthq] ; current val (src[x]) - psubb m2, m3; A - B + psubb m2, m3 ; cur + A - B -; prefix sum A-B +; prefix sum pslldq m3, m2, 1 paddb m2, m3 pslldq m3, m2, 2 @@ -310,19 +310,6 @@ cglobal add_gradient_pred, 3,4,5, src, stride, width, tmp pslldq m3, m2, 8 paddb m2, m3 -; prefix sum current val - pslldq m3, m4, 1 - paddb m4, m3 - pslldq m3, m4, 2 - paddb m4, m3 - pslldq m3, m4, 4 - paddb m4, m3 - pslldq m3, m4, 8 - paddb m4, m3 - -; last sum - paddb m2, m4 ; current + (A - B) - paddb xm1, xm2 ; += C mova [srcq + widthq], xm1 ; store _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
