Commit 2d482a888a for ffmpeg
commit 2d482a888a4e5d82fdafa24f9915dbae2f4832e8
Author: Zuxy Meng <zuxy.meng@gmail.com>
Date: Mon Nov 2 21:04:28 2026 -0800
avcodec/x86/vp9: convert dr/vr/hu 4x4 predictors MMX to XMM
Convert the last three 8-bit 4x4 directional predictors from
MMX/MMXEXT to XMM registers. vr and hu keep the _ssse3 symbol
names (they use pshufb/pmulhrsw); dr uses only SSE2
instructions once palignr is eliminated, so it is _sse2 from
the start.
Benchmarks (checkasm, Zen 4, pinned to CPU 3, median of
3 interleaved pairs, cycles; 10/12bpp lines unchanged):
vp9_diag_downright_4x4_8bpp_sse2: 1.6 -> 1.6
vp9_vert_right_4x4_8bpp_ssse3: 9.6 -> 8.9
vp9_hor_up_4x4_8bpp_ssse3: 2.3 -> 2.2
checkasm --test=vp9dsp passes (1272/1272 over 6 seeds),
Signed-off-by: Zuxy Meng <zuxy.meng@gmail.com>
diff --git a/libavcodec/x86/vp9dsp_init.c b/libavcodec/x86/vp9dsp_init.c
index 7bba68d359..3e8e1fc8ca 100644
--- a/libavcodec/x86/vp9dsp_init.c
+++ b/libavcodec/x86/vp9dsp_init.c
@@ -192,7 +192,7 @@ ipred_dir_tm_h_funcs(size, opt)
ipred_dc_funcs(4, ssse3);
ipred_func(4, tm, ssse3);
ipred_func(4, dl, ssse3);
-ipred_func(4, dr, ssse3);
+ipred_func(4, dr, sse2);
ipred_func(4, hd, sse2);
ipred_func(4, hu, ssse3);
ipred_func(4, vl, sse2);
@@ -324,6 +324,7 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
init_dir_tm_h_ipred(16, sse2);
init_dir_tm_h_ipred(32, sse2);
init_ipred(4, sse2, h, HOR);
+ init_ipred(4, sse2, dr, DIAG_DOWN_RIGHT);
init_ipred(4, sse2, vl, VERT_LEFT);
init_ipred(4, sse2, hd, HOR_DOWN);
}
@@ -350,7 +351,6 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
init_lpf(ssse3);
init_dc_ipred(4, ssse3);
init_ipred(4, ssse3, dl, DIAG_DOWN_LEFT);
- init_ipred(4, ssse3, dr, DIAG_DOWN_RIGHT);
init_ipred(4, ssse3, hu, HOR_UP);
init_ipred(4, ssse3, tm, TM_VP8);
init_ipred(4, ssse3, vr, VERT_RIGHT);
diff --git a/libavcodec/x86/vp9intrapred.asm b/libavcodec/x86/vp9intrapred.asm
index 710e59de80..e300bd50e5 100644
--- a/libavcodec/x86/vp9intrapred.asm
+++ b/libavcodec/x86/vp9intrapred.asm
@@ -56,9 +56,9 @@ pb_2to6_11x7: db 2, 3, 4, 5, 6
pb_1toE_2xF: db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15
pb_2toE_3xF: db 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15
pb_13456_3xm1: db 1, 3, 4, 5, 6
- times 3 db -1
+ times 11 db -1
pb_6012_4xm1: db 6, 0, 1, 2
- times 4 db -1
+ times 12 db -1
pb_6xm1_246_8toE: times 6 db -1
db 2, 4, 6, 8, 9, 10, 11, 12, 13, 14
pb_6xm1_BDF_0to6: times 6 db -1
@@ -68,7 +68,7 @@ pb_02468ACE_13579BDF: db 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15
pb_15x0_1xm1: times 15 db 0
db -1
pb_0to2_5x3: db 0, 1, 2
- times 5 db 3
+ times 13 db 3
pb_6xm1_2x0: times 6 db -1
times 2 db 0
pb_6x0_2xm1: times 6 db 0
@@ -898,16 +898,18 @@ DL_XMM_FUNCS
; dr
-INIT_MMX ssse3
-cglobal vp9_ipred_dr_4x4, 4, 4, 0, dst, stride, l, a
+INIT_XMM sse2
+cglobal vp9_ipred_dr_4x4, 4, 4, 4, dst, stride, l, a
movd m0, [lq]
- punpckldq m0, [aq-1]
+ movd m1, [aq-1]
+ punpckldq m0, m1
movd m1, [aq+3]
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
- palignr m1, m0, 1
- psrlq m2, m1, 8
- LOWPASS 0, 1, 2, 3
+ punpcklqdq m2, m0, m1
+ psrldq m2, 1
+ psrlq m1, m2, 8
+ LOWPASS 0, 2, 1, 3
movd [dstq+stride3q ], m0
psrlq m0, 8
@@ -1194,15 +1196,18 @@ VL_XMM_FUNCS
; vr
-INIT_MMX ssse3
-cglobal vp9_ipred_vr_4x4, 4, 4, 0, dst, stride, l, a
+INIT_XMM ssse3
+cglobal vp9_ipred_vr_4x4, 4, 4, 5, dst, stride, l, a
movq m1, [aq-1]
- punpckldq m2, [lq]
+ movq m4, [lq]
+ punpckldq m2, m4
movd m0, [aq]
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
pavgb m0, m1
- palignr m1, m2, 5
+ psrlq m2, 40
+ psllq m1, 24
+ por m1, m2
psrlq m2, m1, 8
psllq m3, m1, 8
LOWPASS 2, 1, 3, 4
@@ -1600,8 +1605,8 @@ HD_XMM_FUNCS
INIT_XMM avx
HD_XMM_FUNCS
-INIT_MMX ssse3
-cglobal vp9_ipred_hu_4x4, 3, 3, 0, dst, stride, l
+INIT_XMM ssse3
+cglobal vp9_ipred_hu_4x4, 3, 3, 4, dst, stride, l
movd m0, [lq]
pshufb m0, [pb_0to2_5x3]
psrlq m1, m0, 8
@@ -1610,12 +1615,12 @@ cglobal vp9_ipred_hu_4x4, 3, 3, 0, dst, stride, l
pavgb m1, m0
DEFINE_ARGS dst, stride, stride3
lea stride3q, [strideq*3]
- SBUTTERFLY bw, 1, 2, 0
- palignr m2, m1, 2
+ punpcklbw m1, m2
+ psrldq m2, m1, 2
movd [dstq+strideq*0], m1
movd [dstq+strideq*1], m2
- punpckhdq m1, m1
- punpckhdq m2, m2
+ psrlq m1, 32
+ psrlq m2, 32
movd [dstq+strideq*2], m1
movd [dstq+stride3q ], m2
RET