PR #24217 opened by mkver URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24217 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24217.patch
In particular, don't use MMX in it. >From fd1d320bfe6529da6c4c138205ea950f2ea7c980 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Thu, 20 Aug 2026 13:47:01 +0200 Subject: [PATCH 1/5] 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 | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm index 379adb3290..2a6b024d4b 100644 --- a/libavcodec/x86/h264_deblock.asm +++ b/libavcodec/x86/h264_deblock.asm @@ -758,9 +758,9 @@ cglobal deblock_h_luma_intra_8, 4,9,0,0x80 ; transpose 8x16 -> tmp space TRANSPOSE8x8_MEM PASS8ROWS(r6, r5, r1, r8), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30) - lea r6, [r6+r1*8] + lea r0, [r6+r1*8] lea r5, [r5+r1*8] - TRANSPOSE8x8_MEM PASS8ROWS(r6, r5, r1, r8), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) + TRANSPOSE8x8_MEM PASS8ROWS(r0, r5, r1, r8), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) lea r0, [pix_tmp+0x40] mov r1, 0x10 @@ -768,12 +768,10 @@ cglobal deblock_h_luma_intra_8, 4,9,0,0x80 ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8) lea r5, [r6+r8] - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8) - shl r7, 3 - sub r6, r7 - sub r5, r7 - shr r7, 3 TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8) + lea r6, [r6+8*r7] + lea r5, [r5+8*r7] + TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8) RET %else cglobal deblock_h_luma_intra_8, 2,4,8,0x80 -- 2.52.0 >From 3abd486033c1f28b259c53e5f2522a050c378c7a Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Thu, 20 Aug 2026 14:35:59 +0200 Subject: [PATCH 2/5] avcodec/x86/h264_deblock: Combine 32,64 code for deblock_h_luma_intra_8 Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/h264_deblock.asm | 90 +++++++++++++++------------------ 1 file changed, 41 insertions(+), 49 deletions(-) diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm index 2a6b024d4b..8e35218375 100644 --- a/libavcodec/x86/h264_deblock.asm +++ b/libavcodec/x86/h264_deblock.asm @@ -741,15 +741,23 @@ cglobal deblock_v_luma_intra_8, 4,6,16,ARCH_X86_64*0x50-0x50 RET INIT_MMX cpuname -%if ARCH_X86_64 ;----------------------------------------------------------------------------- ; void ff_deblock_h_luma_intra(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) ;----------------------------------------------------------------------------- -cglobal deblock_h_luma_intra_8, 4,9,0,0x80 - lea r8, [r1*3] - lea r6, [r0-4] - lea r5, [r0-4+r8] - mov r7, r1 +%if ARCH_X86_64 +cglobal deblock_h_luma_intra_8, 4,9,0,0x80, pix0, stride0, alpha, beta, unused, pix3, pix, stride, stride3 + lea stride3q, [stride0q*3] + lea pixq, [pix0q-4] + mov strideq, stride0q + lea pix3q, [pix0q-4+stride3q] +%else +cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, pix3, stride3 +%define stride0q strideq +%define pix0q pixq + lea stride3q, [strideq*3] + sub pixq, 4 + lea pix3q, [pixq+stride3q] +%endif %if WIN64 %define pix_tmp rsp+0x20 ; shadow space %else @@ -757,55 +765,39 @@ cglobal deblock_h_luma_intra_8, 4,9,0,0x80 %endif ; transpose 8x16 -> tmp space - TRANSPOSE8x8_MEM PASS8ROWS(r6, r5, r1, r8), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30) - lea r0, [r6+r1*8] - lea r5, [r5+r1*8] - TRANSPOSE8x8_MEM PASS8ROWS(r0, r5, r1, r8), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) + TRANSPOSE8x8_MEM PASS8ROWS(pixq, pix3q, stride0q, stride3q), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30) + lea pix0q, [pixq +stride0q*8] + lea pix3q, [pix3q+stride0q*8] + TRANSPOSE8x8_MEM PASS8ROWS(pix0q, pix3q, stride0q, stride3q), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) - lea r0, [pix_tmp+0x40] - mov r1, 0x10 - call deblock_v_luma_intra_8 - - ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8) - lea r5, [r6+r8] - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8) - lea r6, [r6+8*r7] - lea r5, [r5+8*r7] - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r7, r8) - RET + lea pix0q, [pix_tmp+0x40] +%if ARCH_X86_64 + mov stride0d, 0x10 %else -cglobal deblock_h_luma_intra_8, 2,4,8,0x80 - lea r3, [r1*3] - sub r0, 4 - lea r2, [r0+r3] - %define pix_tmp rsp - - ; transpose 8x16 -> tmp space - TRANSPOSE8x8_MEM PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30) - lea r0, [r0+r1*8] - lea r2, [r2+r1*8] - TRANSPOSE8x8_MEM PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) - - lea r0, [pix_tmp+0x40] - PUSH dword r3m - PUSH dword r2m - PUSH dword 16 - PUSH r0 + PUSH dword r3m + PUSH dword r2m + PUSH dword 16 + PUSH pixd +%endif call deblock_v_luma_intra_8 - ADD esp, 16 +%if ARCH_X86_64 + lea pix3q, [pixq+stride3q] +%else + mov strided, stridem + mov pixd, pixm + + ADD esp, 16 + lea stride3d, [strided*3] + sub pixd, 4 + lea pix3d, [pixd+stride3d] +%endif - mov r1, r1m - mov r0, r0mp - lea r3, [r1*3] - sub r0, 4 - lea r2, [r0+r3] ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8) - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3) - lea r0, [r0+r1*8] - lea r2, [r2+r1*8] - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3) + TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(pixq, pix3q, strideq, stride3q) + lea pixq, [pixq +8*strideq] + lea pix3q, [pix3q+8*strideq] + TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(pixq, pix3q, strideq, stride3q) RET -%endif ; ARCH_X86_64 %endmacro ; DEBLOCK_LUMA_INTRA INIT_XMM sse2 -- 2.52.0 >From 101227ab8d00634fe0189be2f4ded4065b2b90b4 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Thu, 20 Aug 2026 17:02:25 +0200 Subject: [PATCH 3/5] avcodec/x86/h264_deblock: Avoid mmx in deblock_h_luma_intra_8 Old benchmarks: h_loop_filter_luma_intra_8bpp_c: 28.0 h_loop_filter_luma_intra_8bpp_sse2: 74.5 ( 0.38x) h_loop_filter_luma_intra_8bpp_avx: 74.6 ( 0.38x) New benchmarks: h_loop_filter_luma_intra_8bpp_c: 26.3 h_loop_filter_luma_intra_8bpp_sse2: 57.4 ( 0.46x) h_loop_filter_luma_intra_8bpp_avx: 57.6 ( 0.46x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/h264_deblock.asm | 69 +++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm index 8e35218375..6243c89e3a 100644 --- a/libavcodec/x86/h264_deblock.asm +++ b/libavcodec/x86/h264_deblock.asm @@ -740,12 +740,11 @@ cglobal deblock_v_luma_intra_8, 4,6,16,ARCH_X86_64*0x50-0x50 LUMA_INTRA_P012 [r0], [r0+r1], [r0+2*r1], [r0+r5] RET -INIT_MMX cpuname ;----------------------------------------------------------------------------- ; void ff_deblock_h_luma_intra(uint8_t *pix, ptrdiff_t stride, int alpha, int beta) ;----------------------------------------------------------------------------- %if ARCH_X86_64 -cglobal deblock_h_luma_intra_8, 4,9,0,0x80, pix0, stride0, alpha, beta, unused, pix3, pix, stride, stride3 +cglobal deblock_h_luma_intra_8, 4,9,9,0x80, pix0, stride0, alpha, beta, unused, pix3, pix, stride, stride3 lea stride3q, [stride0q*3] lea pixq, [pix0q-4] mov strideq, stride0q @@ -764,11 +763,67 @@ cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, pix3, stride3 %define pix_tmp rsp %endif - ; transpose 8x16 -> tmp space - TRANSPOSE8x8_MEM PASS8ROWS(pixq, pix3q, stride0q, stride3q), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30) + movq m0, [pixq] + movq m1, [pixq+stride0q] + movq m2, [pixq+2*stride0q] + movq m3, [pix3q] + movq m4, [pix3q+stride0q] lea pix0q, [pixq +stride0q*8] - lea pix3q, [pix3q+stride0q*8] - TRANSPOSE8x8_MEM PASS8ROWS(pix0q, pix3q, stride0q, stride3q), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30) + 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 lea pix0q, [pix_tmp+0x40] %if ARCH_X86_64 @@ -791,7 +846,7 @@ cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, pix3, stride3 sub pixd, 4 lea pix3d, [pixd+stride3d] %endif - +INIT_MMX cpuname ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8) TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(pixq, pix3q, strideq, stride3q) lea pixq, [pixq +8*strideq] -- 2.52.0 >From c2b3bec71281cfea6d6dd7f059c49ba988b5986c Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Thu, 20 Aug 2026 17:08:50 +0200 Subject: [PATCH 4/5] avcodec/x86/h264_deblock: Remove obsolete macro parameters Forgotten in b1140d3c982e0720d2dd638f2d7ae0ca6552ac13. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/h264_deblock.asm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm index 6243c89e3a..961cf84a0c 100644 --- a/libavcodec/x86/h264_deblock.asm +++ b/libavcodec/x86/h264_deblock.asm @@ -649,7 +649,7 @@ DEBLOCK_LUMA 16 %define mask1p mask1q %endmacro -%macro DEBLOCK_LUMA_INTRA 1 +%macro DEBLOCK_LUMA_INTRA 0 %define p1 m0 %define p0 m1 %define q0 m2 @@ -856,10 +856,10 @@ INIT_MMX cpuname %endmacro ; DEBLOCK_LUMA_INTRA INIT_XMM sse2 -DEBLOCK_LUMA_INTRA v +DEBLOCK_LUMA_INTRA %if HAVE_AVX_EXTERNAL INIT_XMM avx -DEBLOCK_LUMA_INTRA v +DEBLOCK_LUMA_INTRA %endif %macro LOAD_8_ROWS 8 -- 2.52.0 >From a2e7b15475ceffae674093d4d3abb4d1d9d7e9da Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Thu, 20 Aug 2026 17:52:07 +0200 Subject: [PATCH 5/5] avcodec/x86/h264_deblock: Don't use mmx in deblock_h_luma_intra_8 Old benchmarks: h_loop_filter_luma_intra_8bpp_c: 26.3 h_loop_filter_luma_intra_8bpp_sse2: 57.4 ( 0.46x) h_loop_filter_luma_intra_8bpp_avx: 57.6 ( 0.46x) New benchmarks: h_loop_filter_luma_intra_8bpp_c: 26.5 h_loop_filter_luma_intra_8bpp_sse2: 52.2 ( 0.51x) h_loop_filter_luma_intra_8bpp_avx: 52.3 ( 0.51x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/h264_deblock.asm | 92 ++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/libavcodec/x86/h264_deblock.asm b/libavcodec/x86/h264_deblock.asm index 961cf84a0c..b47d84effb 100644 --- a/libavcodec/x86/h264_deblock.asm +++ b/libavcodec/x86/h264_deblock.asm @@ -96,43 +96,6 @@ cextern pb_3 RESET_MM_PERMUTATION %endmacro -; in: 8 rows of 8 in %1..%8 -; out: 8 rows of 8 in %9..%16 -%macro TRANSPOSE8x8_MEM 16 - 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 - SBUTTERFLY3 bw, m6, %8, m7 - movq %9, m5 - SBUTTERFLY wd, 0, 2, 5 - SBUTTERFLY wd, 4, 6, 5 - SBUTTERFLY wd, 1, 3, 5 - movq %11, m6 - movq m6, %9 - SBUTTERFLY wd, 6, 7, 5 - SBUTTERFLY dq, 0, 4, 5 - SBUTTERFLY dq, 1, 6, 5 - movq %9, m0 - movq %10, m4 - movq %13, m1 - movq %14, m6 - SBUTTERFLY3 dq, m2, %11, m0 - SBUTTERFLY dq, 3, 7, 4 - movq %11, m2 - movq %12, m0 - movq %15, m3 - movq %16, m7 - RESET_MM_PERMUTATION -%endmacro - ; out: %4 = |%1-%2|>%3 ; clobbers: %5 %macro DIFF_GT 5 @@ -846,12 +809,57 @@ cglobal deblock_h_luma_intra_8, 2,4,8,0x80, pix, stride, pix3, stride3 sub pixd, 4 lea pix3d, [pixd+stride3d] %endif -INIT_MMX cpuname - ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8) - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(pixq, pix3q, strideq, stride3q) - lea pixq, [pixq +8*strideq] + RESET_MM_PERMUTATION + mova m0, [pix_tmp] + mova m1, [pix_tmp+16] + mova m2, [pix_tmp+32] + mova m3, [pix_tmp+48] + SBUTTERFLY bw, 0, 1, 7 + mova m4, [pix_tmp+64] + mova m5, [pix_tmp+80] + SBUTTERFLY bw, 2, 3, 7 + mova m6, [pix_tmp+96] + SBUTTERFLY wd, 0, 2, 7 +%if ARCH_X86_64 + mova m8, [pix_tmp+112] +%endif + SBUTTERFLY wd, 1, 3, 7 + SBUTTERFLY bw, 4, 5, 7 +%if ARCH_X86_64 + SBUTTERFLY bw, 6, 8, 7 +%else + punpcklbw m6, [pix_tmp+112] +%endif + SBUTTERFLY wd, 4, 6, 7 + SBUTTERFLY dq, 0, 4, 7 + movq [pixq], m0 + movhps [pixq+strideq], m0 +%if ARCH_X86_64 + SWAP 0, 8 +%else + mova m0, [pix_tmp+96] + punpckhbw m0, [pix_tmp+112] +%endif + SBUTTERFLY dq, 2, 6, 7 + movq [pixq+2*strideq], m4 + movhps [pix3q], m4 + SBUTTERFLY wd, 5, 0, 7 + movq [pix3q+strideq], m2 + movhps [pix3q+2*strideq], m2 + lea pixq, [pixq+8*strideq] + SBUTTERFLY dq, 1, 5, 7 + movq [pix3q+stride3q], m6 + movhps [pix3q+4*strideq], m6 lea pix3q, [pix3q+8*strideq] - TRANSPOSE8x8_MEM PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(pixq, pix3q, strideq, stride3q) + SBUTTERFLY dq, 3, 0, 7 + movq [pixq], m1 + movhps [pixq+strideq], m1 + movq [pixq+2*strideq], m5 + movhps [pix3q], m5 + movq [pix3q+strideq], m3 + movhps [pix3q+2*strideq], m3 + movq [pix3q+stride3q], m0 + movhps [pix3q+4*strideq], m0 RET %endmacro ; DEBLOCK_LUMA_INTRA -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
