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