[PR] avcodec/x86/vp8dsp: convert mmx to sse2 (PR #23950)
Schefkin via ffmpeg-devel <[email protected]> Wed, 29 Jul 2026 19:54:38 -0000
| Newsgroups | gmane.comp.video.ffmpeg.devel |
|---|---|
| Message-ID | <178535487923.51.846709540361542207@29965ddac10e> |
PR #23950 opened by Schefkin URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23950 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23950.patch This patch converts ff_vp8_idct_dc_add4uv_mmx to ff_vp8_idct_dc_add4uv_sse2. Here are the checkasm benchmark results: vp8_idct_dc_add4uv_c: 359.9 vp8_idct_dc_add4uv_mmx: 59.7 ( 6.02x) vp8_idct_dc_add4uv_sse2: 21.1 (17.06x) Signed-off-by: Aleksander Shveikin <[email protected]> >From e3138c9f4ae51e4c9d07128798ee34b394d9f7d8 Mon Sep 17 00:00:00 2001 From: Aleksander Shveikin <[email protected]> Date: Fri, 17 Jul 2026 13:53:14 +0300 Subject: [PATCH] avcodec/x86/vp8dsp: convert mmx to sse2 This patch converts ff_vp8_idct_dc_add4uv_mmx to ff_vp8_idct_dc_add4uv_sse2. Here are the checkasm benchmark results: vp8_idct_dc_add4uv_c: 359.9 vp8_idct_dc_add4uv_mmx: 59.7 ( 6.02x) vp8_idct_dc_add4uv_sse2: 21.1 (17.06x) Signed-off-by: Aleksander Shveikin <[email protected]> --- libavcodec/x86/vp8dsp.asm | 36 +++++++++++++++++------------------- libavcodec/x86/vp8dsp_init.c | 7 ++----- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/libavcodec/x86/vp8dsp.asm b/libavcodec/x86/vp8dsp.asm index 22356f687b..f53fda0ae1 100644 --- a/libavcodec/x86/vp8dsp.asm +++ b/libavcodec/x86/vp8dsp.asm @@ -937,42 +937,40 @@ cglobal vp8_idct_dc_add4y, 3, 3, 6, dst, block, stride ; void ff_vp8_idct_dc_add4uv_<opt>(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); ;----------------------------------------------------------------------------- -INIT_MMX mmx -cglobal vp8_idct_dc_add4uv, 3, 3, 0, dst, block, stride +INIT_XMM sse2 +cglobal vp8_idct_dc_add4uv, 3, 3, 6, dst, block, stride ; load data movd m0, [blockq+32*0] ; A movd m1, [blockq+32*2] ; C punpcklwd m0, [blockq+32*1] ; A B punpcklwd m1, [blockq+32*3] ; C D punpckldq m0, m1 ; A B C D - pxor m6, m6 + pxor m1, m1 ; calculate DC paddw m0, [pw_4] - movd [blockq+32*0], m6 - movd [blockq+32*1], m6 - movd [blockq+32*2], m6 - movd [blockq+32*3], m6 + movd [blockq+32*0], m1 + movd [blockq+32*1], m1 + movd [blockq+32*2], m1 + movd [blockq+32*3], m1 psraw m0, 3 - psubw m6, m0 + psubw m1, m0 packuswb m0, m0 - packuswb m6, m6 - punpcklbw m0, m0 ; AABBCCDD - punpcklbw m6, m6 ; AABBCCDD - movq m1, m0 - movq m7, m6 - punpcklbw m0, m0 ; AAAABBBB - punpckhbw m1, m1 ; CCCCDDDD - punpcklbw m6, m6 ; AAAABBBB - punpckhbw m7, m7 ; CCCCDDDD + packuswb m1, m1 + punpcklbw m0, m0 + punpcklbw m1, m1 + punpcklbw m0, m0 + punpcklbw m1, m1 ; add DC DEFINE_ARGS dst1, dst2, stride lea dst2q, [dst1q+strideq*2] - ADD_DC m0, m6, 0, mova + ADD_DC m0, m1, 0, movh lea dst1q, [dst1q+strideq*4] lea dst2q, [dst2q+strideq*4] - ADD_DC m1, m7, 0, mova + psrldq m0, 8 + psrldq m1, 8 + ADD_DC m0, m1, 0, movh RET ;----------------------------------------------------------------------------- diff --git a/libavcodec/x86/vp8dsp_init.c b/libavcodec/x86/vp8dsp_init.c index 828b038cdf..ded136d186 100644 --- a/libavcodec/x86/vp8dsp_init.c +++ b/libavcodec/x86/vp8dsp_init.c @@ -169,7 +169,7 @@ void ff_vp8_idct_dc_add_sse4(uint8_t *dst, int16_t block[16], ptrdiff_t stride); void ff_vp8_idct_dc_add4y_sse2(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); -void ff_vp8_idct_dc_add4uv_mmx(uint8_t *dst, int16_t block[2][16], +void ff_vp8_idct_dc_add4uv_sse2(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); void ff_vp8_luma_dc_wht_sse(int16_t block[4][4][16], int16_t dc[16]); void ff_vp8_idct_add_sse(uint8_t *dst, int16_t block[16], ptrdiff_t stride); @@ -272,10 +272,6 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext *c) { int cpu_flags = av_get_cpu_flags(); - if (EXTERNAL_MMX(cpu_flags)) { - c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmx; - } - if (EXTERNAL_SSE(cpu_flags)) { c->vp8_idct_add = ff_vp8_idct_add_sse; c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_sse; @@ -294,6 +290,7 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext *c) if (EXTERNAL_SSE2(cpu_flags)) { c->vp8_idct_dc_add = ff_vp8_idct_dc_add_sse2; c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_sse2; + c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_sse2; c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse2; -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]