Commit 15d4947850 for ffmpeg
commit 15d4947850b0fb0630a295deb02e9424f22aebdb
Author: Zuxy Meng <zuxy.meng@gmail.com>
Date: Mon Nov 2 21:09:34 2026 -0800
avcodec/x86/vp9: convert h_4x4_16 predictor MMXEXT to SSE2
Convert the 16-bit horizontal 4x4 predictor from MMXEXT to
XMM.
Benchmarks (checkasm, Zen 4, pinned, median of 3
interleaved pairs, cycles):
vp9_hor_4x4_10bpp: 0.8 -> 0.4
vp9_hor_4x4_12bpp: 0.8 -> 0.4
checkasm --test=vp9dsp passes (1272/1272 over 3 seeds).
Signed-off-by: Zuxy Meng <zuxy.meng@gmail.com>
diff --git a/libavcodec/x86/vp9dsp_init_16bpp.c b/libavcodec/x86/vp9dsp_init_16bpp.c
index 0c290e0f4b..18c7006eb7 100644
--- a/libavcodec/x86/vp9dsp_init_16bpp.c
+++ b/libavcodec/x86/vp9dsp_init_16bpp.c
@@ -44,7 +44,7 @@ decl_fpel_func(avg, 64, _16, avx2);
decl_fpel_func(avg, 128, _16, avx2);
decl_ipred_fns(v, 16, sse, sse);
-decl_ipred_fns(h, 16, mmxext, sse2);
+decl_ipred_fns(h, 16, sse2, sse2);
decl_ipred_fns(dc, 16, mmxext, sse2);
decl_ipred_fns(dc_top, 16, mmxext, sse2);
decl_ipred_fns(dc_left, 16, mmxext, sse2);
@@ -72,7 +72,6 @@ av_cold void ff_vp9dsp_init_16bpp_x86(VP9DSPContext *dsp)
int cpu_flags = av_get_cpu_flags();
if (EXTERNAL_MMXEXT(cpu_flags)) {
- init_ipred_func(h, HOR, 4, 16, mmxext);
init_ipred_func(dc, DC, 4, 16, mmxext);
init_ipred_func(dc_top, TOP_DC, 4, 16, mmxext);
init_ipred_func(dc_left, LEFT_DC, 4, 16, mmxext);
@@ -94,7 +93,7 @@ av_cold void ff_vp9dsp_init_16bpp_x86(VP9DSPContext *dsp)
init_fpel_func(2, 1, 32, avg, _16, sse2);
init_fpel_func(1, 1, 64, avg, _16, sse2);
init_fpel_func(0, 1, 128, avg, _16, sse2);
- init_8_16_32_ipred_funcs(h, HOR, 16, sse2);
+ init_ipred_funcs(h, HOR, 16, sse2);
init_8_16_32_ipred_funcs(dc, DC, 16, sse2);
init_8_16_32_ipred_funcs(dc_top, TOP_DC, 16, sse2);
init_8_16_32_ipred_funcs(dc_left, LEFT_DC, 16, sse2);
diff --git a/libavcodec/x86/vp9intrapred_16bpp.asm b/libavcodec/x86/vp9intrapred_16bpp.asm
index 9ba20a986a..91eb181aa9 100644
--- a/libavcodec/x86/vp9intrapred_16bpp.asm
+++ b/libavcodec/x86/vp9intrapred_16bpp.asm
@@ -157,19 +157,19 @@ cglobal vp9_ipred_v_32x32_16, 2, 4, 4, dst, stride, l, a
jg .loop
RET
-INIT_MMX mmxext
+INIT_XMM sse2
cglobal vp9_ipred_h_4x4_16, 3, 3, 4, dst, stride, l, a
- mova m3, [lq]
+ movq m3, [lq]
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
- pshufw m0, m3, q3333
- pshufw m1, m3, q2222
- pshufw m2, m3, q1111
- pshufw m3, m3, q0000
- mova [dstq+strideq*0], m0
- mova [dstq+strideq*1], m1
- mova [dstq+strideq*2], m2
- mova [dstq+stride3q ], m3
+ pshuflw m0, m3, q3333
+ pshuflw m1, m3, q2222
+ pshuflw m2, m3, q1111
+ pshuflw m3, m3, q0000
+ movq [dstq+strideq*0], m0
+ movq [dstq+strideq*1], m1
+ movq [dstq+strideq*2], m2
+ movq [dstq+stride3q ], m3
RET
INIT_XMM sse2