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]

Reply via email to