This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 0127016c41092e53809b6548cc1487ec5a8c87d0
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Tue Jul 28 22:43:21 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Sun Aug 2 02:12:51 2026 +0200

    avcodec/x86/huffyuvdsp: Add SSE4 add_hfyu_median_pred_int16
    
    Heavily based upon the existing mmxext function, but
    it allows to use p{max,min}uw, so also supports 16bpp
    pixel formats. It is also faster:
    
      add_hfyu_median_pred_int16_c:       14368.1
      add_hfyu_median_pred_int16_mmxext:   7384.2 ( 1.94x)
      add_hfyu_median_pred_int16_sse4:     6474.4 ( 2.21x)
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/huffyuvdsp.asm    | 87 ++++++++++++++++++++++++++++++++++++++++
 libavcodec/x86/huffyuvdsp_init.c |  6 +++
 2 files changed, 93 insertions(+)

diff --git a/libavcodec/x86/huffyuvdsp.asm b/libavcodec/x86/huffyuvdsp.asm
index f8eaa921af..e473f75c86 100644
--- a/libavcodec/x86/huffyuvdsp.asm
+++ b/libavcodec/x86/huffyuvdsp.asm
@@ -135,3 +135,90 @@ cglobal add_hfyu_median_pred_int16, 7,7,0, dst, top, diff, 
mask, w, left, left_t
     movzx   r2d, word [topq-2]
     mov [left_topq], r2d
     RET
+
+; void ff_add_hfyu_median_pred_sse4(uint16_t *dst, const uint16_t *top,
+;                                   const uint16_t *diff, int mask,
+;                                   int w, int *left, int *left_top)
+INIT_XMM sse4
+cglobal add_hfyu_median_pred_int16, 7,7,8, dst, top, diff, mask, w, left, 
left_top
+    movq     m1, [topq]
+    movd     m4, [left_topq]
+    add      wd, wd
+    movd     m6, maskd
+    add   diffq, wq
+    psllq    m2, m1, 16
+    movd     m3, [leftq]
+    add    topq, wq
+    por      m4, m2
+    add    dstq, wq
+    psubw    m0, m1, m4         ; t-tl
+    neg      wq
+    jmp .skip
+.loop:
+%if avx_enabled
+    movq     m1, [topq+wq]  ; t
+    psllq    m0, m1, 16
+    por      m0, m4
+    psubw    m0, m1, m0     ; t-tl
+%else
+    movq     m4, [topq+wq]
+    mova     m0, m4
+    psllq    m4, 16
+    por      m4, m1
+    mova     m1, m0         ; t
+    psubw    m0, m4         ; t-tl
+%endif
+.skip:
+    movq     m2, [diffq+wq]
+%assign i 0
+%rep 4
+%if i<3
+    paddw    m4, m0, m3     ; t-tl+l
+%else
+    SWAP     0, 4
+    paddw    m4, m3         ; t-tl+l
+%endif
+%if avx_enabled
+    SWAP     3,5
+    pmaxuw   m3, m5, m1
+%else
+    mova     m5, m3
+    pmaxuw   m3, m1
+%endif
+%if i==2
+    punpcklwd m7, m5
+%elif i==3
+    punpckldq m7, m5
+%endif
+    pand     m4, m6
+    pminuw   m5, m1
+    pminuw   m3, m4
+    pmaxuw   m3, m5         ; median
+    paddw    m3, m2         ; +residual
+    pand     m3, m6
+%if i==0
+    mova     m7, m3
+%elif i == 3
+    pshuflw  m4, m3, 0
+    pblendw  m7, m4, 1000b
+%endif
+%if i<3
+    psrlq    m0, 16
+%if avx_enabled && i == 2
+    psrlq    m4, m1, 16
+    SWAP      1, 4
+%else
+    psrlq    m1, 16
+%endif
+    psrlq    m2, 16
+%endif
+%assign i i+1
+%endrep
+    movq [dstq+wq], m7
+    add      wq, 8
+    jl .loop
+    movzx   r2d, word [dstq-2]
+    mov [leftq], r2d
+    movzx   r2d, word [topq-2]
+    mov [left_topq], r2d
+    RET
diff --git a/libavcodec/x86/huffyuvdsp_init.c b/libavcodec/x86/huffyuvdsp_init.c
index b25a416d81..feca6a5a95 100644
--- a/libavcodec/x86/huffyuvdsp_init.c
+++ b/libavcodec/x86/huffyuvdsp_init.c
@@ -31,6 +31,8 @@ void ff_add_int16_avx2(uint16_t *dst, const uint16_t *src, 
unsigned mask, int w)
 void ff_add_hfyu_left_pred_bgr32_sse2(uint8_t *dst, const uint8_t *src,
                                       intptr_t w, uint8_t *left);
 void ff_add_hfyu_median_pred_int16_mmxext(uint16_t *dst, const uint16_t *top, 
const uint16_t *diff, unsigned mask, int w, int *left, int *left_top);
+void ff_add_hfyu_median_pred_int16_sse4(uint16_t *dst, const uint16_t *top, 
const uint16_t *diff,
+                                        unsigned mask, int w, int *left, int 
*left_top);
 
 av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c, enum AVPixelFormat 
pix_fmt)
 {
@@ -46,6 +48,10 @@ av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c, 
enum AVPixelFormat pix
         c->add_hfyu_left_pred_bgr32 = ff_add_hfyu_left_pred_bgr32_sse2;
     }
 
+    if (EXTERNAL_SSE4(cpu_flags)) {
+        c->add_hfyu_median_pred_int16 = ff_add_hfyu_median_pred_int16_sse4;
+    }
+
     if (EXTERNAL_AVX2_FAST(cpu_flags)) {
         c->add_int16 = ff_add_int16_avx2;
     }

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to