[PR] av{codec,util}/x86: Don't access lower lane via v{extract,insert}f128 (PR #24071)

mkver via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178641614557.59.8289344149070915895@29965ddac10e>
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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.