Commit 678bc6291a for ffmpeg
commit 678bc6291a10dd997deceee84041fd4e9be0bb59
Author: Zuxy Meng <zuxy.meng@gmail.com>
Date: Mon Nov 2 20:08:38 2026 -0800
avcodec/x86/vp9: convert v_8x8 and tm_4x4 predictors MMX to XMM
Convert ff_vp9_ipred_v_8x8 (plain 8-byte row copies) from MMX
to SSE and ff_vp9_ipred_tm_4x4 from MMX/SSSE3 to XMM/SSSE3,
keeping the _ssse3 name for the latter.
Benchmarks (checkasm, Zen 4, pinned, median of 3, cycles):
vp9_vert_8x8: 1.2 -> 1.2 (measurement floor, plain copies)
vp9_tm_4x4_ssse3: 9.3 -> 9.7 (1.04x, noise)
checkasm --test=vp9dsp passes (1272/1272, fresh build).
Signed-off-by: Zuxy Meng <zuxy.meng@gmail.com>
diff --git a/libavcodec/x86/vp9dsp_init.c b/libavcodec/x86/vp9dsp_init.c
index 7b2fd27203..d259009c80 100644
--- a/libavcodec/x86/vp9dsp_init.c
+++ b/libavcodec/x86/vp9dsp_init.c
@@ -155,7 +155,7 @@ void ff_vp9_ipred_##type##_##size##x##size##_##opt(uint8_t *dst, ptrdiff_t strid
ipred_func(4, hd, mmxext);
ipred_func(4, vl, mmxext);
-ipred_func(8, v, mmx);
+ipred_func(8, v, sse);
#define ipred_dc_funcs(size, opt) \
ipred_func(size, dc, opt); \
@@ -271,7 +271,6 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
dsp->itxfm_add[4 /* lossless */][DCT_ADST] =
dsp->itxfm_add[4 /* lossless */][ADST_ADST] = ff_vp9_iwht_iwht_4x4_add_mmx;
}
- init_ipred(8, mmx, v, VERT);
}
if (EXTERNAL_MMXEXT(cpu_flags)) {
@@ -287,6 +286,7 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
init_fpel_func(2, 0, 16, put, , sse);
init_fpel_func(1, 0, 32, put, , sse);
init_fpel_func(0, 0, 64, put, , sse);
+ init_ipred(8, sse, v, VERT);
init_ipred(16, sse, v, VERT);
init_ipred(32, sse, v, VERT);
}
diff --git a/libavcodec/x86/vp9intrapred.asm b/libavcodec/x86/vp9intrapred.asm
index 4f1ee85c98..147f3bad68 100644
--- a/libavcodec/x86/vp9intrapred.asm
+++ b/libavcodec/x86/vp9intrapred.asm
@@ -327,20 +327,21 @@ INIT_XMM ssse3
DC_1D_16to32_FUNCS top, a
DC_1D_16to32_FUNCS left, l
-INIT_MMX mmx
-cglobal vp9_ipred_v_8x8, 4, 4, 0, dst, stride, l, a
- movq m0, [aq]
+INIT_XMM sse
+cglobal vp9_ipred_v_8x8, 4, 4, 1, dst, stride, l, a
+ xorps m0, m0
+ movlps m0, [aq]
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
- movq [dstq+strideq*0], m0
- movq [dstq+strideq*1], m0
- movq [dstq+strideq*2], m0
- movq [dstq+stride3q ], m0
+ movlps [dstq+strideq*0], m0
+ movlps [dstq+strideq*1], m0
+ movlps [dstq+strideq*2], m0
+ movlps [dstq+stride3q ], m0
lea dstq, [dstq+strideq*4]
- movq [dstq+strideq*0], m0
- movq [dstq+strideq*1], m0
- movq [dstq+strideq*2], m0
- movq [dstq+stride3q ], m0
+ movlps [dstq+strideq*0], m0
+ movlps [dstq+strideq*1], m0
+ movlps [dstq+strideq*2], m0
+ movlps [dstq+stride3q ], m0
RET
INIT_XMM sse
@@ -513,8 +514,8 @@ H_XMM_FUNCS 4, 8
INIT_XMM avx
H_XMM_FUNCS 4, 8
-INIT_MMX ssse3
-cglobal vp9_ipred_tm_4x4, 4, 4, 0, dst, stride, l, a
+INIT_XMM ssse3
+cglobal vp9_ipred_tm_4x4, 4, 4, 5, dst, stride, l, a
pxor m1, m1
movd m0, [aq]
pinsrw m2, [aq-1], 0