[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]