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]

Reply via email to