[PR] avcodec/x86/h264_intrapred_10bit: Replace MMX with SSE2 (PR #23976)
zuxy via ffmpeg-devel <[email protected]> Sat, 01 Aug 2026 23:47:21 -0000
| Newsgroups | gmane.comp.video.ffmpeg.devel |
|---|---|
| Message-ID | <178562804213.59.5053838610508754132@29965ddac10e> |
PR #23976 opened by zuxy URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23976 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23976.patch Replace MMX implementation of pred4x4_dc_10 and pred4x4_horizontal_up_10 with SSE2. pred4x4_dc_10_c: 9.7 pred4x4_dc_10_mmxext: 3.7 ( 2.63x) pred4x4_dc_10_sse2: 3.6 ( 2.71x) pred4x4_horizontal_up_10_c: 13.7 pred4x4_horizontal_up_10_mmxext: 5.5 ( 2.52x) pred4x4_horizontal_up_10_sse2: 4.6 ( 2.96x) Signed-off-by: Zuxy Meng <[email protected]> # Summary of changes Briefly describe what this PR does and why. <!-- If this PR requires new FATE test samples, attach them to the PR and list their target paths below (relative to the fate-suite root). Attached filenames must match the sample's filename: ```fate-samples # e.g. vorbis/new-sample.ogg ``` --> >From 84b4b9fb5490890590c016f5518158c116236afa Mon Sep 17 00:00:00 2001 From: Zuxy Meng <[email protected]> Date: Sat, 1 Aug 2026 15:10:27 -0700 Subject: [PATCH] avcodec/x86/h264_intrapred_10bit: Replace MMX with SSE2 Replace MMX implementation of pred4x4_dc_10 and pred4x4_horizontal_up_10 with SSE2. pred4x4_dc_10_c: 9.7 pred4x4_dc_10_mmxext: 3.7 ( 2.63x) pred4x4_dc_10_sse2: 3.6 ( 2.71x) pred4x4_horizontal_up_10_c: 13.7 pred4x4_horizontal_up_10_mmxext: 5.5 ( 2.52x) pred4x4_horizontal_up_10_sse2: 4.6 ( 2.96x) Signed-off-by: Zuxy Meng <[email protected]> --- libavcodec/x86/h264_intrapred_10bit.asm | 54 +++++++++++++------------ libavcodec/x86/h264_intrapred_init.c | 10 ++--- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/libavcodec/x86/h264_intrapred_10bit.asm b/libavcodec/x86/h264_intrapred_10bit.asm index 2f30807332..152a7b71e0 100644 --- a/libavcodec/x86/h264_intrapred_10bit.asm +++ b/libavcodec/x86/h264_intrapred_10bit.asm @@ -176,18 +176,21 @@ PRED4x4_HD ; void ff_pred4x4_dc_10(pixel *src, const pixel *topright, ptrdiff_t stride) ;----------------------------------------------------------------------------- -INIT_MMX mmxext -cglobal pred4x4_dc_10, 3, 3 +INIT_XMM sse2 +cglobal pred4x4_dc_10, 3, 3, 3 sub r0, r2 lea r1, [r0+r2*2] - movq m2, [r0+r2*1-8] - paddw m2, [r0+r2*2-8] - paddw m2, [r1+r2*1-8] - paddw m2, [r1+r2*2-8] - psrlq m2, 48 + movzx r3d, word [r0+r2*1-2] + add r3w, [r0+r2*2-2] + add r3w, [r1+r2*1-2] + add r3w, [r1+r2*2-2] + add r3w, 4 + movd m2, r3d movq m0, [r0] - HADDW m0, m1 - paddw m0, [pw_4] + pshuflw m1, m0, q1032 + paddw m0, m1 + pshuflw m1, m0, q3201 + paddw m0, m1 paddw m0, m2 psrlw m0, 3 SPLATW m0, m0, 0 @@ -262,27 +265,28 @@ PRED4x4_VL ; void ff_pred4x4_horizontal_up_10(pixel *src, const pixel *topright, ; ptrdiff_t stride) ;----------------------------------------------------------------------------- -INIT_MMX mmxext -cglobal pred4x4_horizontal_up_10, 3, 3 +INIT_XMM sse2 +cglobal pred4x4_horizontal_up_10, 3, 3, 5 sub r0, r2 lea r1, [r0+r2*2] - movq m0, [r0+r2*1-8] - punpckhwd m0, [r0+r2*2-8] - movq m1, [r1+r2*1-8] - punpckhwd m1, [r1+r2*2-8] - punpckhdq m0, m1 - pshufw m1, m1, 0xFF + movd m0, [r0+r2*1-4] + movd m3, [r0+r2*2-4] + punpcklwd m0, m3 + movd m1, [r1+r2*1-4] + movd m3, [r1+r2*2-4] + punpcklwd m1, m3 + punpckldq m0, m1 + punpckhqdq m0, m0 + pshuflw m1, m1, q3333 movq [r1+r2*2], m1 movd [r1+r2*1+4], m1 - pshufw m2, m0, 11111001b - movq m1, m2 - pavgw m2, m0 + pshuflw m1, m0, q3321 + pavgw m2, m1, m0 - pshufw m5, m0, 11111110b - PRED4x4_LOWPASS m1, m0, m5, m1 - movq m6, m2 - punpcklwd m6, m1 - movq [r0+r2*1], m6 + pshuflw m4, m0, q3332 + PRED4x4_LOWPASS m1, m0, m4, m1 + punpcklwd m3, m2, m1 + movq [r0+r2*1], m3 psrlq m2, 16 psrlq m1, 16 punpcklwd m2, m1 diff --git a/libavcodec/x86/h264_intrapred_init.c b/libavcodec/x86/h264_intrapred_init.c index 0248f86491..98abea0b53 100644 --- a/libavcodec/x86/h264_intrapred_init.c +++ b/libavcodec/x86/h264_intrapred_init.c @@ -32,7 +32,7 @@ void ff_pred4x4_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, \ const uint8_t *topright, \ ptrdiff_t stride); -PRED4x4(dc, 10, mmxext) +PRED4x4(dc, 10, sse2) PRED4x4(down_left, 10, sse2) PRED4x4(down_left, 10, avx) PRED4x4(down_right, 10, sse2) @@ -43,7 +43,7 @@ PRED4x4(vertical_left, 10, avx) PRED4x4(vertical_right, 10, sse2) PRED4x4(vertical_right, 10, ssse3) PRED4x4(vertical_right, 10, avx) -PRED4x4(horizontal_up, 10, mmxext) +PRED4x4(horizontal_up, 10, sse2) PRED4x4(horizontal_down, 10, sse2) PRED4x4(horizontal_down, 10, ssse3) PRED4x4(horizontal_down, 10, avx) @@ -245,15 +245,13 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, } } } else if (bit_depth == 10) { - if (EXTERNAL_MMXEXT(cpu_flags)) { - h->pred4x4[DC_PRED ] = ff_pred4x4_dc_10_mmxext; - h->pred4x4[HOR_UP_PRED ] = ff_pred4x4_horizontal_up_10_mmxext; - } if (EXTERNAL_SSE2(cpu_flags)) { + h->pred4x4[DC_PRED ] = ff_pred4x4_dc_10_sse2; h->pred4x4[DIAG_DOWN_LEFT_PRED ] = ff_pred4x4_down_left_10_sse2; h->pred4x4[DIAG_DOWN_RIGHT_PRED] = ff_pred4x4_down_right_10_sse2; h->pred4x4[VERT_LEFT_PRED ] = ff_pred4x4_vertical_left_10_sse2; h->pred4x4[VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_10_sse2; + h->pred4x4[HOR_UP_PRED ] = ff_pred4x4_horizontal_up_10_sse2; h->pred4x4[HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_10_sse2; if (chroma_format_idc <= 1) { -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]