[PR] avcodec/x86/h264_deblock: Avoid mmx register in deblock_h_luma_8 (PR #24254)

mkver via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <[email protected]>
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]
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.