PR #22834 opened by mkver
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22834
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22834.patch

This allows to avoid the stack for the 8 bit simple IDCT;
for the other IDCTs, it avoids storing and restoring two
xmm registers on Win64.


>From 0a2892313caf7a8d4ed026c61b7fbbea984273aa Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Wed, 15 Apr 2026 22:53:19 +0200
Subject: [PATCH] avcodec/simple_idct10_template: Reduce amount of registers
 used

This allows to avoid the stack for the 8 bit simple IDCT;
for the other IDCTs, it avoids storing and restoring two
xmm registers on Win64.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/proresdsp.asm              |  2 +-
 libavcodec/x86/simple_idct10.asm          | 14 ++---
 libavcodec/x86/simple_idct10_template.asm | 71 ++++++++++++-----------
 3 files changed, 44 insertions(+), 43 deletions(-)

diff --git a/libavcodec/x86/proresdsp.asm b/libavcodec/x86/proresdsp.asm
index 65c9fad51c..37aa103d07 100644
--- a/libavcodec/x86/proresdsp.asm
+++ b/libavcodec/x86/proresdsp.asm
@@ -53,7 +53,7 @@ SECTION .text
 define_constants _hi
 
 %macro idct_fn 0
-cglobal prores_idct_put_10, 4, 4, 15, pixels, lsize, block, qmat
+cglobal prores_idct_put_10, 4, 4, 14, pixels, lsize, block, qmat
     IDCT_FN    pw_1, 15, pw_88, 18, "put", pw_4, pw_1019, r3
     RET
 %endmacro
diff --git a/libavcodec/x86/simple_idct10.asm b/libavcodec/x86/simple_idct10.asm
index 069bb61378..83fe3460e0 100644
--- a/libavcodec/x86/simple_idct10.asm
+++ b/libavcodec/x86/simple_idct10.asm
@@ -120,11 +120,11 @@ SECTION .text
 
 define_constants _lo
 
-cglobal simple_idct8, 1, 1, 16, 32, block
+cglobal simple_idct8, 1, 1, 16, block
     IDCT_FN    "", 11, pw_32, 20, "store"
 RET
 
-cglobal simple_idct8_put, 3, 4, 16, 32, pixels, lsize, block
+cglobal simple_idct8_put, 3, 4, 16, pixels, lsize, block
     IDCT_FN    "", 11, pw_32, 20
     lea       r3, [3*lsizeq]
     lea       r2, [pixelsq + r3]
@@ -135,7 +135,7 @@ cglobal simple_idct8_put, 3, 4, 16, 32, pixels, lsize, block
     STORE_HI_LO PASS8ROWS(pixelsq, r2, lsizeq, r3), m8, m1, m4, m9
 RET
 
-cglobal simple_idct8_add, 3, 4, 16, 32, pixels, lsize, block
+cglobal simple_idct8_add, 3, 4, 16, pixels, lsize, block
     IDCT_FN    "", 11, pw_32, 20
     lea r2, [3*lsizeq]
     %if cpuflag(sse4)
@@ -173,21 +173,21 @@ RET
 
 define_constants _hi
 
-cglobal simple_idct10, 1, 1, 16, block
+cglobal simple_idct10, 1, 1, 14, block
     IDCT_FN    "", 12, "", 19, "store"
     RET
 
-cglobal simple_idct10_put, 3, 3, 16, pixels, lsize, block
+cglobal simple_idct10_put, 3, 3, 14, pixels, lsize, block
     IDCT_FN    "", 12, "", 19, "put", 0, pw_1023
     RET
 
-cglobal simple_idct12, 1, 1, 16, block
+cglobal simple_idct12, 1, 1, 14, block
     ; coeffs are already 15bits, adding the offset would cause
     ; overflow in the input
     IDCT_FN    "", 15, pw_2, 16, "store"
     RET
 
-cglobal simple_idct12_put, 3, 3, 16, pixels, lsize, block
+cglobal simple_idct12_put, 3, 3, 14, pixels, lsize, block
     ; range isn't known, so the C simple_idct range is used
     ; Also, using a bias on input overflows, so use the bias
     ; on output of the first butterfly instead
diff --git a/libavcodec/x86/simple_idct10_template.asm 
b/libavcodec/x86/simple_idct10_template.asm
index 0d04a9818a..1c9575ef00 100644
--- a/libavcodec/x86/simple_idct10_template.asm
+++ b/libavcodec/x86/simple_idct10_template.asm
@@ -81,7 +81,7 @@
     ; a2 -= W6 * row[2];
     ; a3 -= W2 * row[2];
 %ifstr %1
-    mova        m15, [pd_round_ %+ %2]
+    mova        m11, [pd_round_ %+ %2]
 %else
     paddw       m10, [%1]
 %endif
@@ -96,14 +96,14 @@
     pmaddwd     m1, [w4_plus_w2]
 %ifstr %1
     ; Adding 1<<(%2-1) for >=15 bits values
-    paddd       m2, m15
-    paddd       m3, m15
-    paddd       m4, m15
-    paddd       m5, m15
-    paddd       m6, m15
-    paddd       m7, m15
-    paddd       m0, m15
-    paddd       m1, m15
+    paddd       m2, m11
+    paddd       m3, m11
+    paddd       m4, m11
+    paddd       m5, m11
+    paddd       m6, m11
+    paddd       m7, m11
+    paddd       m0, m11
+    paddd       m1, m11
 %endif
 
     ; a0: -1*row[0]-1*row[2]
@@ -141,7 +141,7 @@
     mova        m10,[blockq+ 16]       ; { row[1] }[0-7]
     mova        m8, [blockq+ 48]       ; { row[3] }[0-7]
     mova        m13,[blockq+ 80]       ; { row[5] }[0-7]
-    mova        m14,[blockq+112]       ; { row[7] }[0-7]
+    mova        m11,[blockq+112]       ; { row[7] }[0-7]
     mova   [blockq+ 16], m1
     mova   [blockq+ 48], m3
     mova   [blockq+ 80], m5
@@ -150,7 +150,7 @@
     pmullw      m10,[%3+ 16]
     pmullw      m8, [%3+ 48]
     pmullw      m13,[%3+ 80]
-    pmullw      m14,[%3+112]
+    pmullw      m11,[%3+112]
 %endif
 
     ; b0 = MUL(W1, row[1]);
@@ -184,7 +184,7 @@
     ; MAC(b2,  W3, row[7]);
     ; MAC(b3,  W3, row[5]);
     ; MAC(b3, -W1, row[7]);
-    SBUTTERFLY3 wd,  8,  9, 13, 14 ; { row[5], row[7] }[0-3]/[4-7]
+    SBUTTERFLY3 wd,  8,  9, 13, 11 ; { row[5], row[7] }[0-3]/[4-7]
 
     ; b0: -1*row[5]+1*row[7]
     ; b1: -1*row[5]+1*row[7]
@@ -270,33 +270,34 @@
     por      m1, [blockq+112]       ; { row[7] }[0-7]
     pxor     m2,  m2
     pcmpeqw  m1,  m2
-    psllw    m2,  m10, 3
-    pand     m2,  m1
+    psllw   m15,  m10, 3
+    pand    m15,  m1
+%if avx_enabled
     pcmpeqb  m3,  m3
-    pxor     m1,  m3
-    mova    [rsp],    m1
-    mova    [rsp+16], m2
+    pxor    m14,  m1, m3
+%else
+    pcmpeqb m14, m14
+    pxor    m14,  m1
+%endif
 
     IDCT_1D  %1,  %2
 
-    mova     m5, [rsp]
-    mova     m6, [rsp+16]
-    pand     m8,  m5
-    por      m8,  m6
-    pand     m0,  m5
-    por      m0,  m6
-    pand     m1,  m5
-    por      m1,  m6
-    pand     m2,  m5
-    por      m2,  m6
-    pand     m4,  m5
-    por      m4,  m6
-    pand     m11, m5
-    por      m11, m6
-    pand     m9,  m5
-    por      m9,  m6
-    pand     m10, m5
-    por      m10, m6
+    pand     m8,  m14
+    pand     m0,  m14
+    por      m8,  m15
+    por      m0,  m15
+    pand     m1,  m14
+    pand     m2,  m14
+    por      m1,  m15
+    por      m2,  m15
+    pand     m4,  m14
+    pand     m11, m14
+    por      m4,  m15
+    por      m11, m15
+    pand     m9,  m14
+    pand     m10, m14
+    por      m9,  m15
+    por      m10, m15
 %else
     IDCT_1D     %1, %2
 %endif
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to