This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new 06deae14bf avcodec/x86/h264_intrapred_10bit: Replace MMX with SSE2
06deae14bf is described below
commit 06deae14bf15e937e639d3c1382c2aecb2453e2a
Author: Zuxy Meng <[email protected]>
AuthorDate: Sat Aug 1 15:10:27 2026 -0700
Commit: Zuxy Meng <[email protected]>
CommitDate: Thu Aug 6 19:01:29 2026 -0700
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 | 56 ++++++++++++++++++---------------
libavcodec/x86/h264_intrapred_init.c | 10 +++---
2 files changed, 34 insertions(+), 32 deletions(-)
diff --git a/libavcodec/x86/h264_intrapred_10bit.asm
b/libavcodec/x86/h264_intrapred_10bit.asm
index 2f30807332..b63a5fdca2 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, 4, 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
-
- pshufw m5, m0, 11111110b
- PRED4x4_LOWPASS m1, m0, m5, m1
- movq m6, m2
- punpcklwd m6, m1
- movq [r0+r2*1], m6
+ pshuflw m1, m0, q3321
+ pavgw m2, m1, m0
+
+ 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) {
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]