This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit a6f573a1dbfc6861a96f3a453805398f86f0e7a9
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Aug 24 01:28:59 2026 +0200
Commit:     Andreas Rheinhardt <[email protected]>
CommitDate: Thu Aug 27 00:51:10 2026 +0200

    avcodec/x86/h264_deblock: Avoid mmx register in deblock_h_luma_8
    
    Old benchmarks:
      h_loop_filter_luma_8bpp_c:        41.1
      h_loop_filter_luma_8bpp_sse2:     60.6 ( 0.68x)
      h_loop_filter_luma_8bpp_avx:      60.4 ( 0.68x)
    
    New benchmarks:
      h_loop_filter_luma_8bpp_c:        42.0
      h_loop_filter_luma_8bpp_sse2:     48.1 ( 0.87x)
      h_loop_filter_luma_8bpp_avx:      48.3 ( 0.87x)
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 190 ++++++++++++++++++----------------------
 tests/checkasm/h264dsp.c        |   4 +-
 2 files changed, 86 insertions(+), 108 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index 303b2aed66..717349b931 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -58,42 +58,85 @@ cextern pb_3
     movd       %10, m6
 %endmacro
 
-%macro SBUTTERFLY3 4
-    punpckh%1  %4, %2, %3
-    punpckl%1  %2, %3
-%endmacro
-
-; in: 8 rows of 8 (only the middle 6 pels are used) in %1..%8
-; out: 6 rows of 8 in [%9+0*16] .. [%9+5*16]
-%macro TRANSPOSE6x8_MEM 9
-    RESET_MM_PERMUTATION
-    movq  m0, %1
-    movq  m1, %2
-    movq  m2, %3
-    movq  m3, %4
-    movq  m4, %5
-    movq  m5, %6
-    movq  m6, %7
-    SBUTTERFLY bw, 0, 1, 7
-    SBUTTERFLY bw, 2, 3, 7
-    SBUTTERFLY bw, 4, 5, 7
-    movq  [%9+0x10], m3
-    SBUTTERFLY3 bw, m6, %8, m7
-    SBUTTERFLY wd, 0, 2, 3
-    SBUTTERFLY wd, 4, 6, 3
-    punpckhdq m0, m4
-    movq  [%9+0x00], m0
-    SBUTTERFLY3 wd, m1, [%9+0x10], m3
-    SBUTTERFLY wd, 5, 7, 0
-    SBUTTERFLY dq, 1, 5, 0
-    SBUTTERFLY dq, 2, 6, 0
-    punpckldq m3, m7
-    movq  [%9+0x10], m2
-    movq  [%9+0x20], m6
-    movq  [%9+0x30], m1
-    movq  [%9+0x40], m5
-    movq  [%9+0x50], m3
-    RESET_MM_PERMUTATION
+; Transpose 16 rows of six or eight pixels.
+; %1: 6 or 8; for 6 only the middle 6 pels are used
+; %2: center of the output buffer
+; %3-%7: base, base3, stride, stride3, reg for base+8*stride
+; clobbers base3
+%macro TRANSPOSE6OR8x16_MEM 7
+    movq              m0, [%3]
+    movq              m1, [%3+%5]
+    movq              m2, [%3+2*%5]
+    movq              m3, [%4]
+    movq              m4, [%4+%5]
+    lea               %7, [%3 +%5*8]
+    movq              m5, [%4+2*%5]
+    punpcklbw         m0, m1
+    movq              m6, [%4+%6]
+    punpcklbw         m2, m3
+    movq              m7, [%4+4*%5]
+    punpcklbw         m4, m5
+    lea               %4, [%4+8*%5]
+    movq              m1, [%7]
+    SBUTTERFLY        wd, 0, 2, 5
+    movq              m3, [%7+%5]
+    punpcklbw         m6, m7
+    movq              m5, [%7+2*%5]
+    SBUTTERFLY        wd, 4, 6, 7
+    movq              m7, [%4]
+    punpcklbw         m1, m3
+    SBUTTERFLY        dq, 0, 4, 3
+%if ARCH_X86_32 && %1 == 8
+    movq         [%2-64], m0
+%endif
+    movq              m3, [%4+%5]
+    punpcklbw         m5, m7
+%if ARCH_X86_32
+    movhps       [%2-48], m0
+%endif
+    SBUTTERFLY        dq, 2, 6, 7
+    movq              m7, [%4+2*%5]
+%if ARCH_X86_64
+    SWAP               0, 8
+%endif
+    SBUTTERFLY        wd, 1, 5, 0
+    movq              m0, [%4+%6]
+    punpcklbw         m3, m7
+    movq              m7, [%4+4*%5]
+    punpcklbw         m0, m7
+    SBUTTERFLY        wd, 3, 0, 7
+    SBUTTERFLY        dq, 1, 3, 7
+%if ARCH_X86_32
+%if %1 == 8
+    movq         [%2-56], m1
+%endif
+    movhps       [%2-40], m1
+%endif
+    SBUTTERFLY       qdq, 4, 3, 7
+    mova         [%2-32], m4
+    mova         [%2-16], m3
+    SBUTTERFLY        dq, 5, 0, 7
+    SBUTTERFLY       qdq, 2, 5, 7
+    mova            [%2], m2
+    mova         [%2+16], m5
+%if ARCH_X86_64
+%if %1 == 8
+    SBUTTERFLY       qdq, 8, 1, 7
+    mova         [%2-48], m1
+    mova         [%2-64], m8
+%else
+    punpckhqdq        m8, m1
+    mova         [%2-48], m8
+%endif
+%endif
+%if %1 == 8
+    SBUTTERFLY       qdq, 6, 0, 7
+    mova         [%2+32], m6
+    mova         [%2+48], m0
+%else
+    punpcklqdq        m6, m0
+    mova         [%2+32], m6
+%endif
 %endmacro
 
 ; out: %4 = |%1-%2|>%3
@@ -286,7 +329,7 @@ cglobal deblock_v_luma_8, 5,5,10, 32*ARCH_X86_32, pix_, 
stride_, alpha_, beta_,
 ;                        int8_t *tc0)
 ;-----------------------------------------------------------------------------
 %if ARCH_X86_64
-cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64, pix0, stride0, alpha, beta, 
tc0, pix3, pix, stride, stride3
+cglobal deblock_h_luma_8, 5,9,9,0x60+16*WIN64, pix0, stride0, alpha, beta, 
tc0, pix3, pix, stride, stride3
     lea         stride3q,  [stride0q*3]
     lea             pixq,  [pix0q-4]
     mov          strideq,  stride0q
@@ -306,12 +349,7 @@ cglobal deblock_h_luma_8, 2,4,8,0x60+12, pix, stride, 
pix3, stride3
 %define pix0q pixq
 %endif
 
-    INIT_MMX cpuname
-    ; transpose 6x16 -> tmp space
-    TRANSPOSE6x8_MEM  PASS8ROWS(pixq, pix3q, stride0q, stride3q), pix_tmp
-    lea            pix0q, [pixq+stride0q*8]
-    lea            pix3q, [pix3q+stride0q*8]
-    TRANSPOSE6x8_MEM  PASS8ROWS(pix0q, pix3q, stride0q, stride3q), pix_tmp+8
+    TRANSPOSE6OR8x16_MEM 6, pix_tmp+0x30, pixq, pix3q, stride0q, stride3q, 
pix0q
 
     ; vertical filter
     lea            pix0q, [pix_tmp+0x30]
@@ -331,6 +369,8 @@ cglobal deblock_h_luma_8, 2,4,8,0x60+12, pix, stride, pix3, 
stride3
 %endif
     call   deblock_v_luma_8
 
+    RESET_MM_PERMUTATION
+
 %if ARCH_X86_64
     add             pixq, 2
 %else
@@ -341,8 +381,6 @@ cglobal deblock_h_luma_8, 2,4,8,0x60+12, pix, stride, pix3, 
stride3
 %endif
     lea            pix3q, [pixq+stride3q]
 
-    INIT_XMM cpuname
-
     ; transpose 16x4 (only the middle 4 rows were changed by the filter)
     mova       m0, [pix_tmp+0x10]
     ; the two middle rows are still in the proper registers
@@ -668,67 +706,7 @@ cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, 
pix3, stride3
     %define pix_tmp rsp
 %endif
 
-    movq              m0, [pixq]
-    movq              m1, [pixq+stride0q]
-    movq              m2, [pixq+2*stride0q]
-    movq              m3, [pix3q]
-    movq              m4, [pix3q+stride0q]
-    lea            pix0q, [pixq +stride0q*8]
-    movq              m5, [pix3q+2*stride0q]
-    punpcklbw         m0, m1
-    movq              m6, [pix3q+stride3q]
-    punpcklbw         m2, m3
-    movq              m7, [pix3q+4*stride0q]
-    punpcklbw         m4, m5
-    lea            pix3q, [pix3q+8*stride0q]
-    movq              m1, [pix0q]
-    SBUTTERFLY        wd, 0, 2, 5
-    movq              m3, [pix0q+stride0q]
-    punpcklbw         m6, m7
-    movq              m5, [pix0q+2*stride0q]
-    SBUTTERFLY        wd, 4, 6, 7
-    movq              m7, [pix3q]
-    punpcklbw         m1, m3
-    SBUTTERFLY        dq, 0, 4, 3
-%if ARCH_X86_32
-    movq       [pix_tmp], m0
-%endif
-    movq              m3, [pix3q+stride0q]
-    punpcklbw         m5, m7
-%if ARCH_X86_32
-    movhps  [pix_tmp+16], m0
-%endif
-    SBUTTERFLY        dq, 2, 6, 7
-    movq              m7, [pix3q+2*stride0q]
-%if ARCH_X86_64
-    SWAP               0, 8
-%endif
-    SBUTTERFLY        wd, 1, 5, 0
-    movq              m0, [pix3q+stride3q]
-    punpcklbw         m3, m7
-    movq              m7, [pix3q+4*stride0q]
-    punpcklbw         m0, m7
-    SBUTTERFLY        wd, 3, 0, 7
-    SBUTTERFLY        dq, 1, 3, 7
-%if ARCH_X86_32
-    movq     [pix_tmp+8], m1
-    movhps  [pix_tmp+24], m1
-%endif
-    SBUTTERFLY       qdq, 4, 3, 7
-    mova    [pix_tmp+32], m4
-    mova    [pix_tmp+48], m3
-    SBUTTERFLY        dq, 5, 0, 7
-    SBUTTERFLY       qdq, 2, 5, 7
-    mova    [pix_tmp+64], m2
-    mova    [pix_tmp+80], m5
-%if ARCH_X86_64
-    SBUTTERFLY       qdq, 8, 1, 7
-    mova    [pix_tmp+16], m1
-    mova       [pix_tmp], m8
-%endif
-    SBUTTERFLY       qdq, 6, 0, 7
-    mova    [pix_tmp+96], m6
-    mova   [pix_tmp+112], m0
+    TRANSPOSE6OR8x16_MEM 8, pix_tmp+0x40, pixq, pix3q, stride0q, stride3q, 
pix0q
 
     lea            pix0q,  [pix_tmp+0x40]
 %if ARCH_X86_64
diff --git a/tests/checkasm/h264dsp.c b/tests/checkasm/h264dsp.c
index 680fd91576..bc036301dd 100644
--- a/tests/checkasm/h264dsp.c
+++ b/tests/checkasm/h264dsp.c
@@ -385,8 +385,8 @@ static void check_loop_filter(void)
     int alphas[N], betas[N];
     int8_t tc0[N][4];
 
-    declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *pix, ptrdiff_t stride,
-                      int alpha, int beta, int8_t *tc0);
+    declare_func(void, uint8_t *pix, ptrdiff_t stride,
+                       int alpha, int beta, int8_t *tc0);
 
     for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
         uint32_t mask = pixel_mask_lf[bit_depth - 8];

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to