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 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
