PR #24159 opened by mkver URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24159 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24159.patch
>From b213107c054fc5a5302e23f06fd6226890e714bd Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Sat, 15 Aug 2026 09:48:51 +0200 Subject: [PATCH 1/2] tests/checkasm/vp8dsp: Don't use declare_func_emms unnecessarily Possible since b9161b93b5c88bd2f6f110bb527336af9a4c0cae. Signed-off-by: Andreas Rheinhardt <[email protected]> --- tests/checkasm/vp8dsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/checkasm/vp8dsp.c b/tests/checkasm/vp8dsp.c index 3081820c59..4a7f71e856 100644 --- a/tests/checkasm/vp8dsp.c +++ b/tests/checkasm/vp8dsp.c @@ -163,7 +163,7 @@ static void check_idct_dc4(VP8DSPContext *d, bool is_vp7) LOCAL_ALIGNED_16(int16_t, subcoef0, [4], [4 * 4]); LOCAL_ALIGNED_16(int16_t, subcoef1, [4], [4 * 4]); int i, chroma; - declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); + declare_func(void, uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); for (chroma = 0; chroma <= 1; chroma++) { void (*idct4dc)(uint8_t *, int16_t[4][16], ptrdiff_t) = chroma ? d->vp8_idct_dc_add4uv : d->vp8_idct_dc_add4y; -- 2.52.0 >From 501783fdd000eb047d9b567f557e839561a08973 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Sat, 15 Aug 2026 09:58:19 +0200 Subject: [PATCH 2/2] avcodec/x86/vp8dsp: Port ff_vp8_luma_dc_wht_sse to xmm regs Some parts of it benefit from wider registers: vp8_luma_dc_wht_c: 22.7 vp8_luma_dc_wht_sse: 14.7 ( 1.55x) vp8_luma_dc_wht_sse2: 13.2 ( 1.73x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/vp8dsp.asm | 130 ++++++++++++++++++++++++----------- libavcodec/x86/vp8dsp_init.c | 5 +- tests/checkasm/vp8dsp.c | 2 +- 3 files changed, 92 insertions(+), 45 deletions(-) diff --git a/libavcodec/x86/vp8dsp.asm b/libavcodec/x86/vp8dsp.asm index f53fda0ae1..825e64880f 100644 --- a/libavcodec/x86/vp8dsp.asm +++ b/libavcodec/x86/vp8dsp.asm @@ -150,8 +150,8 @@ filter_h2_shuf: db 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8 pw_20091: times 4 dw 20091 pw_17734: times 4 dw 17734 +pw_3_3_0_0: times 2 dw 3, 3, 0, 0 -cextern pw_3 cextern pw_4 cextern pw_64 cextern pw_256 @@ -1041,50 +1041,96 @@ cglobal vp8_idct_add, 3, 3, 0, dst, block, stride ; void ff_vp8_luma_dc_wht(int16_t block[4][4][16], int16_t dc[16]) ;----------------------------------------------------------------------------- -%macro SCATTER_WHT 3 - movd dc1d, m%1 - movd dc2d, m%2 - mov [blockq+2*16*(0+%3)], dc1w - mov [blockq+2*16*(1+%3)], dc2w - shr dc1d, 16 - shr dc2d, 16 - psrlq m%1, 32 - psrlq m%2, 32 - mov [blockq+2*16*(4+%3)], dc1w - mov [blockq+2*16*(5+%3)], dc2w - movd dc1d, m%1 - movd dc2d, m%2 - mov [blockq+2*16*(8+%3)], dc1w - mov [blockq+2*16*(9+%3)], dc2w - shr dc1d, 16 - shr dc2d, 16 - mov [blockq+2*16*(12+%3)], dc1w - mov [blockq+2*16*(13+%3)], dc2w -%endmacro - -%macro HADAMARD4_1D 4 - SUMSUB_BADC w, %2, %1, %4, %3 - SUMSUB_BADC w, %4, %2, %3, %1 - SWAP %1, %4, %3 -%endmacro - -INIT_MMX sse -cglobal vp8_luma_dc_wht, 2, 3, 0, block, dc1, dc2 +INIT_XMM sse2 +cglobal vp8_luma_dc_wht, 2, 3+2*ARCH_X86_64, 5, block, dc1, dc2, dc3, dc4 movq m0, [dc1q] movq m1, [dc1q+8] movq m2, [dc1q+16] movq m3, [dc1q+24] - xorps xmm0, xmm0 - movaps [dc1q+ 0], xmm0 - movaps [dc1q+16], xmm0 - HADAMARD4_1D 0, 1, 2, 3 - TRANSPOSE4x4W 0, 1, 2, 3, 4 - paddw m0, [pw_3] - HADAMARD4_1D 0, 1, 2, 3 - psraw m0, 3 - psraw m1, 3 + xorps m4, m4 + + movaps [dc1q+ 0], m4 + movaps [dc1q+16], m4 + + SUMSUB_BADC w, 3, 0, 2, 1, 4 + ; t0 = m3, t1 = m2, t2 = m1, t3 = m0 + + punpcklwd m3, m0 + punpcklwd m2, m1 + + SUMSUB_BA w, 2, 3, 4 + + punpcklqdq m0, m2, m3 + shufps m2, m3, q2323 + ; Let i,j be dc[i*4+j]. Then + ; m0: 0,0; 1,0; 0,1; 1,1; 2,0; 3,0; 2,1; 3,1 + ; m2: 0,3; 1,3; 0,2; 1,2; 2,3; 3,3; 2,2; 3,2 + paddw m0, [pw_3_3_0_0] + SUMSUB_BA w, 2, 0, 3 + ; m2: t0[0] t0[1] t1[0] t1[1] t0[2] t0[3] t1[2] t1[3] + ; m0: t3[0] t3[1] t2[0] t2[1] t3[2] t3[3] t2[2] t2[3] + shufps m1, m2, m0, q2020 + shufps m2, m0, q3131 + ; m1: t0[0] t0[1] t0[2] t0[3] t3[0] t3[1] t3[2] t3[3] + ; m2: t1[0] t1[1] t1[2] t1[3] t2[0] t2[1] t2[2] t2[3] + SUMSUB_BA w, 2, 1, 4 psraw m2, 3 - psraw m3, 3 - SCATTER_WHT 0, 1, 0 - SCATTER_WHT 2, 3, 2 + psraw m1, 3 +%if ARCH_X86_64 + movq dc1q, m2 + punpckhqdq m2, m2 + mov [blockq], dc1w + movq dc2q, m2 + movq dc3q, m1 + shr dc1q, 16 + mov [blockq+32], dc2w + punpckhqdq m1, m1 + movq dc4q, m1 + mov [blockq+64], dc3w + shr dc2q, 16 + mov [blockq+96], dc4w + shr dc3q, 16 + shr dc4q, 16 + %assign i 1 + %rep 3 + %if i == 1 + %define SHR(dc) shr dc %+ q, 16 + %elif i == 2 + %define SHR(dc) shr dc %+ d, 16 + %else + %define SHR(dc) + %endif + mov [blockq+32*(4*i+0)], dc1w + SHR(dc1) + mov [blockq+32*(4*i+1)], dc2w + SHR(dc2) + mov [blockq+32*(4*i+2)], dc3w + SHR(dc3) + mov [blockq+32*(4*i+3)], dc4w + SHR(dc4) + %assign i i+1 + %endrep +%else + %assign i 0 + %assign offset 0 + %rep 4 + %if i == 2 + %assign offset 1 + %endif + movd dc1d, m2 + movd dc2d, m1 + mov [blockq+2*16* offset ], dc1w + mov [blockq+2*16*(offset+2)], dc2w + shr dc1d, 16 + shr dc2d, 16 + %if i != 3 + psrldq m2, 4 + psrldq m1, 4 + %endif + mov [blockq+2*16*(offset+4)], dc1w + mov [blockq+2*16*(offset+6)], dc2w + %assign i i+1 + %assign offset offset+8 + %endrep +%endif RET diff --git a/libavcodec/x86/vp8dsp_init.c b/libavcodec/x86/vp8dsp_init.c index ded136d186..a12e64c5ce 100644 --- a/libavcodec/x86/vp8dsp_init.c +++ b/libavcodec/x86/vp8dsp_init.c @@ -171,7 +171,7 @@ void ff_vp8_idct_dc_add4y_sse2(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride); 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_luma_dc_wht_sse2(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); #define DECLARE_LOOP_FILTER(NAME) \ @@ -274,7 +274,6 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext *c) 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; } if (EXTERNAL_SSE2_SLOW(cpu_flags)) { @@ -285,6 +284,8 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext *c) c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_sse2; c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_sse2; + + c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_sse2; } if (EXTERNAL_SSE2(cpu_flags)) { diff --git a/tests/checkasm/vp8dsp.c b/tests/checkasm/vp8dsp.c index 4a7f71e856..0df425a524 100644 --- a/tests/checkasm/vp8dsp.c +++ b/tests/checkasm/vp8dsp.c @@ -203,7 +203,7 @@ static void check_luma_dc_wht(VP8DSPContext *d, bool is_vp7) LOCAL_ALIGNED_16(int16_t, block1, [4], [4][16]); int dc_only; int blockx, blocky; - declare_func_emms(AV_CPU_FLAG_MMX, void, int16_t block[4][4][16], int16_t dc[16]); + declare_func(void, int16_t block[4][4][16], int16_t dc[16]); for (blocky = 0; blocky < 4; blocky++) { for (blockx = 0; blockx < 4; blockx++) { -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
