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

Also deduplicate the 32 and 64bit versions of the non-intra functions.


>From 3e76ae1f4cf572a15787293729b2cc0cb5d86b8e Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Sun, 23 Aug 2026 06:12:52 +0200
Subject: [PATCH 1/6] avcodec/x86/h264_deblock: Avoid zeroing register
 unnecessarily

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index b47d84effb..ed79889633 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -129,13 +129,16 @@ cextern pb_3
     pcmpeqb %4, %5
 %endmacro
 
-; in: m0=p1 m1=p0 m2=q0 m3=q1 %1=alpha-1 %2=beta-1
+; in: m0=p1 m1=p0 m2=q0 m3=q1 %1=alpha-1 %2=beta-1, %4=zero reg
 ; out: m5=beta-1, m7=mask, %3=alpha-1
 ; clobbers: m4,m6
-%macro LOAD_MASK 2-3
+%macro LOAD_MASK 2-4
     movd     m4, %1
     movd     m5, %2
-%if cpuflag(ssse3)
+%if cpuflag(ssse3) && %0 == 4
+    pshufb   m4, %4
+    pshufb   m5, %4
+%elif cpuflag(ssse3)
     pxor     m6, m6
     pshufb   m4, m6
     pshufb   m5, m6
@@ -153,8 +156,12 @@ cextern pb_3
     por      m7, m4
     DIFF_GT  m3, m2, m5, m4, m6 ; |q1-q0| > beta-1
     por      m7, m4
+%if %0 == 4
+    pcmpeqb  m7, %4
+%else
     pxor     m6, m6
     pcmpeqb  m7, m6
+%endif
 %endmacro
 
 ; in: m0=p1 m1=p0 m2=q0 m3=q1 m7=(tc&mask)
@@ -669,7 +676,7 @@ cglobal deblock_v_luma_intra_8, 4,6,16,ARCH_X86_64*0x50-0x50
 %if ARCH_X86_64
     pxor    mpb_0, mpb_0
     mova    mpb_1, [pb_1]
-    LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
+    LOAD_MASK r2d, r3d, t5, mpb_0 ; m5=beta-1, t5=alpha-1, m7=mask0
     SWAP    7, 12 ; m12=mask0
     pavgb   t5, mpb_0
     pavgb   t5, mpb_1 ; alpha/4+1
-- 
2.52.0


>From 5a5c08fbbcb082fdca13d767b274d5bd208c39e2 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Sun, 23 Aug 2026 22:29:23 +0200
Subject: [PATCH 2/6] avcodec/x86/h264_deblock: Avoid unnecessary stores/loads

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index ed79889633..8635b78516 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -992,10 +992,8 @@ cglobal deblock_h_chroma_8, 5, 7, 8, 0-16, pix_, stride_, 
alpha_, beta_, tc0_
     CHROMA_H_START_XMM r5, r6
     LOAD_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
     TRANSPOSE_8x4B_XMM
-    movq [rsp], m0
     movq [rsp + 8], m3
     CHROMA_INTER_BODY_XMM 1
-    movq m0, [rsp]
     movq m3, [rsp + 8]
     TRANSPOSE_4x8B_XMM
     STORE_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
@@ -1005,10 +1003,8 @@ cglobal deblock_h_chroma422_8, 5, 7, 8, 0-16, pix_, 
stride_, alpha_, beta_, tc0_
     CHROMA_H_START_XMM r5, r6
     LOAD_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
     TRANSPOSE_8x4B_XMM
-    movq [rsp], m0
     movq [rsp + 8], m3
     CHROMA_INTER_BODY_XMM 2
-    movq m0, [rsp]
     movq m3, [rsp + 8]
     TRANSPOSE_4x8B_XMM
     STORE_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
@@ -1019,10 +1015,8 @@ cglobal deblock_h_chroma422_8, 5, 7, 8, 0-16, pix_, 
stride_, alpha_, beta_, tc0_
 
     LOAD_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
     TRANSPOSE_8x4B_XMM
-    movq [rsp], m0
     movq [rsp + 8], m3
     CHROMA_INTER_BODY_XMM 2
-    movq m0, [rsp]
     movq m3, [rsp + 8]
     TRANSPOSE_4x8B_XMM
     STORE_8_ROWS PASS8ROWS(pix_q - 2, r5 - 2, stride_q, r6)
-- 
2.52.0


>From da24355d5d0757fa04902c75856eb04160419973 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Sun, 23 Aug 2026 23:42:58 +0200
Subject: [PATCH 3/6] avcodec/x86/h264_deblock: Write lines in original order

I.e. not lines 9-16, then lines 1-8. No changes in benchmarks
here; it is mainly done to reduce differences with the 32bit code.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index 8635b78516..4c52a93466 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -271,9 +271,9 @@ cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64
 
     ; transpose 6x16 -> tmp space
     TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r1, r8), pix_tmp
-    lea    r6, [r6+r1*8]
+    lea    r0, [r6+r1*8]
     lea    r5, [r5+r1*8]
-    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r1, r8), pix_tmp+8
+    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r5, r1, r8), pix_tmp+8
 
     ; vertical filter
     ; alpha, beta, tc0 are still in r2d, r3d, r4
@@ -286,7 +286,7 @@ cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64
     call   deblock_v_luma_8
 
     add    r6, 2
-    add    r5, 2
+    lea    r5, [r6+r8]
 
     INIT_XMM cpuname
 
@@ -295,17 +295,15 @@ cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64
     ; the two middle rows are still in the proper registers
     mova       m3, [pix_tmp+0x40]
 
-    punpckhbw  m4, m0, m1
-    punpckhbw  m5, m2, m3
+    punpcklbw         m4, m0, m1
+    punpcklbw         m5, m2, m3
 
     TRANSPOSE8x4B_STORE m4, m5, PASS8ROWS(r6, r5, r7, r8)
 
-    punpcklbw  m0, m1
-    punpcklbw  m2, m3
-    shl    r7,  3
-    sub    r6,  r7
-    sub    r5,  r7
-    shr    r7,  3
+    lea    r6, [r6+r7*8]
+    punpckhbw         m0, m1
+    lea    r5, [r5+r7*8]
+    punpckhbw         m2, m3
 
     TRANSPOSE8x4B_STORE m0, m2, PASS8ROWS(r6, r5, r7, r8)
     RET
-- 
2.52.0


>From 70b7ebbadb36af77bdfdebb69b136d9022ed8643 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Mon, 24 Aug 2026 00:23:30 +0200
Subject: [PATCH 4/6] avcodec/x86/h264_deblock: Remove redundant rederiving of
 stride3

It was stored in a nonvolatile register.

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index 4c52a93466..4dd6fbe1b9 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -810,7 +810,6 @@ cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, 
pix3, stride3
     mov             pixd,  pixm
 
     ADD              esp, 16
-    lea         stride3d,  [strided*3]
     sub             pixd,  4
     lea            pix3d,  [pixd+stride3d]
 %endif
-- 
2.52.0


>From 09ce2ae707e41711b6b2bdee76604ced6a3b7a54 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Mon, 24 Aug 2026 00:36:19 +0200
Subject: [PATCH 5/6] avcodec/x86/h264_deblock: Combine 32,64 code for
 deblock_h_luma_8

Signed-off-by: Andreas Rheinhardt <[email protected]>
---
 libavcodec/x86/h264_deblock.asm | 221 ++++++++++++--------------------
 1 file changed, 79 insertions(+), 142 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index 4dd6fbe1b9..68ab4215a0 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -206,14 +206,15 @@ cextern pb_3
     mova    %4, %2
 %endmacro
 
-%if ARCH_X86_64
 ;-----------------------------------------------------------------------------
 ; void ff_deblock_v_luma(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
 ;                        int8_t *tc0)
 ;-----------------------------------------------------------------------------
 %macro DEBLOCK_LUMA 0
-cglobal deblock_v_luma_8, 5,5,10, pix_, stride_, alpha_, beta_, base3_
+cglobal deblock_v_luma_8, 5,5,10, 32*ARCH_X86_32, pix_, stride_, alpha_, 
beta_, base3_
+%if ARCH_X86_64
     movd    m8, [r4] ; tc0
+%endif
     lea     r4, [stride_q*3]
     dec     alpha_d        ; alpha-1
     neg     r4
@@ -226,27 +227,54 @@ cglobal deblock_v_luma_8, 5,5,10, pix_, stride_, alpha_, 
beta_, base3_
     mova    m3, [pix_q + stride_q]   ; q1
     LOAD_MASK r2d, r3d
 
+%if ARCH_X86_64
     punpcklbw m8, m8
+    movdqa  m3, [base3_q] ; p2
     punpcklbw m8, m8 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
     pcmpeqb m9, m9
     pcmpeqb m9, m8
     pandn   m9, m7
     pand    m8, m9
+%else
+    mov     r3, r4mp
+    pcmpeqb m3, m3
+    movd    m4, [r3] ; tc0
+    punpcklbw m4, m4
+    punpcklbw m4, m4 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
+    mova   [esp+16], m4 ; tc
+    pcmpgtb m4, m3  ; tc >= 0
+    mova    m3, [base3_q] ; p2
+    pand    m4, m7  ; tc >= 0 && m7
+    mova   [esp], m4 ; mask, i.e. m9
+%endif
 
-    movdqa  m3, [base3_q] ; p2
     DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
+%if ARCH_X86_64
     pand    m6, m9
     psubb   m7, m8, m6
     pand    m6, m8
+%else
+    pand    m6, m4
+    pand    m4, [esp+16] ; tc
+    psubb   m7, m4, m6
+    pand    m6, m4
+%endif
     LUMA_Q1 m0, m3, [base3_q], [base3_q + stride_q], m6, m4
 
     movdqa  m4, [pix_q + 2*stride_q] ; q2
     DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
+%if ARCH_X86_64
     pand    m6, m9
-    pand    m8, m6
     psubb   m7, m6
+    pand    m6, m8
+%else
+    pand    m6, [esp] ; mask
+    mova    m5, [esp+16] ; tc
+    psubb   m7, m6
+    pand    m6, m5
+%endif
     mova    m3, [pix_q + stride_q]
-    LUMA_Q1 m3, m4, [pix_q + 2*stride_q], [pix_q + stride_q], m8, m6
+    LUMA_Q1 m3, m4, [pix_q + 2*stride_q], [pix_q + stride_q], m6, m5
 
     DEBLOCK_P0_Q0
     mova    [base3_q + 2*stride_q], m1
@@ -257,36 +285,61 @@ cglobal deblock_v_luma_8, 5,5,10, pix_, stride_, alpha_, 
beta_, base3_
 ; void ff_deblock_h_luma(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
 ;                        int8_t *tc0)
 ;-----------------------------------------------------------------------------
-cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64
-    INIT_MMX cpuname
-    lea    r8,  [r1+r1*2]
-    lea    r6,  [r0-4]
-    lea    r5,  [r0-4+r8]
-    mov    r7,  r1
+%if ARCH_X86_64
+cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64, pix0, stride0, alpha, beta, 
tc0, pix3, pix, stride, stride3
+    lea         stride3q,  [stride0q*3]
+    lea             pixq,  [pix0q-4]
+    mov          strideq,  stride0q
+    lea            pix3q,  [pix0q-4+stride3q]
 %if WIN64
     %define pix_tmp rsp+0x30 ; shadow space + r4
 %else
     %define pix_tmp rsp
+%endif
+%else
+cglobal deblock_h_luma_8, 2,4,8,0x60+12, pix, stride, pix3, stride3
+    lea         stride3q, [strideq*3]
+    sub             pixq, 4
+    lea            pix3q, [pixq+stride3q]
+%define pix_tmp esp+12
+%define stride0q strideq
+%define pix0q pixq
 %endif
 
+    INIT_MMX cpuname
     ; transpose 6x16 -> tmp space
-    TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r1, r8), pix_tmp
-    lea    r0, [r6+r1*8]
-    lea    r5, [r5+r1*8]
-    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r5, r1, r8), pix_tmp+8
+    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
 
     ; vertical filter
+    lea            pix0q, [pix_tmp+0x30]
+%if ARCH_X86_64
     ; alpha, beta, tc0 are still in r2d, r3d, r4
     ; don't backup r6, r5, r7, r8 because deblock_v_luma_sse2 doesn't use them
-    lea    r0, [pix_tmp+0x30]
-    mov    r1d, 0x10
+    mov         stride0d, 0x10
 %if WIN64
-    mov    [rsp+0x20], r4
+    mov       [rsp+0x20], tc0q
+%endif
+%else
+    PUSH       dword r4m
+    PUSH       dword r3m
+    PUSH       dword r2m
+    PUSH       dword 16
+    PUSH       dword r0
 %endif
     call   deblock_v_luma_8
 
-    add    r6, 2
-    lea    r5, [r6+r8]
+%if ARCH_X86_64
+    add             pixq, 2
+%else
+    mov             pixq, pixm
+    mov          strideq, stridem
+    sub             pixq, 2
+    ADD              esp, 20
+%endif
+    lea            pix3q, [pixq+stride3q]
 
     INIT_XMM cpuname
 
@@ -298,19 +351,19 @@ cglobal deblock_h_luma_8, 5,9,8,0x60+16*WIN64
     punpcklbw         m4, m0, m1
     punpcklbw         m5, m2, m3
 
-    TRANSPOSE8x4B_STORE m4, m5, PASS8ROWS(r6, r5, r7, r8)
+    TRANSPOSE8x4B_STORE m4, m5, PASS8ROWS(pixq, pix3q, strideq, stride3q)
 
-    lea    r6, [r6+r7*8]
+    lea             pixq, [pixq+strideq*8]
     punpckhbw         m0, m1
-    lea    r5, [r5+r7*8]
+    lea            pix3q, [pix3q+strideq*8]
     punpckhbw         m2, m3
 
-    TRANSPOSE8x4B_STORE m0, m2, PASS8ROWS(r6, r5, r7, r8)
+    TRANSPOSE8x4B_STORE m0, m2, PASS8ROWS(pixq, pix3q, strideq, stride3q)
     RET
 %endmacro
 
 %macro DEBLOCK_H_LUMA_MBAFF 0
-
+%if ARCH_X86_64
 cglobal deblock_h_luma_mbaff_8, 5, 9, 10, 8*16, pix_, stride_, alpha_, beta_, 
tc0_, base3_, stride3_
     dec    alpha_d
     dec    beta_d
@@ -391,7 +444,7 @@ cglobal deblock_h_luma_mbaff_8, 5, 9, 10, 8*16, pix_, 
stride_, alpha_, beta_, tc
     movq [base3_q + 4*stride_q - 4], m7
 
 RET
-
+%endif ; ARCH_X86_64
 %endmacro
 
 INIT_XMM sse2
@@ -404,122 +457,6 @@ DEBLOCK_H_LUMA_MBAFF
 DEBLOCK_LUMA
 %endif
 
-%else
-
-%macro DEBLOCK_LUMA 1
-;-----------------------------------------------------------------------------
-; void ff_deblock_v_luma(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
-;                        int8_t *tc0)
-;-----------------------------------------------------------------------------
-cglobal deblock_v_luma_8, 5,5,8,2*%1
-    lea     r4, [r1*3]
-    dec     r2     ; alpha-1
-    neg     r4
-    dec     r3     ; beta-1
-    add     r4, r0 ; pix-3*stride
-
-    mova    m0, [r4+r1]   ; p1
-    mova    m1, [r4+2*r1] ; p0
-    mova    m2, [r0]      ; q0
-    mova    m3, [r0+r1]   ; q1
-    LOAD_MASK r2, r3
-
-    mov     r3, r4mp
-    pcmpeqb m3, m3
-    movd    m4, [r3] ; tc0
-    punpcklbw m4, m4
-    punpcklbw m4, m4 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
-    mova   [esp+%1], m4 ; tc
-    pcmpgtb m4, m3
-    mova    m3, [r4] ; p2
-    pand    m4, m7
-    mova   [esp], m4 ; mask
-
-    DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
-    pand    m6, m4
-    pand    m4, [esp+%1] ; tc
-    psubb   m7, m4, m6
-    pand    m6, m4
-    LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
-
-    mova    m4, [r0+2*r1] ; q2
-    DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
-    pand    m6, [esp] ; mask
-    mova    m5, [esp+%1] ; tc
-    psubb   m7, m6
-    pand    m5, m6
-    mova    m3, [r0+r1]
-    LUMA_Q1 m3, m4, [r0+2*r1], [r0+r1], m5, m6
-
-    DEBLOCK_P0_Q0
-    mova    [r4+2*r1], m1
-    mova    [r0], m2
-    RET
-
-;-----------------------------------------------------------------------------
-; void ff_deblock_h_luma(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
-;                        int8_t *tc0)
-;-----------------------------------------------------------------------------
-cglobal deblock_h_luma_8, 0,5,8,0x60+12
-    INIT_MMX cpuname
-    mov    r0, r0mp
-    mov    r3, r1m
-    lea    r4, [r3*3]
-    sub    r0, 4
-    lea    r1, [r0+r4]
-%define pix_tmp esp+12
-
-    ; transpose 6x16 -> tmp space
-    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp
-    lea    r0, [r0+r3*8]
-    lea    r1, [r1+r3*8]
-    TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp+8
-
-    ; vertical filter
-    lea    r0, [pix_tmp+0x30]
-    PUSH   dword r4m
-    PUSH   dword r3m
-    PUSH   dword r2m
-    PUSH   dword 16
-    PUSH   dword r0
-    call   deblock_v_luma_8
-    ADD    esp, 20
-
-    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
-    mova       m3, [pix_tmp+0x40]
-
-    mov        r0, r0mp
-    punpcklbw  m4, m0, m1
-    sub        r0, 2
-    punpcklbw  m5, m2, m3
-    lea        r1, [r0+r4]
-
-    TRANSPOSE8x4B_STORE m4, m5, PASS8ROWS(r0, r1, r3, r4)
-
-    punpckhbw   m0, m1
-    lea    r0, [r0+r3*8]
-    punpckhbw   m2, m3
-    lea    r1, [r1+r3*8]
-
-    TRANSPOSE8x4B_STORE m0, m2, PASS8ROWS(r0, r1, r3, r4)
-
-    RET
-%endmacro ; DEBLOCK_LUMA
-
-INIT_XMM sse2
-DEBLOCK_LUMA 16
-%if HAVE_AVX_EXTERNAL
-INIT_XMM avx
-DEBLOCK_LUMA 16
-%endif
-
-%endif ; ARCH
-
-
 
 %macro LUMA_INTRA_P012 4 ; p0..p3 in memory
 %if ARCH_X86_64
-- 
2.52.0


>From 4c48521ceed76680ad31f5029efa0e279d01844b Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <[email protected]>
Date: Mon, 24 Aug 2026 01:28:59 +0200
Subject: [PATCH 6/6] 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 | 183 +++++++++++++++-----------------
 tests/checkasm/h264dsp.c        |   4 +-
 2 files changed, 85 insertions(+), 102 deletions(-)

diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm
index 68ab4215a0..c7df568df1 100644
--- a/libavcodec/x86/h264_deblock.asm
+++ b/libavcodec/x86/h264_deblock.asm
@@ -63,37 +63,85 @@ cextern pb_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
@@ -306,12 +354,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 +374,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 +386,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 +711,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];
-- 
2.52.0

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

Reply via email to