On Tue, Mar 31, 2026 at 1:28 PM Zuxy Meng via ffmpeg-devel
<[email protected]> wrote:
>
> From: zuxy <[email protected]>
>
> More about deprecating MMX than any performance gain; nearly identical
> performance numbers on my Zen 4 (1.36x vs c), but llvm-mca predicts
Does the performance gain stem solely from the removal of MMX or from
the addition of SSE2?
> >60% perf gain on Intel CPUs newer than Skylake.
>
> Signed-off-by: Zuxy Meng <[email protected]>
> ---
>  libavcodec/x86/h264_intrapred.asm    | 44 ++++++++++++----------------
>  libavcodec/x86/h264_intrapred_init.c |  9 ++++--
>  2 files changed, 25 insertions(+), 28 deletions(-)
>
> diff --git a/libavcodec/x86/h264_intrapred.asm 
> b/libavcodec/x86/h264_intrapred.asm
> index a8a630dbe6..2e4a46ae76 100644
> --- a/libavcodec/x86/h264_intrapred.asm
> +++ b/libavcodec/x86/h264_intrapred.asm
> @@ -606,37 +606,31 @@ INIT_MMX ssse3
>  PRED8x8_H
>
>  
> ;-----------------------------------------------------------------------------
> -; void ff_pred8x8_top_dc_8_mmxext(uint8_t *src, ptrdiff_t stride)
> +; void ff_pred8x8_top_dc_8_sse2(uint8_t *src, ptrdiff_t stride)
>  
> ;-----------------------------------------------------------------------------
> -INIT_MMX mmxext
> +INIT_XMM sse2
>  cglobal pred8x8_top_dc_8, 2,5
>      sub         r0, r1
> -    movq       mm0, [r0]
> -    pxor       mm1, mm1
> -    pxor       mm2, mm2
> +    movq      xmm0, [r0]
> +    pxor      xmm1, xmm1
>      lea         r2, [r0+r1*2]
> -    punpckhbw  mm1, mm0
> -    punpcklbw  mm0, mm2
> -    psadbw     mm1, mm2        ; s1
> +    punpcklbw xmm0, xmm1
> +    psadbw    xmm0, xmm1       ; s0,0,0,0,s1,0,0,0 (w)
>      lea         r3, [r2+r1*2]
> -    psadbw     mm0, mm2        ; s0
> -    psrlw      mm1, 1
> -    psrlw      mm0, 1
> -    pavgw      mm1, mm2
> -    lea         r4, [r3+r1*2]
> -    pavgw      mm0, mm2
> -    pshufw     mm1, mm1, 0
> -    pshufw     mm0, mm0, 0     ; dc0 (w)
> -    packuswb   mm0, mm1        ; dc0,dc1 (b)
> -    movq [r0+r1*1], mm0
> -    movq [r0+r1*2], mm0
> +    psrlw     xmm0, 1
> +    pavgw     xmm0, xmm1
> +    pshuflw   xmm0, xmm0, 0    ; dc0,dc0,dc0,dc0,dc1,0,0,0
> +    pshufhw   xmm0, xmm0, 0    ; dc0,dc1 (w)
> +    packuswb  xmm0, xmm1       ; dc0,dc1 (b)
> +    movq [r0+r1*1], xmm0
> +    movq [r0+r1*2], xmm0
>      lea         r0, [r3+r1*2]
> -    movq [r2+r1*1], mm0
> -    movq [r2+r1*2], mm0
> -    movq [r3+r1*1], mm0
> -    movq [r3+r1*2], mm0
> -    movq [r0+r1*1], mm0
> -    movq [r0+r1*2], mm0
> +    movq [r2+r1*1], xmm0
> +    movq [r2+r1*2], xmm0
> +    movq [r3+r1*1], xmm0
> +    movq [r3+r1*2], xmm0
> +    movq [r0+r1*1], xmm0
> +    movq [r0+r1*2], xmm0
>      RET
>
>  
> ;-----------------------------------------------------------------------------
> diff --git a/libavcodec/x86/h264_intrapred_init.c 
> b/libavcodec/x86/h264_intrapred_init.c
> index aa9bc721f0..0476980a57 100644
> --- a/libavcodec/x86/h264_intrapred_init.c
> +++ b/libavcodec/x86/h264_intrapred_init.c
> @@ -113,7 +113,7 @@ PRED16x16(plane_svq3, 8, ssse3)
>  PRED16x16(tm_vp8, 8, sse2)
>  PRED16x16(tm_vp8, 8, avx2)
>
> -PRED8x8(top_dc, 8, mmxext)
> +PRED8x8(top_dc, 8, sse2)
>  PRED8x8(dc_rv40, 8, mmxext)
>  PRED8x8(dc, 8, mmxext)
>  PRED8x8(vertical, 8, sse2)
> @@ -187,7 +187,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, 
> int codec_id,
>              }
>              if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == 
> AV_CODEC_ID_H264) {
>                  if (chroma_format_idc <= 1) {
> -                    h->pred8x8[TOP_DC_PRED8x8   ] = 
> ff_pred8x8_top_dc_8_mmxext;
>                      h->pred8x8[DC_PRED8x8       ] = ff_pred8x8_dc_8_mmxext;
>                  }
>              }
> @@ -210,8 +209,12 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, 
> int codec_id,
>              h->pred8x8l [VERT_RIGHT_PRED      ] = 
> ff_pred8x8l_vertical_right_8_sse2;
>              h->pred8x8l [VERT_LEFT_PRED       ] = 
> ff_pred8x8l_vertical_left_8_sse2;
>              h->pred8x8l [HOR_DOWN_PRED        ] = 
> ff_pred8x8l_horizontal_down_8_sse2;
> -            if (chroma_format_idc <= 1)
> +            if (chroma_format_idc <= 1) {
>                  h->pred8x8  [VERT_PRED8x8     ] = ff_pred8x8_vertical_8_sse2;
> +                if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == 
> AV_CODEC_ID_H264) {
> +                    h->pred8x8 [TOP_DC_PRED8x8] = ff_pred8x8_top_dc_8_sse2;
> +                }
> +            }
>              if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
>                  h->pred16x16[PLANE_PRED8x8    ] = ff_pred16x16_tm_vp8_8_sse2;
>                  h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_sse2;
> --
> 2.43.0
_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to