PR #24071 opened by mkver URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24071 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24071.patch
>From 54cab38faba72ac1bc2ccb2defd21fb78d9b5934 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Mon, 10 Aug 2026 18:33:09 +0200 Subject: [PATCH 1/3] avutil/x86/tx_float: Don't use vextractf128 to write lower lane Just use vmovaps with an xmm register. This is faster on some systems and in any case saves codesize (by 688B). Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavutil/x86/tx_float.asm | 92 +++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/libavutil/x86/tx_float.asm b/libavutil/x86/tx_float.asm index 7dedf54312..4546a87fe3 100644 --- a/libavutil/x86/tx_float.asm +++ b/libavutil/x86/tx_float.asm @@ -732,15 +732,15 @@ SECTION .text unpcklpd m4, m4, m6 unpcklpd m5, m5, m7 - vextractf128 [outq + (0 + 0 + %1)*mmsize + %6 + 0], m0, 0 - vextractf128 [outq + (0 + 0 + %1)*mmsize + %6 + 16], m10, 0 - vextractf128 [outq + %3 + (0 + 0 + %1)*mmsize + %6 + 0], m1, 0 - vextractf128 [outq + %3 + (0 + 0 + %1)*mmsize + %6 + 16], m11, 0 + movaps [outq + (0 + 0 + %1)*mmsize + %6 + 0], xm0 + movaps [outq + (0 + 0 + %1)*mmsize + %6 + 16], xm10 + movaps [outq + %3 + (0 + 0 + %1)*mmsize + %6 + 0], xm1 + movaps [outq + %3 + (0 + 0 + %1)*mmsize + %6 + 16], xm11 - vextractf128 [outq + %4 + (0 + 0 + %1)*mmsize + %6 + 0], m4, 0 - vextractf128 [outq + %4 + (0 + 0 + %1)*mmsize + %6 + 16], m12, 0 - vextractf128 [outq + %5 + (0 + 0 + %1)*mmsize + %6 + 0], m5, 0 - vextractf128 [outq + %5 + (0 + 0 + %1)*mmsize + %6 + 16], m13, 0 + movaps [outq + %4 + (0 + 0 + %1)*mmsize + %6 + 0], xm4 + movaps [outq + %4 + (0 + 0 + %1)*mmsize + %6 + 16], xm12 + movaps [outq + %5 + (0 + 0 + %1)*mmsize + %6 + 0], xm5 + movaps [outq + %5 + (0 + 0 + %1)*mmsize + %6 + 16], xm13 vperm2f128 m10, m10, m0, 0x13 vperm2f128 m11, m11, m1, 0x13 @@ -780,23 +780,23 @@ SECTION .text unpckhpd m4, m4, m6 unpckhpd m5, m5, m7 - vextractf128 [outq + (2 + 0 + %1)*mmsize + %6 + 0], m8, 0 - vextractf128 [outq + (2 + 0 + %1)*mmsize + %6 + 16], m0, 0 + movaps [outq + (2 + 0 + %1)*mmsize + %6 + 0], xm8 + movaps [outq + (2 + 0 + %1)*mmsize + %6 + 16], xm0 vextractf128 [outq + (2 + 1 + %1)*mmsize + %6 + 0], m8, 1 vextractf128 [outq + (2 + 1 + %1)*mmsize + %6 + 16], m0, 1 - vextractf128 [outq + %3 + (2 + 0 + %1)*mmsize + %6 + 0], m9, 0 - vextractf128 [outq + %3 + (2 + 0 + %1)*mmsize + %6 + 16], m1, 0 + movaps [outq + %3 + (2 + 0 + %1)*mmsize + %6 + 0], xm9 + movaps [outq + %3 + (2 + 0 + %1)*mmsize + %6 + 16], xm1 vextractf128 [outq + %3 + (2 + 1 + %1)*mmsize + %6 + 0], m9, 1 vextractf128 [outq + %3 + (2 + 1 + %1)*mmsize + %6 + 16], m1, 1 - vextractf128 [outq + %4 + (2 + 0 + %1)*mmsize + %6 + 0], m10, 0 - vextractf128 [outq + %4 + (2 + 0 + %1)*mmsize + %6 + 16], m4, 0 + movaps [outq + %4 + (2 + 0 + %1)*mmsize + %6 + 0], xm10 + movaps [outq + %4 + (2 + 0 + %1)*mmsize + %6 + 16], xm4 vextractf128 [outq + %4 + (2 + 1 + %1)*mmsize + %6 + 0], m10, 1 vextractf128 [outq + %4 + (2 + 1 + %1)*mmsize + %6 + 16], m4, 1 - vextractf128 [outq + %5 + (2 + 0 + %1)*mmsize + %6 + 0], m11, 0 - vextractf128 [outq + %5 + (2 + 0 + %1)*mmsize + %6 + 16], m5, 0 + movaps [outq + %5 + (2 + 0 + %1)*mmsize + %6 + 0], xm11 + movaps [outq + %5 + (2 + 0 + %1)*mmsize + %6 + 16], xm5 vextractf128 [outq + %5 + (2 + 1 + %1)*mmsize + %6 + 0], m11, 1 vextractf128 [outq + %5 + (2 + 1 + %1)*mmsize + %6 + 16], m5, 1 %endmacro @@ -924,8 +924,8 @@ cglobal fft8_float, 4, 4, 4, ctx, out, in, tmp unpckhpd m0, m0, m1 ; Around 2% faster than 2x vperm2f128 + 2x movapd - vextractf128 [outq + 16*0], m2, 0 - vextractf128 [outq + 16*1], m0, 0 + movaps [outq + 16*0], xm2 + movaps [outq + 16*1], xm0 vextractf128 [outq + 16*2], m2, 1 vextractf128 [outq + 16*3], m0, 1 @@ -969,12 +969,12 @@ cglobal fft16_float, 4, 4, 8, ctx, out, in, tmp unpckhpd m1, m1, m3 unpckhpd m0, m0, m2 - vextractf128 [outq + 16*0], m4, 0 - vextractf128 [outq + 16*1], m0, 0 + movaps [outq + 16*0], xm4 + movaps [outq + 16*1], xm0 vextractf128 [outq + 16*2], m4, 1 vextractf128 [outq + 16*3], m0, 1 - vextractf128 [outq + 16*4], m5, 0 - vextractf128 [outq + 16*5], m1, 0 + movaps [outq + 16*4], xm5 + movaps [outq + 16*5], xm1 vextractf128 [outq + 16*6], m5, 1 vextractf128 [outq + 16*7], m1, 1 @@ -1044,21 +1044,21 @@ cglobal fft32_float, 4, 4, 16, ctx, out, in, tmp unpckhpd m0, m0, m2 unpckhpd m4, m4, m6 - vextractf128 [outq + 16* 0], m8, 0 - vextractf128 [outq + 16* 1], m0, 0 + movaps [outq + 16* 0], xm8 + movaps [outq + 16* 1], xm0 vextractf128 [outq + 16* 2], m8, 1 vextractf128 [outq + 16* 3], m0, 1 - vextractf128 [outq + 16* 4], m9, 0 - vextractf128 [outq + 16* 5], m1, 0 + movaps [outq + 16* 4], xm9 + movaps [outq + 16* 5], xm1 vextractf128 [outq + 16* 6], m9, 1 vextractf128 [outq + 16* 7], m1, 1 - vextractf128 [outq + 16* 8], m11, 0 - vextractf128 [outq + 16* 9], m4, 0 + movaps [outq + 16* 8], xm11 + movaps [outq + 16* 9], xm4 vextractf128 [outq + 16*10], m11, 1 vextractf128 [outq + 16*11], m4, 1 - vextractf128 [outq + 16*12], m10, 0 - vextractf128 [outq + 16*13], m5, 0 + movaps [outq + 16*12], xm10 + movaps [outq + 16*13], xm5 vextractf128 [outq + 16*14], m10, 1 vextractf128 [outq + 16*15], m5, 1 @@ -1430,21 +1430,21 @@ FFT_SPLIT_RADIX_DEF 131072 unpckhpd tx1_e0, tx1_e0, tx1_o0 unpckhpd tx2_e0, tx2_e0, tx2_o0 - vextractf128 [outq + 0*mmsize + 0], tmp1, 0 - vextractf128 [outq + 0*mmsize + 16], m0, 0 - vextractf128 [outq + 4*mmsize + 0], tmp2, 0 - vextractf128 [outq + 4*mmsize + 16], m1, 0 + movaps [outq + 0*mmsize + 0], xmm %+ tmp1 + movaps [outq + 0*mmsize + 16], xm0 + movaps [outq + 4*mmsize + 0], xmm %+ tmp2 + movaps [outq + 4*mmsize + 16], xm1 - vextractf128 [outq + 8*mmsize + 0], tw_o, 0 - vextractf128 [outq + 8*mmsize + 16], tx1_e0, 0 + movaps [outq + 8*mmsize + 0], xmm %+ tw_o + movaps [outq + 8*mmsize + 16], xmm %+ tx1_e0 vextractf128 [outq + 9*mmsize + 0], tw_o, 1 vextractf128 [outq + 9*mmsize + 16], tx1_e0, 1 vperm2f128 tmp1, tmp1, m0, 0x31 vperm2f128 tmp2, tmp2, m1, 0x31 - vextractf128 [outq + 12*mmsize + 0], tw_e, 0 - vextractf128 [outq + 12*mmsize + 16], tx2_e0, 0 + movaps [outq + 12*mmsize + 0], xmm %+ tw_e + movaps [outq + 12*mmsize + 16], xmm %+ tx2_e0 vextractf128 [outq + 13*mmsize + 0], tw_e, 1 vextractf128 [outq + 13*mmsize + 16], tx2_e0, 1 @@ -1471,23 +1471,23 @@ FFT_SPLIT_RADIX_DEF 131072 unpckhpd tx1_e1, tx1_e1, tx1_o1 unpckhpd tx2_e1, tx2_e1, tx2_o1 - vextractf128 [outq + 2*mmsize + 0], tmp1, 0 - vextractf128 [outq + 2*mmsize + 16], m0, 0 + movaps [outq + 2*mmsize + 0], xmm %+ tmp1 + movaps [outq + 2*mmsize + 16], xm0 vextractf128 [outq + 3*mmsize + 0], tmp1, 1 vextractf128 [outq + 3*mmsize + 16], m0, 1 - vextractf128 [outq + 6*mmsize + 0], tmp2, 0 - vextractf128 [outq + 6*mmsize + 16], m2, 0 + movaps [outq + 6*mmsize + 0], xmm %+ tmp2 + movaps [outq + 6*mmsize + 16], xm2 vextractf128 [outq + 7*mmsize + 0], tmp2, 1 vextractf128 [outq + 7*mmsize + 16], m2, 1 - vextractf128 [outq + 10*mmsize + 0], tw_e, 0 - vextractf128 [outq + 10*mmsize + 16], tx1_e1, 0 + movaps [outq + 10*mmsize + 0], xmm %+ tw_e + movaps [outq + 10*mmsize + 16], xmm %+ tx1_e1 vextractf128 [outq + 11*mmsize + 0], tw_e, 1 vextractf128 [outq + 11*mmsize + 16], tx1_e1, 1 - vextractf128 [outq + 14*mmsize + 0], tw_o, 0 - vextractf128 [outq + 14*mmsize + 16], tx2_e1, 0 + movaps [outq + 14*mmsize + 0], xmm %+ tw_o + movaps [outq + 14*mmsize + 16], xmm %+ tx2_e1 vextractf128 [outq + 15*mmsize + 0], tw_o, 1 vextractf128 [outq + 15*mmsize + 16], tx2_e1, 1 -- 2.52.0 >From 29e47b7d9b9b8c0532bb568582f60dff507320a8 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Mon, 10 Aug 2026 19:21:04 +0200 Subject: [PATCH 2/3] avcodec/x86/dct32: Don't use v{extract,insert}f128 for lower lane One can just access the lower lane as an ordinary xmm register. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/dct32.asm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/x86/dct32.asm b/libavcodec/x86/dct32.asm index 37fba51543..763cf5056a 100644 --- a/libavcodec/x86/dct32.asm +++ b/libavcodec/x86/dct32.asm @@ -194,15 +194,15 @@ SECTION .text ; void ff_dct32_float_avx(FFTSample *out, const FFTSample *in) cglobal dct32_float, 2,3,8, out, in, tmp ; pass 1 + vmovaps xm5, [inq+112] vmovaps m4, [inq+0] vinsertf128 m5, m5, [inq+96], 1 - vinsertf128 m5, m5, [inq+112], 0 vshufps m5, m5, m5, 0x1b BUTTERFLY m4, m5, [ps_cos_vec], m6 + vmovaps xm6, [inq+48] vmovaps m2, [inq+64] vinsertf128 m6, m6, [inq+32], 1 - vinsertf128 m6, m6, [inq+48], 0 vshufps m6, m6, m6, 0x1b BUTTERFLY m2, m6, [ps_cos_vec+32], m0 @@ -249,10 +249,10 @@ cglobal dct32_float, 2,3,8, out, in, tmp vmovaps [outq], m3 vextractf128 [outq+64], m5, 1 - vextractf128 [outq+32], m5, 0 + vmovaps [outq+32], xm5 vextractf128 [outq+80], m4, 1 - vextractf128 [outq+48], m4, 0 + vmovaps [outq+48], xm4 vperm2f128 m0, m1, m1, 0x31 vmovaps [outq+96], m1 -- 2.52.0 >From 03dc244a693ce639cebf82f7bae112fb75580919 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Tue, 11 Aug 2026 04:30:42 +0200 Subject: [PATCH 3/3] avcodec/x86/dct32: Don't use legacy SSE in AVX function Use VEX encoding instead. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/dct32.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/x86/dct32.asm b/libavcodec/x86/dct32.asm index 763cf5056a..e19b4571f4 100644 --- a/libavcodec/x86/dct32.asm +++ b/libavcodec/x86/dct32.asm @@ -260,7 +260,7 @@ cglobal dct32_float, 2,3,8, out, in, tmp vzeroupper ; pass 6, no SIMD... -INIT_XMM +INIT_XMM avx PASS6_AND_PERMUTE RET %endif -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
