On Sun, Apr 12, 2026 at 6:14 PM Zuxy Meng <[email protected]> wrote:
>
> Deprecating MMX w/o performance regression; nearly identical performance
> numbers on my Zen 4 (1.99x vs c)
>
> Signed-off-by: Zuxy Meng <[email protected]>
> ---
> v1 -> v2: avoid callee saved registers on Win64
>
>  libavcodec/x86/h264_intrapred.asm    | 30 +++++++++++++---------------
>  libavcodec/x86/h264_intrapred_init.c |  8 ++------
>  2 files changed, 16 insertions(+), 22 deletions(-)
>
> diff --git a/libavcodec/x86/h264_intrapred.asm 
> b/libavcodec/x86/h264_intrapred.asm
> index 2e4a46ae76..b1c5ffa50d 100644
> --- a/libavcodec/x86/h264_intrapred.asm
> +++ b/libavcodec/x86/h264_intrapred.asm
> @@ -634,18 +634,18 @@ cglobal pred8x8_top_dc_8, 2,5
>      RET
>
>  
> ;-----------------------------------------------------------------------------
> -; void ff_pred8x8_dc_8_mmxext(uint8_t *src, ptrdiff_t stride)
> +; void ff_pred8x8_dc_8_sse2(uint8_t *src, ptrdiff_t stride)
>  
> ;-----------------------------------------------------------------------------
>
> -INIT_MMX mmxext
> -cglobal pred8x8_dc_8, 2,5
> +INIT_XMM sse2
> +cglobal pred8x8_dc_8, 2,5,5
>      sub       r0, r1
> -    pxor      m7, m7
> +    pxor      m4, m4
>      movd      m0, [r0+0]
>      movd      m1, [r0+4]
> -    psadbw    m0, m7            ; s0
> +    psadbw    m0, m4            ; s0
>      mov       r4, r0
> -    psadbw    m1, m7            ; s1
> +    psadbw    m1, m4            ; s1
>
>      movzx    r2d, byte [r0+r1*1-1]
>      movzx    r3d, byte [r0+r1*2-1]
> @@ -671,27 +671,25 @@ cglobal pred8x8_dc_8, 2,5
>      mov       r0, r4
>      punpcklwd m2, m3
>      punpckldq m0, m2            ; s0, s1, s2, s3
> -    pshufw    m3, m0, 11110110b ; s2, s1, s3, s3
> +    pshuflw   m3, m0, 11110110b ; s2, s1, s3, s3
>      lea       r2, [r0+r1*2]
> -    pshufw    m0, m0, 01110100b ; s0, s1, s3, s1
> +    pshuflw   m0, m0, 01110100b ; s0, s1, s3, s1
>      paddw     m0, m3
>      lea       r3, [r2+r1*2]
>      psrlw     m0, 2
> -    pavgw     m0, m7            ; s0+s2, s1, s3, s1+s3
> +    pavgw     m0, m4            ; s0+s2, s1, s3, s1+s3
>      lea       r4, [r3+r1*2]
>      packuswb  m0, m0
>      punpcklbw m0, m0
> -    movq      m1, m0
> -    punpcklbw m0, m0
> -    punpckhbw m1, m1
> +    punpcklwd m0, m0
>      movq [r0+r1*1], m0
>      movq [r0+r1*2], m0
>      movq [r2+r1*1], m0
>      movq [r2+r1*2], m0
> -    movq [r3+r1*1], m1
> -    movq [r3+r1*2], m1
> -    movq [r4+r1*1], m1
> -    movq [r4+r1*2], m1
> +    movhps [r3+r1*1], m0
> +    movhps [r3+r1*2], m0
> +    movhps [r4+r1*1], m0
> +    movhps [r4+r1*2], m0
>      RET
>
>  
> ;-----------------------------------------------------------------------------
> diff --git a/libavcodec/x86/h264_intrapred_init.c 
> b/libavcodec/x86/h264_intrapred_init.c
> index 0476980a57..44dd0cbde4 100644
> --- a/libavcodec/x86/h264_intrapred_init.c
> +++ b/libavcodec/x86/h264_intrapred_init.c
> @@ -115,7 +115,7 @@ PRED16x16(tm_vp8, 8, avx2)
>
>  PRED8x8(top_dc, 8, sse2)
>  PRED8x8(dc_rv40, 8, mmxext)
> -PRED8x8(dc, 8, mmxext)
> +PRED8x8(dc, 8, sse2)
>  PRED8x8(vertical, 8, sse2)
>  PRED8x8(horizontal, 8, mmxext)
>  PRED8x8(horizontal, 8, ssse3)
> @@ -185,11 +185,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, 
> int codec_id,
>              if (codec_id != AV_CODEC_ID_RV40) {
>                  h->pred4x4  [HOR_UP_PRED        ] = 
> ff_pred4x4_horizontal_up_8_mmxext;
>              }
> -            if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == 
> AV_CODEC_ID_H264) {
> -                if (chroma_format_idc <= 1) {
> -                    h->pred8x8[DC_PRED8x8       ] = ff_pred8x8_dc_8_mmxext;
> -                }
> -            }
>              if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
>                  h->pred8x8  [DC_PRED8x8         ] = 
> ff_pred8x8_dc_rv40_8_mmxext;
>                  h->pred4x4  [TM_VP8_PRED        ] = 
> ff_pred4x4_tm_vp8_8_mmxext;
> @@ -213,6 +208,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, 
> int codec_id,
>                  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;
> +                    h->pred8x8 [DC_PRED8x8    ] = ff_pred8x8_dc_8_sse2;
>                  }
>              }
>              if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
> --
> 2.43.0
>

Applied.

-- 
Zuxy
Beauty is truth,
While truth is beauty.
PGP KeyID: E8555ED6
_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to