PR #23744 opened by zuxy
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23744
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23744.patch

Convert all remaining use of MMX registers in h264_intrapred.asm to SSE2.


>From fbb6b52156b8cb445c36cd292c1d305267b2af12 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Mon, 27 Apr 2026 22:40:15 -0700
Subject: [PATCH 01/10] avcodec/x86/h264_intrapred: SSE2 impl. of
 pred8x8l_vertical_8

Deprecate MMX. Remove the SSSE3 impl. since we no longer use palignr.

pred8x8l_vertical_8_mmxext:                              7.4 ( 3.61x)
pred8x8l_vertical_8_ssse3:                               6.6 ( 4.03x)
pred8x8l_vertical_8_sse2:                                6.3 ( 4.19x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 58 +++++++++++-----------------
 libavcodec/x86/h264_intrapred_init.c |  6 +--
 2 files changed, 24 insertions(+), 40 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 6dc941eb02..841ee9255e 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1030,51 +1030,37 @@ PRED8x8L_HORIZONTAL
 ;                             ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_VERTICAL 0
-cglobal pred8x8l_vertical_8, 4,4
+INIT_XMM sse2
+cglobal pred8x8l_vertical_8, 4,4,5
     sub          r0, r3
-    movq        mm0, [r0-8]
-    movq        mm3, [r0]
-    movq        mm1, [r0+8]
-    movq        mm2, mm3
-    movq        mm4, mm3
-    PALIGNR     mm2, mm0, 7, mm0
-    PALIGNR     mm1, mm4, 1, mm4
+    movu         m2, [r0-8]
+    movu         m3, [r0]
+    mova         m1, m3
+    psrldq       m2, 7
+    psrldq       m1, 1
     test        r1d, r1d ; top_left
-    jz .fix_lt_2
-    test        r2d, r2d ; top_right
-    jz .fix_tr_1
-    jmp .body
-.fix_lt_2:
-    movq        mm5, mm3
-    pxor        mm5, mm2
-    psllq       mm5, 56
-    psrlq       mm5, 56
-    pxor        mm2, mm5
+    jnz .check_tr
+    pxor         m4, m3, m2
+    psllq        m4, 56
+    psrlq        m4, 56
+    pxor         m2, m4
+.check_tr:
     test        r2d, r2d ; top_right
     jnz .body
-.fix_tr_1:
-    movq        mm5, mm3
-    pxor        mm5, mm1
-    psrlq       mm5, 56
-    psllq       mm5, 56
-    pxor        mm1, mm5
+    pxor         m4, m3, m1
+    psrlq        m4, 56
+    psllq        m4, 56
+    pxor         m1, m4
 .body:
-    PRED4x4_LOWPASS mm3, mm2, mm1, mm3, mm5
+    PRED4x4_LOWPASS m3, m2, m1, m3, m4
 %rep 3
-    movq [r0+r3*1], mm3
-    movq [r0+r3*2], mm3
+    movq  [r0+r3*1], m3
+    movq  [r0+r3*2], m3
     lea    r0, [r0+r3*2]
 %endrep
-    movq [r0+r3*1], mm3
-    movq [r0+r3*2], mm3
+    movq  [r0+r3*1], m3
+    movq  [r0+r3*2], m3
     RET
-%endmacro
-
-INIT_MMX mmxext
-PRED8x8L_VERTICAL
-INIT_MMX ssse3
-PRED8x8L_VERTICAL
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_down_left_8(uint8_t *src, int has_topleft,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index ebcbe0891d..5cc83d17c7 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -130,8 +130,7 @@ PRED8x8L(top_dc, 8, sse2)
 PRED8x8L(dc, 8, sse2)
 PRED8x8L(horizontal, 8, mmxext)
 PRED8x8L(horizontal, 8, ssse3)
-PRED8x8L(vertical, 8, mmxext)
-PRED8x8L(vertical, 8, ssse3)
+PRED8x8L(vertical, 8, sse2)
 PRED8x8L(down_left, 8, sse2)
 PRED8x8L(down_left, 8, ssse3)
 PRED8x8L(down_right, 8, sse2)
@@ -165,7 +164,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
     if (bit_depth == 8) {
         if (EXTERNAL_MMXEXT(cpu_flags)) {
             h->pred8x8l [HOR_PRED               ] = 
ff_pred8x8l_horizontal_8_mmxext;
-            h->pred8x8l [VERT_PRED              ] = 
ff_pred8x8l_vertical_8_mmxext;
             h->pred8x8l [HOR_UP_PRED            ] = 
ff_pred8x8l_horizontal_up_8_mmxext;
             h->pred4x4  [DIAG_DOWN_RIGHT_PRED   ] = 
ff_pred4x4_down_right_8_mmxext;
             h->pred4x4  [VERT_RIGHT_PRED        ] = 
ff_pred4x4_vertical_right_8_mmxext;
@@ -197,6 +195,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_sse2;
             h->pred8x8l [DC_PRED              ] = ff_pred8x8l_dc_8_sse2;
             h->pred8x8l [TOP_DC_PRED          ] = ff_pred8x8l_top_dc_8_sse2;
+            h->pred8x8l [VERT_PRED            ] = ff_pred8x8l_vertical_8_sse2;
             h->pred8x8l [DIAG_DOWN_LEFT_PRED  ] = ff_pred8x8l_down_left_8_sse2;
             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_sse2;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_sse2;
@@ -232,7 +231,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             if (chroma_format_idc <= 1)
                 h->pred8x8  [HOR_PRED8x8      ] = 
ff_pred8x8_horizontal_8_ssse3;
             h->pred8x8l [HOR_PRED             ] = 
ff_pred8x8l_horizontal_8_ssse3;
-            h->pred8x8l [VERT_PRED            ] = ff_pred8x8l_vertical_8_ssse3;
             h->pred8x8l [DIAG_DOWN_LEFT_PRED  ] = 
ff_pred8x8l_down_left_8_ssse3;
             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_ssse3;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_ssse3;
-- 
2.52.0


>From 269ad8f0f9adce0c8f2658c6877635fe3e186c33 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Tue, 26 May 2026 20:47:44 -0700
Subject: [PATCH 02/10] avcodec/x86/h264_intrapred: SSE2 impl. of
 pred8x8l_horizontal_8

Deprecate MMX. Remove the SSSE3 impl. since we no longer use palignr. No
change in performance.

pred8x8l_horizontal_8_mmxext:                           16.2 ( 1.44x)
pred8x8l_horizontal_8_ssse3:                            15.6 ( 1.50x)
pred8x8l_horizontal_8_sse2:                             15.8 ( 1.49x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 101 +++++++++++++--------------
 libavcodec/x86/h264_intrapred_init.c |   6 +-
 2 files changed, 51 insertions(+), 56 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 841ee9255e..599b147758 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -958,72 +958,69 @@ cglobal pred8x8l_dc_8, 4,5,6
 ;                               int has_topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_HORIZONTAL 0
-cglobal pred8x8l_horizontal_8, 4,4
+INIT_XMM sse2
+cglobal pred8x8l_horizontal_8, 4,4,6
     sub          r0, r3
     lea          r2, [r0+r3*2]
-    movq        mm0, [r0+r3*1-8]
+    movd         m0, [r0+r3*1-4]
     test        r1d, r1d
     lea          r1, [r0+r3]
     cmovnz       r1, r0
-    punpckhbw   mm0, [r1+r3*0-8]
-    movq        mm1, [r2+r3*1-8]
-    punpckhbw   mm1, [r0+r3*2-8]
+    movd         m4, [r1+r3*0-4]
+    punpcklbw    m0, m4
+    movd         m1, [r2+r3*1-4]
+    movd         m4, [r0+r3*2-4]
+    punpcklbw    m1, m4
     mov          r2, r0
-    punpckhwd   mm1, mm0
+    punpcklwd    m1, m0
     lea          r0, [r0+r3*4]
-    movq        mm2, [r0+r3*1-8]
-    punpckhbw   mm2, [r0+r3*0-8]
+    movd         m2, [r0+r3*1-4]
+    movd         m4, [r0+r3*0-4]
+    punpcklbw    m2, m4
     lea          r0, [r0+r3*2]
-    movq        mm3, [r0+r3*1-8]
-    punpckhbw   mm3, [r0+r3*0-8]
-    punpckhwd   mm3, mm2
-    punpckhdq   mm3, mm1
+    movd         m3, [r0+r3*1-4]
+    movd         m4, [r0+r3*0-4]
+    punpcklbw    m3, m4
+    punpcklwd    m3, m2
+    punpckhdq    m3, m1
+    pshufd       m3, m3, 0xee
     lea          r0, [r0+r3*2]
-    movq        mm0, [r0+r3*0-8]
-    movq        mm1, [r1+r3*0-8]
+    movq         m0, [r0+r3*0-8]
+    movq         m1, [r1+r3*0-8]
     mov          r0, r2
-    movq        mm4, mm3
-    movq        mm2, mm3
-    PALIGNR     mm4, mm0, 7, mm0
-    PALIGNR     mm1, mm2, 1, mm2
-    movq        mm0, mm4
-    PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
-    movq        mm4, mm0
-    movq        mm7, mm2
-    PRED4x4_LOWPASS mm4, mm3, mm0, mm4, mm5
-    psllq       mm4, 56
-    PALIGNR     mm7, mm4, 7, mm3
-    movq        mm3, mm7
+    mova         m2, m3
+    punpcklqdq   m0, m3
+    psrldq       m0, 7
+    mova         m4, m0
+    punpcklqdq   m2, m1
+    psrldq       m2, 1
+    PRED4x4_LOWPASS m1, m2, m4, m3, m5
+    mova        m4, m0
+    PRED4x4_LOWPASS m2, m3, m0, m4, m5
+    psllq       m2, 56
+    punpcklqdq  m2, m1
+    psrldq      m2, 7
     lea         r1, [r0+r3*2]
-    movq       mm7, mm3
-    punpckhbw  mm3, mm3
-    punpcklbw  mm7, mm7
-    pshufw     mm0, mm3, 0xff
-    pshufw     mm1, mm3, 0xaa
+    punpcklbw   m2, m2
+    pshufhw     m0, m2, 0xff
+    pshufhw     m1, m2, 0xaa
     lea         r2, [r1+r3*2]
-    pshufw     mm2, mm3, 0x55
-    pshufw     mm3, mm3, 0x00
-    pshufw     mm4, mm7, 0xff
-    pshufw     mm5, mm7, 0xaa
-    pshufw     mm6, mm7, 0x55
-    pshufw     mm7, mm7, 0x00
-    movq [r0+r3*1], mm0
-    movq [r0+r3*2], mm1
-    movq [r1+r3*1], mm2
-    movq [r1+r3*2], mm3
-    movq [r2+r3*1], mm4
-    movq [r2+r3*2], mm5
+    pshufhw     m3, m2, 0x55
+    pshufhw     m4, m2, 0x00
+    movhps   [r0+r3*1], m0
+    movhps   [r0+r3*2], m1
+    movhps   [r1+r3*1], m3
+    movhps   [r1+r3*2], m4
+    pshuflw     m0, m2, 0xff
+    pshuflw     m1, m2, 0xaa
+    pshuflw     m3, m2, 0x55
+    pshuflw     m4, m2, 0x00
+    movq [r2+r3*1], m0
+    movq [r2+r3*2], m1
     lea         r0, [r2+r3*2]
-    movq [r0+r3*1], mm6
-    movq [r0+r3*2], mm7
+    movq [r0+r3*1], m3
+    movq [r0+r3*2], m4
     RET
-%endmacro
-
-INIT_MMX mmxext
-PRED8x8L_HORIZONTAL
-INIT_MMX ssse3
-PRED8x8L_HORIZONTAL
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_vertical_8(uint8_t *src, int has_topleft, int has_topright,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index 5cc83d17c7..bd69e192ee 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -128,8 +128,7 @@ PRED8x8(tm_vp8, 8, ssse3)
 
 PRED8x8L(top_dc, 8, sse2)
 PRED8x8L(dc, 8, sse2)
-PRED8x8L(horizontal, 8, mmxext)
-PRED8x8L(horizontal, 8, ssse3)
+PRED8x8L(horizontal, 8, sse2)
 PRED8x8L(vertical, 8, sse2)
 PRED8x8L(down_left, 8, sse2)
 PRED8x8L(down_left, 8, ssse3)
@@ -163,7 +162,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
 
     if (bit_depth == 8) {
         if (EXTERNAL_MMXEXT(cpu_flags)) {
-            h->pred8x8l [HOR_PRED               ] = 
ff_pred8x8l_horizontal_8_mmxext;
             h->pred8x8l [HOR_UP_PRED            ] = 
ff_pred8x8l_horizontal_up_8_mmxext;
             h->pred4x4  [DIAG_DOWN_RIGHT_PRED   ] = 
ff_pred4x4_down_right_8_mmxext;
             h->pred4x4  [VERT_RIGHT_PRED        ] = 
ff_pred4x4_vertical_right_8_mmxext;
@@ -193,6 +191,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
         if (EXTERNAL_SSE2(cpu_flags)) {
             h->pred16x16[HOR_PRED8x8          ] = 
ff_pred16x16_horizontal_8_sse2;
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_sse2;
+            h->pred8x8l [HOR_PRED             ] = 
ff_pred8x8l_horizontal_8_sse2;
             h->pred8x8l [DC_PRED              ] = ff_pred8x8l_dc_8_sse2;
             h->pred8x8l [TOP_DC_PRED          ] = ff_pred8x8l_top_dc_8_sse2;
             h->pred8x8l [VERT_PRED            ] = ff_pred8x8l_vertical_8_sse2;
@@ -230,7 +229,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_ssse3;
             if (chroma_format_idc <= 1)
                 h->pred8x8  [HOR_PRED8x8      ] = 
ff_pred8x8_horizontal_8_ssse3;
-            h->pred8x8l [HOR_PRED             ] = 
ff_pred8x8l_horizontal_8_ssse3;
             h->pred8x8l [DIAG_DOWN_LEFT_PRED  ] = 
ff_pred8x8l_down_left_8_ssse3;
             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_ssse3;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_ssse3;
-- 
2.52.0


>From e77cf1c01b5210dbc1610d76ad777731bb4fccca Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Wed, 27 May 2026 22:35:45 -0700
Subject: [PATCH 03/10] avcodec/x86/h264_intrapred: SSE2 impl. of
 pred8x8l_horizontal_up_8

Deprecate MMX. Remove the SSSE3 impl. since we no longer use palignr and
SSE2 is faster.

pred8x8l_horizontal_up_8_mmxext:                        27.1 ( 2.30x)
pred8x8l_horizontal_up_8_ssse3:                         23.9 ( 2.60x)
pred8x8l_horizontal_up_8_sse2:                          20.9 ( 2.96x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 132 +++++++++++++--------------
 libavcodec/x86/h264_intrapred_init.c |   6 +-
 2 files changed, 66 insertions(+), 72 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 599b147758..ecaafce649 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1485,88 +1485,84 @@ PRED8x8L_VERTICAL_LEFT
 ;                                  int has_topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_HORIZONTAL_UP 0
-cglobal pred8x8l_horizontal_up_8, 4,4
+INIT_XMM sse2
+cglobal pred8x8l_horizontal_up_8, 4,4,6
     sub          r0, r3
     lea          r2, [r0+r3*2]
-    movq        mm0, [r0+r3*1-8]
+    movd         m0, [r0+r3*1-4]
     test        r1d, r1d
     lea          r1, [r0+r3]
     cmovnz       r1, r0
-    punpckhbw   mm0, [r1+r3*0-8]
-    movq        mm1, [r2+r3*1-8]
-    punpckhbw   mm1, [r0+r3*2-8]
+    movd         m4, [r1+r3*0-4]
+    punpcklbw    m0, m4
+    movd         m1, [r2+r3*1-4]
+    movd         m4, [r0+r3*2-4]
+    punpcklbw    m1, m4
     mov          r2, r0
-    punpckhwd   mm1, mm0
+    punpcklwd    m1, m0
     lea          r0, [r0+r3*4]
-    movq        mm2, [r0+r3*1-8]
-    punpckhbw   mm2, [r0+r3*0-8]
+    movd         m2, [r0+r3*1-4]
+    movd         m4, [r0+r3*0-4]
+    punpcklbw    m2, m4
     lea          r0, [r0+r3*2]
-    movq        mm3, [r0+r3*1-8]
-    punpckhbw   mm3, [r0+r3*0-8]
-    punpckhwd   mm3, mm2
-    punpckhdq   mm3, mm1
+    movd         m3, [r0+r3*1-4]
+    movd         m4, [r0+r3*0-4]
+    punpcklbw    m3, m4
+    punpcklwd    m3, m2
+    punpckhdq    m3, m1
+    pshufd       m3, m3, 0xee
     lea          r0, [r0+r3*2]
-    movq        mm0, [r0+r3*0-8]
-    movq        mm1, [r1+r3*0-8]
+    movq         m0, [r0+r3*0-8]
+    movq         m1, [r1+r3*0-8]
     mov          r0, r2
-    movq        mm4, mm3
-    movq        mm2, mm3
-    PALIGNR     mm4, mm0, 7, mm0
-    PALIGNR     mm1, mm2, 1, mm2
-    movq       mm0, mm4
-    PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
-    movq       mm1, mm0
-    movq       mm7, mm2
-    PRED4x4_LOWPASS mm1, mm3, mm0, mm1, mm5
-    psllq      mm1, 56
-    PALIGNR    mm7, mm1, 7, mm3
+    mova         m2, m3
+    punpcklqdq   m0, m3
+    psrldq       m0, 7
+    punpcklqdq   m2, m1
+    psrldq       m2, 1
+    mova         m4, m0
+    PRED4x4_LOWPASS m1, m2, m4, m3, m5
+    mova        m4, m0
+    PRED4x4_LOWPASS m2, m3, m0, m4, m5
+    psllq       m2, 56
+    punpcklqdq  m2, m1
+    psrldq      m2, 7
     lea         r1, [r0+r3*2]
-    pshufw     mm0, mm7, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
-    psllq      mm7, 56             ; l7 .. .. .. .. .. .. ..
-    movq       mm2, mm0
-    psllw      mm0, 8
-    psrlw      mm2, 8
-    por        mm2, mm0            ; l7 l6 l5 l4 l3 l2 l1 l0
-    movq       mm3, mm2
-    movq       mm4, mm2
-    movq       mm5, mm2
-    psrlq      mm2, 8
-    psrlq      mm3, 16
+    pshuflw     m1, m2, 00011011b
+    psllq       m2, 56
+    psllw       m0, m1, 8
+    psrlw       m1, 8
+    por         m1, m0
     lea         r2, [r1+r3*2]
-    por        mm2, mm7            ; l7 l7 l6 l5 l4 l3 l2 l1
-    punpckhbw  mm7, mm7
-    por        mm3, mm7            ; l7 l7 l7 l6 l5 l4 l3 l2
-    pavgb      mm4, mm2
-    PRED4x4_LOWPASS mm1, mm3, mm5, mm2, mm6
-    movq       mm5, mm4
-    punpcklbw  mm4, mm1            ; p4 p3 p2 p1
-    punpckhbw  mm5, mm1            ; p8 p7 p6 p5
-    movq       mm6, mm5
-    movq       mm7, mm5
-    movq       mm0, mm5
-    PALIGNR    mm5, mm4, 2, mm1
-    pshufw     mm1, mm6, 11111001b
-    PALIGNR    mm6, mm4, 4, mm2
-    pshufw     mm2, mm7, 11111110b
-    PALIGNR    mm7, mm4, 6, mm3
-    pshufw     mm3, mm0, 11111111b
-    movq [r0+r3*1], mm4
-    movq [r0+r3*2], mm5
+    mova        m3, m1
+    mova        m4, m1
+    mova        m5, m1
+    psrlq       m1, 8
+    por         m1, m2
+    pavgb       m4, m1
+    psrlq       m3, 16
+    punpcklbw   m2, m2
+    pshufd      m2, m2, 0xee
+    por         m3, m2
+    PRED4x4_LOWPASS m2, m3, m5, m1, m0
+    punpcklbw   m4, m2
+    pshufd      m0, m4, 0xee
+    psrldq      m5, m4, 2
+    psrldq      m2, m4, 4
+    psrldq      m3, m4, 6
+    movq [r0+r3*1], m4
+    movq [r0+r3*2], m5
     lea         r0, [r2+r3*2]
-    movq [r1+r3*1], mm6
-    movq [r1+r3*2], mm7
-    movq [r2+r3*1], mm0
-    movq [r2+r3*2], mm1
-    movq [r0+r3*1], mm2
-    movq [r0+r3*2], mm3
+    movq [r1+r3*1], m2
+    movq [r1+r3*2], m3
+    pshuflw     m1, m0, 11111001b
+    pshuflw     m2, m0, 11111110b
+    pshuflw     m3, m0, 11111111b
+    movq [r2+r3*1], m0
+    movq [r2+r3*2], m1
+    movq [r0+r3*1], m2
+    movq [r0+r3*2], m3
     RET
-%endmacro
-
-INIT_MMX mmxext
-PRED8x8L_HORIZONTAL_UP
-INIT_MMX ssse3
-PRED8x8L_HORIZONTAL_UP
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_horizontal_down_8(uint8_t *src, int has_topleft,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index bd69e192ee..8ee79b5260 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -138,8 +138,7 @@ PRED8x8L(vertical_right, 8, sse2)
 PRED8x8L(vertical_right, 8, ssse3)
 PRED8x8L(vertical_left, 8, sse2)
 PRED8x8L(vertical_left, 8, ssse3)
-PRED8x8L(horizontal_up, 8, mmxext)
-PRED8x8L(horizontal_up, 8, ssse3)
+PRED8x8L(horizontal_up, 8, sse2)
 PRED8x8L(horizontal_down, 8, sse2)
 PRED8x8L(horizontal_down, 8, ssse3)
 
@@ -162,7 +161,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
 
     if (bit_depth == 8) {
         if (EXTERNAL_MMXEXT(cpu_flags)) {
-            h->pred8x8l [HOR_UP_PRED            ] = 
ff_pred8x8l_horizontal_up_8_mmxext;
             h->pred4x4  [DIAG_DOWN_RIGHT_PRED   ] = 
ff_pred4x4_down_right_8_mmxext;
             h->pred4x4  [VERT_RIGHT_PRED        ] = 
ff_pred4x4_vertical_right_8_mmxext;
             h->pred4x4  [HOR_DOWN_PRED          ] = 
ff_pred4x4_horizontal_down_8_mmxext;
@@ -199,6 +197,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_sse2;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_sse2;
             h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_sse2;
+            h->pred8x8l [HOR_UP_PRED          ] = 
ff_pred8x8l_horizontal_up_8_sse2;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_sse2;
             if (chroma_format_idc <= 1) {
                 h->pred8x8  [HOR_PRED8x8      ] = ff_pred8x8_horizontal_8_sse2;
@@ -233,7 +232,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_ssse3;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_ssse3;
             h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_ssse3;
-            h->pred8x8l [HOR_UP_PRED          ] = 
ff_pred8x8l_horizontal_up_8_ssse3;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_ssse3;
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
                 h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_ssse3;
-- 
2.52.0


>From 5301ddc3de6af1cf0626965d4a9f3a61f4f837c2 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Thu, 28 May 2026 19:23:54 -0700
Subject: [PATCH 04/10] avcodec/x86/h264_intrapred: SSE2 impl. of
 pred8x8_dc_rv40_8

Deprecate MMX. No change in performance. Also add test coverage in
checkasm.

pred8x8_dc_rv40_mmxext:                                 10.0 ( 1.24x)
pred8x8_dc_rv40_sse2:                                   10.0 ( 1.24x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 21 +++++++++++----------
 libavcodec/x86/h264_intrapred_init.c |  4 ++--
 tests/checkasm/h264pred.c            |  1 +
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index ecaafce649..88abb7f8f2 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -710,15 +710,16 @@ cglobal pred8x8_dc_8, 2,5,5
 ; void ff_pred8x8_dc_rv40_8(uint8_t *src, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred8x8_dc_rv40_8, 2,7
+INIT_XMM sse2
+cglobal pred8x8_dc_rv40_8, 2,7,2
     mov       r4, r0
     sub       r0, r1
-    pxor      mm0, mm0
-    psadbw    mm0, [r0]
+    movq      m1, [r0]
+    pxor      m0, m0
+    psadbw    m0, m1
     dec        r0
     movzx     r5d, byte [r0+r1*1]
-    movd      r6d, mm0
+    movd      r6d, m0
     lea        r0, [r0+r1*2]
 %rep 3
     movzx     r2d, byte [r0+r1*0]
@@ -731,13 +732,13 @@ cglobal pred8x8_dc_rv40_8, 2,7
     add       r5d, r6d
     lea       r2d, [r2+r5+8]
     shr       r2d, 4
-    movd      mm0, r2d
-    punpcklbw mm0, mm0
-    pshufw    mm0, mm0, 0
+    movd       m0, r2d
+    punpcklbw  m0, m0
+    pshuflw    m0, m0, 0
     mov       r3d, 4
 .loop:
-    movq [r4+r1*0], mm0
-    movq [r4+r1*1], mm0
+    movq [r4+r1*0], m0
+    movq [r4+r1*1], m0
     lea   r4, [r4+r1*2]
     dec   r3d
     jg .loop
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index 8ee79b5260..027746a8f9 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -115,7 +115,7 @@ PRED16x16(tm_vp8, 8, sse2)
 PRED16x16(tm_vp8, 8, avx2)
 
 PRED8x8(top_dc, 8, sse2)
-PRED8x8(dc_rv40, 8, mmxext)
+PRED8x8(dc_rv40, 8, sse2)
 PRED8x8(dc, 8, sse2)
 PRED8x8(vertical, 8, sse2)
 PRED8x8(horizontal, 8, sse2)
@@ -176,7 +176,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
                 h->pred4x4  [HOR_UP_PRED        ] = 
ff_pred4x4_horizontal_up_8_mmxext;
             }
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
-                h->pred8x8  [DC_PRED8x8         ] = 
ff_pred8x8_dc_rv40_8_mmxext;
                 h->pred4x4  [TM_VP8_PRED        ] = ff_pred4x4_tm_vp8_8_mmxext;
                 h->pred4x4  [VERT_PRED          ] = 
ff_pred4x4_vertical_vp8_8_mmxext;
             }
@@ -210,6 +209,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
                 h->pred16x16[PLANE_PRED8x8    ] = ff_pred16x16_tm_vp8_8_sse2;
                 h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_sse2;
+                h->pred8x8  [DC_PRED8x8       ] = ff_pred8x8_dc_rv40_8_sse2;
             } else {
                 if (chroma_format_idc <= 1)
                     h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_plane_8_sse2;
diff --git a/tests/checkasm/h264pred.c b/tests/checkasm/h264pred.c
index 53e1cdb219..f4538a3562 100644
--- a/tests/checkasm/h264pred.c
+++ b/tests/checkasm/h264pred.c
@@ -80,6 +80,7 @@ static const char * const pred8x8_modes[4][11] = {
         [ALZHEIMER_DC_0L0_PRED8x8] = "mad_cow_dc_0l0",
     },
     { /* VP8 */
+        [DC_PRED8x8    ] = "dc_rv40",
         [PLANE_PRED8x8 ] = "tm_vp8",
         [DC_127_PRED8x8] = "dc_127_vp8",
         [DC_129_PRED8x8] = "dc_129_vp8",
-- 
2.52.0


>From cb9d426e4ebf4ff4eee534653d22eca6d6eda8a7 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Fri, 29 May 2026 22:28:24 -0700
Subject: [PATCH 05/10] avcodec/x86/h264_intrapred: Deprecate MMX from
 pred8x8l_down_right_8

Convert use of MMX to SSE2, also remove the SSSE3 impl. since we no
longer use palignr

Before:
 pred8x8l_down_right_8_sse2:                             26.4 ( 3.26x)
 pred8x8l_down_right_8_ssse3:                            23.0 ( 3.74x)

After:
 pred8x8l_down_right_8_sse2:                             19.7 ( 4.33x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 146 ++++++++++++---------------
 libavcodec/x86/h264_intrapred_init.c |   3 -
 2 files changed, 66 insertions(+), 83 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 88abb7f8f2..e60c1aa474 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1158,99 +1158,91 @@ PRED8x8L_DOWN_LEFT
 ;                               int has_topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_DOWN_RIGHT 0
-cglobal pred8x8l_down_right_8, 4,5
+INIT_XMM sse2
+cglobal pred8x8l_down_right_8, 4,5,7
     sub          r0, r3
     lea          r4, [r0+r3*2]
-    movq        mm0, [r0+r3*1-8]
-    punpckhbw   mm0, [r0+r3*0-8]
-    movq        mm1, [r4+r3*1-8]
-    punpckhbw   mm1, [r0+r3*2-8]
+    movd       xmm0, [r0+r3*1-4]
+    movd       xmm4, [r0+r3*0-4]
+    punpcklbw  xmm0, xmm4
+    movd       xmm1, [r4+r3*1-4]
+    movd       xmm4, [r0+r3*2-4]
+    punpcklbw  xmm1, xmm4
     mov          r4, r0
-    punpckhwd   mm1, mm0
+    punpcklwd  xmm1, xmm0
     lea          r0, [r0+r3*4]
-    movq        mm2, [r0+r3*1-8]
-    punpckhbw   mm2, [r0+r3*0-8]
+    movd       xmm2, [r0+r3*1-4]
+    movd       xmm4, [r0+r3*0-4]
+    punpcklbw  xmm2, xmm4
     lea          r0, [r0+r3*2]
-    movq        mm3, [r0+r3*1-8]
-    punpckhbw   mm3, [r0+r3*0-8]
-    punpckhwd   mm3, mm2
-    punpckhdq   mm3, mm1
+    movd       xmm3, [r0+r3*1-4]
+    movd       xmm4, [r0+r3*0-4]
+    punpcklbw  xmm3, xmm4
+    punpcklwd  xmm3, xmm2
+    punpckhdq  xmm3, xmm1
+    pshufd     xmm3, xmm3, 0xee
     lea          r0, [r0+r3*2]
-    movq        mm0, [r0+r3*0-8]
-    movq        mm1, [r4]
+    movq       xmm0, [r0+r3*0-8]
+    movq       xmm1, [r4]
     mov          r0, r4
-    movq        mm4, mm3
-    movq        mm2, mm3
-    PALIGNR     mm4, mm0, 7, mm0
-    PALIGNR     mm1, mm2, 1, mm2
+    mova       xmm2, xmm3
+    punpcklqdq xmm0, xmm3
+    psrldq     xmm4, xmm0, 7
+    punpcklqdq xmm2, xmm1
+    psrldq     xmm1, xmm2, 1
     test        r1d, r1d
-    jz .fix_lt_1
-    jmp .do_left
+    jnz .do_left
 .fix_lt_1:
-    movq        mm5, mm3
-    pxor        mm5, mm4
-    psrlq       mm5, 56
-    psllq       mm5, 48
-    pxor        mm1, mm5
-    jmp .do_left
+    pxor       xmm5, xmm3, xmm4
+    psrlq      xmm5, 56
+    psllq      xmm5, 48
+    pxor       xmm1, xmm5
+.do_left:
+    mova       xmm0, xmm4
+    PRED4x4_LOWPASS xmm2, xmm1, xmm4, xmm3, xmm5
+    mova       xmm4, xmm0
+    movq       xmm6, xmm2
+    PRED4x4_LOWPASS xmm1, xmm3, xmm0, xmm4, xmm5
+    psllq      xmm1, 56
+    punpcklqdq xmm1, xmm2
+    psrldq     xmm1, 7
+    mova       xmm0, xmm1
+    movu       xmm2, [r0-8]
+    movu       xmm1, [r0]
+    mova       xmm3, xmm1
+    psrldq     xmm2, 7
+    psrldq     xmm1, 1
+    jnz .check_tr
 .fix_lt_2:
-    movq        mm5, mm3
-    pxor        mm5, mm2
-    psllq       mm5, 56
-    psrlq       mm5, 56
-    pxor        mm2, mm5
+    pxor       xmm5, xmm3, xmm2
+    psllq      xmm5, 56
+    psrlq      xmm5, 56
+    pxor       xmm2, xmm5
+.check_tr:
     test        r2d, r2d
     jnz .do_top
 .fix_tr_1:
-    movq        mm5, mm3
-    pxor        mm5, mm1
-    psrlq       mm5, 56
-    psllq       mm5, 56
-    pxor        mm1, mm5
-    jmp .do_top
-.do_left:
-    movq        mm0, mm4
-    PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
-    movq        mm1, mm0
-    movq        mm7, mm2
-    movq2dq    xmm3, mm2
-    PRED4x4_LOWPASS mm1, mm3, mm0, mm1, mm5
-    psllq       mm1, 56
-    PALIGNR     mm7, mm1, 7, mm3
-    movq2dq    xmm1, mm7
-    movq        mm0, [r0-8]
-    movq        mm3, [r0]
-    movq        mm1, [r0+8]
-    movq        mm2, mm3
-    movq        mm4, mm3
-    PALIGNR     mm2, mm0, 7, mm0
-    PALIGNR     mm1, mm4, 1, mm4
-    test        r1d, r1d
-    jz .fix_lt_2
-    test        r2d, r2d
-    jz .fix_tr_1
+    pxor       xmm5, xmm3, xmm1
+    psrlq      xmm5, 56
+    psllq      xmm5, 56
+    pxor       xmm1, xmm5
 .do_top:
-    PRED4x4_LOWPASS mm3, mm2, mm1, mm3, mm5
-    movq2dq   xmm4, mm3
+    PRED4x4_LOWPASS xmm4, xmm2, xmm1, xmm3, xmm5
     lea         r1, [r0+r3*2]
-    movdqa    xmm0, xmm3
+    movdqa    xmm1, xmm6
     pslldq    xmm4, 8
-    por       xmm3, xmm4
+    por       xmm6, xmm4
     lea         r2, [r1+r3*2]
     pslldq    xmm4, 1
-    por       xmm1, xmm4
-    psrldq    xmm0, 7
-    pslldq    xmm0, 15
-    psrldq    xmm0, 7
-    por       xmm1, xmm0
+    por       xmm0, xmm4
+    psrldq    xmm1, 7
+    pslldq    xmm1, 15
+    psrldq    xmm1, 7
+    por       xmm0, xmm1
     lea         r0, [r2+r3*2]
-    movdqa    xmm2, xmm3
-    psrldq    xmm2, 1
-INIT_XMM cpuname
-    PRED4x4_LOWPASS xmm3, xmm1, xmm2, xmm3, xmm4
-    movdqa    xmm1, xmm3
-    psrldq    xmm1, 1
+    psrldq    xmm2, xmm6, 1
+    PRED4x4_LOWPASS xmm3, xmm0, xmm2, xmm6, xmm4
+    psrldq    xmm1, xmm3, 1
     movq [r0+r3*2], xmm3
     movq [r0+r3*1], xmm1
     psrldq    xmm3, 2
@@ -1266,12 +1258,6 @@ INIT_XMM cpuname
     movq [r4+r3*2], xmm3
     movq [r4+r3*1], xmm1
     RET
-%endmacro
-
-INIT_MMX sse2
-PRED8x8L_DOWN_RIGHT
-INIT_MMX ssse3
-PRED8x8L_DOWN_RIGHT
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_vertical_right_8(uint8_t *src, int has_topleft,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index 027746a8f9..64a0f63bf6 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -133,7 +133,6 @@ PRED8x8L(vertical, 8, sse2)
 PRED8x8L(down_left, 8, sse2)
 PRED8x8L(down_left, 8, ssse3)
 PRED8x8L(down_right, 8, sse2)
-PRED8x8L(down_right, 8, ssse3)
 PRED8x8L(vertical_right, 8, sse2)
 PRED8x8L(vertical_right, 8, ssse3)
 PRED8x8L(vertical_left, 8, sse2)
@@ -228,8 +227,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_ssse3;
             if (chroma_format_idc <= 1)
                 h->pred8x8  [HOR_PRED8x8      ] = 
ff_pred8x8_horizontal_8_ssse3;
-            h->pred8x8l [DIAG_DOWN_LEFT_PRED  ] = 
ff_pred8x8l_down_left_8_ssse3;
-            h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = 
ff_pred8x8l_down_right_8_ssse3;
             h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_ssse3;
             h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_ssse3;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_ssse3;
-- 
2.52.0


>From 2c4e4871c72156c0ce897a565606274fcde1c9b1 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sat, 30 May 2026 13:00:02 -0700
Subject: [PATCH 06/10] avcodec/x86/h264_intrapred: Deprecate MMX from
 pred8x8l_vertical_right_8

Convert use of MMX to SSE2, also remove the SSSE3 impl. since we no
longer use palignr

Before:
 pred8x8l_vertical_right_8_sse2:                         24.1 ( 3.51x)
 pred8x8l_vertical_right_8_ssse3:                        20.8 ( 4.07x)

After:
 pred8x8l_vertical_right_8_sse2:                         19.5 ( 4.38x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 112 ++++++++++++---------------
 libavcodec/x86/h264_intrapred_init.c |   2 -
 2 files changed, 50 insertions(+), 64 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index e60c1aa474..b3d7ade5ac 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1264,88 +1264,82 @@ cglobal pred8x8l_down_right_8, 4,5,7
 ;                                   int has_topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_VERTICAL_RIGHT 0
+INIT_XMM sse2
 cglobal pred8x8l_vertical_right_8, 4,5,6
     sub          r0, r3
     lea          r4, [r0+r3*2]
-    movq        mm0, [r0+r3*1-8]
-    punpckhbw   mm0, [r0+r3*0-8]
-    movq        mm1, [r4+r3*1-8]
-    punpckhbw   mm1, [r0+r3*2-8]
+    movd       xmm0, [r0+r3*1-4]
+    movd       xmm2, [r0+r3*0-4]
+    punpcklbw  xmm0, xmm2
+    movd       xmm1, [r4+r3*1-4]
+    movd       xmm3, [r0+r3*2-4]
+    punpcklbw  xmm1, xmm3
     mov          r4, r0
-    punpckhwd   mm1, mm0
+    punpcklwd  xmm1, xmm0
     lea          r0, [r0+r3*4]
-    movq        mm2, [r0+r3*1-8]
-    punpckhbw   mm2, [r0+r3*0-8]
+    movd       xmm2, [r0+r3*1-4]
+    movd       xmm5, [r0+r3*0-4]
+    punpcklbw  xmm2, xmm5
     lea          r0, [r0+r3*2]
-    movq        mm3, [r0+r3*1-8]
-    punpckhbw   mm3, [r0+r3*0-8]
-    punpckhwd   mm3, mm2
-    punpckhdq   mm3, mm1
+    movd       xmm3, [r0+r3*1-4]
+    movd       xmm5, [r0+r3*0-4]
+    punpcklbw  xmm3, xmm5
+    punpcklwd  xmm3, xmm2
+    punpckhdq  xmm3, xmm1
+    pshufd     xmm3, xmm3, 0xee
     lea          r0, [r0+r3*2]
-    movq        mm0, [r0+r3*0-8]
-    movq        mm1, [r4]
+    movq       xmm0, [r0+r3*0-8]
+    movq       xmm1, [r4]
     mov          r0, r4
-    movq        mm4, mm3
-    movq        mm2, mm3
-    PALIGNR     mm4, mm0, 7, mm0
-    PALIGNR     mm1, mm2, 1, mm2
+    punpcklqdq xmm0, xmm3
+    psrldq     xmm0, 7
+    mova       xmm4, xmm0
+    punpcklqdq xmm2, xmm3, xmm1
+    psrldq     xmm2, 1
+    mova       xmm1, xmm2
     test        r1d, r1d
     jnz .do_left
 .fix_lt_1:
-    movq        mm5, mm3
-    pxor        mm5, mm4
-    psrlq       mm5, 56
-    psllq       mm5, 48
-    pxor        mm1, mm5
-    jmp .do_left
+    pxor       xmm5, xmm3, xmm4
+    psrlq      xmm5, 56
+    psllq      xmm5, 48
+    pxor       xmm1, xmm5
+.do_left:
+    PRED4x4_LOWPASS xmm2, xmm1, xmm4, xmm3, xmm5
+    movq       xmm0, xmm2
+    movu       xmm2, [r0-8]
+    movu       xmm1, [r0]
+    mova       xmm3, xmm1
+    psrldq     xmm2, 7
+    psrldq     xmm1, 1
+    jnz .check_tr
 .fix_lt_2:
-    movq        mm5, mm3
-    pxor        mm5, mm2
-    psllq       mm5, 56
-    psrlq       mm5, 56
-    pxor        mm2, mm5
+    pxor       xmm5, xmm3, xmm2
+    psllq      xmm5, 56
+    psrlq      xmm5, 56
+    pxor       xmm2, xmm5
+.check_tr:
     test        r2d, r2d
     jnz .do_top
 .fix_tr_1:
-    movq        mm5, mm3
-    pxor        mm5, mm1
-    psrlq       mm5, 56
-    psllq       mm5, 56
-    pxor        mm1, mm5
-    jmp .do_top
-.do_left:
-    movq        mm0, mm4
-    PRED4x4_LOWPASS mm3, mm1, mm4, mm3, mm5
-    movq2dq    xmm0, mm3
-    movq        mm0, [r0-8]
-    movq        mm3, [r0]
-    movq        mm1, [r0+8]
-    movq        mm2, mm3
-    movq        mm4, mm3
-    PALIGNR     mm2, mm0, 7, mm0
-    PALIGNR     mm1, mm4, 1, mm4
-    test        r1d, r1d
-    jz .fix_lt_2
-    test        r2d, r2d
-    jz .fix_tr_1
+    pxor       xmm5, xmm3, xmm1
+    psrlq      xmm5, 56
+    psllq      xmm5, 56
+    pxor       xmm1, xmm5
 .do_top:
-    PRED4x4_LOWPASS mm3, mm2, mm1, mm3, mm5
+    PRED4x4_LOWPASS xmm4, xmm2, xmm1, xmm3, xmm5
     lea           r1, [r0+r3*2]
-    movq2dq     xmm4, mm3
     pslldq      xmm4, 8
     por         xmm0, xmm4
     movdqa      xmm1, xmm0
-    lea           r2, [r1+r3*2]
+    lea           r2, [r0+r3*4]
     movdqa      xmm2, xmm0
     movdqa      xmm3, xmm0
     pslldq      xmm0, 1
     pslldq      xmm1, 2
     pavgb       xmm2, xmm0
-INIT_XMM cpuname
     PRED4x4_LOWPASS xmm0, xmm3, xmm1, xmm0, xmm5
-    movdqa      xmm4, [pw_ff00]
-    pandn       xmm4, xmm0
+    pandn       xmm4, [pw_ff00], xmm0
     movdqa      xmm5, xmm0
     psrlw       xmm0, 8
     packuswb    xmm4, xmm0
@@ -1370,12 +1364,6 @@ INIT_XMM cpuname
     movq        [r1+r3*2], xmm5
     movq        [r1+r3*1], xmm2
     RET
-%endmacro
-
-INIT_MMX sse2
-PRED8x8L_VERTICAL_RIGHT
-INIT_MMX ssse3
-PRED8x8L_VERTICAL_RIGHT
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_vertical_left_8(uint8_t *src, int has_topleft,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index 64a0f63bf6..316d4ae4c5 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -134,7 +134,6 @@ PRED8x8L(down_left, 8, sse2)
 PRED8x8L(down_left, 8, ssse3)
 PRED8x8L(down_right, 8, sse2)
 PRED8x8L(vertical_right, 8, sse2)
-PRED8x8L(vertical_right, 8, ssse3)
 PRED8x8L(vertical_left, 8, sse2)
 PRED8x8L(vertical_left, 8, ssse3)
 PRED8x8L(horizontal_up, 8, sse2)
@@ -227,7 +226,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_ssse3;
             if (chroma_format_idc <= 1)
                 h->pred8x8  [HOR_PRED8x8      ] = 
ff_pred8x8_horizontal_8_ssse3;
-            h->pred8x8l [VERT_RIGHT_PRED      ] = 
ff_pred8x8l_vertical_right_8_ssse3;
             h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_ssse3;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_ssse3;
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
-- 
2.52.0


>From d5670bb34f3bb2977feec6c0aaadad4e492a4042 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sat, 30 May 2026 22:07:32 -0700
Subject: [PATCH 07/10] avcodec/x86/h264_intrapred: Deprecate MMX from
 pred8x8l_vertical_left_8

Convert use of MMX to SSE2, also remove the SSSE3 impl. since we no
longer use palignr

Before:
 pred8x8l_vertical_left_8_sse2:                          17.3 ( 4.89x)
 pred8x8l_vertical_left_8_ssse3:                         15.0 ( 5.63x)

After:
 pred8x8l_vertical_left_8_sse2:                          11.8 ( 6.80x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 114 +++++++++++----------------
 libavcodec/x86/h264_intrapred_init.c |   2 -
 2 files changed, 48 insertions(+), 68 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index b3d7ade5ac..8b3b33dced 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1370,90 +1370,72 @@ cglobal pred8x8l_vertical_right_8, 4,5,6
 ;                                  int has_topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-%macro PRED8x8L_VERTICAL_LEFT 0
-cglobal pred8x8l_vertical_left_8, 4,4
+INIT_XMM sse2
+cglobal pred8x8l_vertical_left_8, 4,4,7
     sub          r0, r3
-    movq        mm0, [r0-8]
-    movq        mm3, [r0]
-    movq        mm1, [r0+8]
-    movq        mm2, mm3
-    movq        mm4, mm3
-    PALIGNR     mm2, mm0, 7, mm0
-    PALIGNR     mm1, mm4, 1, mm4
+    movu       xmm2, [r0-8]
+    movu       xmm1, [r0]
+    mova       xmm3, xmm1
+    psrldq     xmm2, 7
+    psrldq     xmm1, 1
     test        r1d, r1d
-    jz .fix_lt_2
-    test        r2d, r2d
-    jz .fix_tr_1
-    jmp .do_top
+    jnz .check_tr
 .fix_lt_2:
-    movq        mm5, mm3
-    pxor        mm5, mm2
-    psllq       mm5, 56
-    psrlq       mm5, 56
-    pxor        mm2, mm5
+    pxor       xmm5, xmm3, xmm2
+    psllq      xmm5, 56
+    psrlq      xmm5, 56
+    pxor       xmm2, xmm5
+.check_tr:
     test        r2d, r2d
     jnz .do_top
 .fix_tr_1:
-    movq        mm5, mm3
-    pxor        mm5, mm1
-    psrlq       mm5, 56
-    psllq       mm5, 56
-    pxor        mm1, mm5
-    jmp .do_top
-.fix_tr_2:
-    punpckhbw   mm3, mm3
-    pshufw      mm1, mm3, 0xFF
-    jmp .do_topright
+    pxor       xmm5, xmm3, xmm1
+    psrlq      xmm5, 56
+    psllq      xmm5, 56
+    pxor       xmm1, xmm5
 .do_top:
-    PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
-    movq2dq    xmm4, mm4
-    test        r2d, r2d
-    jz .fix_tr_2
-    movq        mm1, [r0+8]
-    movq        mm5, mm1
-    movq        mm2, mm1
-    movq        mm4, mm1
-    psrlq       mm5, 56
-    PALIGNR     mm2, mm3, 7, mm3
-    PALIGNR     mm5, mm4, 1, mm4
-    PRED4x4_LOWPASS mm1, mm2, mm5, mm1, mm4
+    PRED4x4_LOWPASS xmm4, xmm2, xmm1, xmm3, xmm5
+    movq       xmm6, xmm4
+    jnz .normal_top
+.fix_tr_2:
+    punpcklbw  xmm3, xmm3
+    pshufd     xmm3, xmm3, 0xEE
+    pshuflw    xmm1, xmm3, 0xFF
+    jmp .do_topright
+.normal_top:
+    movq       xmm0, [r0+8]
+    psrlq      xmm5, xmm0, 56
+    punpcklqdq xmm3, xmm0
+    psrldq     xmm3, 7
+    punpcklqdq xmm4, xmm0, xmm5
+    psrldq     xmm4, 1
+    PRED4x4_LOWPASS xmm1, xmm3, xmm4, xmm0, xmm2
 .do_topright:
-    movq2dq   xmm3, mm1
     lea         r1, [r0+r3*2]
-    pslldq    xmm3, 8
-    por       xmm4, xmm3
-    movdqa    xmm2, xmm4
-    movdqa    xmm1, xmm4
-    movdqa    xmm3, xmm4
-    psrldq    xmm2, 1
-    pslldq    xmm1, 1
-    pavgb     xmm3, xmm2
-    lea         r2, [r1+r3*2]
-INIT_XMM cpuname
-    PRED4x4_LOWPASS xmm4, xmm1, xmm2, xmm4, xmm5
-    psrldq    xmm4, 1
+    lea         r2, [r0+r3*4]
+    pslldq    xmm1, 8
+    por       xmm6, xmm1
+    psrldq    xmm2, xmm6, 1
+    pslldq    xmm1, xmm6, 1
+    pavgb     xmm3, xmm6, xmm2
+    PRED4x4_LOWPASS xmm6, xmm1, xmm2, xmm6, xmm5
+    psrldq    xmm6, 1
     movq [r0+r3*1], xmm3
-    movq [r0+r3*2], xmm4
+    movq [r0+r3*2], xmm6
     lea         r0, [r2+r3*2]
     psrldq    xmm3, 1
-    psrldq    xmm4, 1
+    psrldq    xmm6, 1
     movq [r1+r3*1], xmm3
-    movq [r1+r3*2], xmm4
+    movq [r1+r3*2], xmm6
     psrldq    xmm3, 1
-    psrldq    xmm4, 1
+    psrldq    xmm6, 1
     movq [r2+r3*1], xmm3
-    movq [r2+r3*2], xmm4
+    movq [r2+r3*2], xmm6
     psrldq    xmm3, 1
-    psrldq    xmm4, 1
+    psrldq    xmm6, 1
     movq [r0+r3*1], xmm3
-    movq [r0+r3*2], xmm4
+    movq [r0+r3*2], xmm6
     RET
-%endmacro
-
-INIT_MMX sse2
-PRED8x8L_VERTICAL_LEFT
-INIT_MMX ssse3
-PRED8x8L_VERTICAL_LEFT
 
 ;-----------------------------------------------------------------------------
 ; void ff_pred8x8l_horizontal_up_8(uint8_t *src, int has_topleft,
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index 316d4ae4c5..f84b727cca 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -135,7 +135,6 @@ PRED8x8L(down_left, 8, ssse3)
 PRED8x8L(down_right, 8, sse2)
 PRED8x8L(vertical_right, 8, sse2)
 PRED8x8L(vertical_left, 8, sse2)
-PRED8x8L(vertical_left, 8, ssse3)
 PRED8x8L(horizontal_up, 8, sse2)
 PRED8x8L(horizontal_down, 8, sse2)
 PRED8x8L(horizontal_down, 8, ssse3)
@@ -226,7 +225,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_ssse3;
             if (chroma_format_idc <= 1)
                 h->pred8x8  [HOR_PRED8x8      ] = 
ff_pred8x8_horizontal_8_ssse3;
-            h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_ssse3;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_ssse3;
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
                 h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_ssse3;
-- 
2.52.0


>From 9a0e7cd78ea7ecc5d2fa3672dfec7214d2e707ee Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sat, 30 May 2026 23:48:38 -0700
Subject: [PATCH 08/10] avcodec/x86/h264_intrapred: Deprecate MMX from
 pred8x8l_horizontal_down_8

Convert use of MMX to SSE2, also add missing checkasm test.

Before:
 pred8x8l_horizontal_down_8_sse2:                        33.2 ( 2.53x)
 pred8x8l_horizontal_down_8_ssse3:                       27.8 ( 3.02x)

After:
 pred8x8l_horizontal_down_8_sse2:                        24.3 ( 3.45x)
 pred8x8l_horizontal_down_8_ssse3:                       22.6 ( 3.71x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm | 169 +++++++++++++++---------------
 tests/checkasm/h264pred.c         |   1 +
 2 files changed, 83 insertions(+), 87 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 8b3b33dced..8009eabe1b 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1527,110 +1527,100 @@ cglobal pred8x8l_horizontal_up_8, 4,4,6
 ;-----------------------------------------------------------------------------
 
 %macro PRED8x8L_HORIZONTAL_DOWN 0
-cglobal pred8x8l_horizontal_down_8, 4,5
+cglobal pred8x8l_horizontal_down_8, 4,5,8
     sub          r0, r3
     lea          r4, [r0+r3*2]
-    movq        mm0, [r0+r3*1-8]
-    punpckhbw   mm0, [r0+r3*0-8]
-    movq        mm1, [r4+r3*1-8]
-    punpckhbw   mm1, [r0+r3*2-8]
+    movd       xmm0, [r0+r3*1-4]
+    movd       xmm1, [r0+r3*0-4]
+    punpcklbw  xmm0, xmm1
+    movd       xmm1, [r4+r3*1-4]
+    movd       xmm2, [r0+r3*2-4]
+    punpcklbw  xmm1, xmm2
     mov          r4, r0
-    punpckhwd   mm1, mm0
+    punpcklwd  xmm1, xmm0
     lea          r0, [r0+r3*4]
-    movq        mm2, [r0+r3*1-8]
-    punpckhbw   mm2, [r0+r3*0-8]
+    movd       xmm2, [r0+r3*1-4]
+    movd       xmm3, [r0+r3*0-4]
+    punpcklbw  xmm2, xmm3
     lea          r0, [r0+r3*2]
-    movq        mm3, [r0+r3*1-8]
-    punpckhbw   mm3, [r0+r3*0-8]
-    punpckhwd   mm3, mm2
-    punpckhdq   mm3, mm1
+    movd       xmm3, [r0+r3*1-4]
+    movd       xmm4, [r0+r3*0-4]
+    punpcklbw  xmm3, xmm4
+    punpcklwd  xmm3, xmm2
+    punpckhdq  xmm3, xmm1
+    pshufd     xmm3, xmm3, 0xee
     lea          r0, [r0+r3*2]
-    movq        mm0, [r0+r3*0-8]
-    movq        mm1, [r4]
+    movq       xmm0, [r0+r3*0-8]
+    movq       xmm1, [r4]
     mov          r0, r4
-    movq        mm4, mm3
-    movq        mm2, mm3
-    PALIGNR     mm4, mm0, 7, mm0
-    PALIGNR     mm1, mm2, 1, mm2
+    mova       xmm2, xmm3
+    punpcklqdq xmm0, xmm3
+    psrldq     xmm0, 7
+    mova       xmm4, xmm0
+    punpcklqdq xmm2, xmm1
+    psrldq     xmm2, 1
+    mova       xmm1, xmm2
     test        r1d, r1d
     jnz .do_left
 .fix_lt_1:
-    movq        mm5, mm3
-    pxor        mm5, mm4
-    psrlq       mm5, 56
-    psllq       mm5, 48
-    pxor        mm1, mm5
-    jmp .do_left
+    pxor       xmm5, xmm3, xmm4
+    psrlq      xmm5, 56
+    psllq      xmm5, 48
+    pxor       xmm1, xmm5
+.do_left:
+    PRED4x4_LOWPASS xmm2, xmm1, xmm4, xmm3, xmm5
+    movq       xmm6, xmm2
+    pslldq     xmm6, 8
+    mova       xmm4, xmm0
+    PRED4x4_LOWPASS xmm1, xmm3, xmm0, xmm4, xmm5
+    pslldq     xmm2, xmm1, 15
+    psrldq     xmm2, 8
+    por        xmm6, xmm2
+    movdqu     xmm2, [r0-8]
+    movdqu     xmm1, [r0]
+    mova       xmm3, xmm1
+    psrldq     xmm2, 7
+    psrldq     xmm1, 1
+    test        r1d, r1d
+    jnz .check_r2
 .fix_lt_2:
-    movq        mm5, mm3
-    pxor        mm5, mm2
-    psllq       mm5, 56
-    psrlq       mm5, 56
-    pxor        mm2, mm5
+    pxor       xmm5, xmm3, xmm2
+    psllq      xmm5, 56
+    psrlq      xmm5, 56
+    pxor       xmm2, xmm5
+.check_r2:
     test        r2d, r2d
     jnz .do_top
 .fix_tr_1:
-    movq        mm5, mm3
-    pxor        mm5, mm1
-    psrlq       mm5, 56
-    psllq       mm5, 56
-    pxor        mm1, mm5
-    jmp .do_top
-.fix_tr_2:
-    punpckhbw   mm3, mm3
-    pshufw      mm1, mm3, 0xFF
-    jmp .do_topright
-.do_left:
-    movq        mm0, mm4
-    PRED4x4_LOWPASS mm2, mm1, mm4, mm3, mm5
-    movq2dq    xmm0, mm2
-    pslldq     xmm0, 8
-    movq        mm1, mm0
-    PRED4x4_LOWPASS mm1, mm3, mm0, mm1, mm5
-    movq2dq    xmm2, mm1
-    pslldq     xmm2, 15
-    psrldq     xmm2, 8
-    por        xmm0, xmm2
-    movq        mm0, [r0-8]
-    movq        mm3, [r0]
-    movq        mm1, [r0+8]
-    movq        mm2, mm3
-    movq        mm4, mm3
-    PALIGNR     mm2, mm0, 7, mm0
-    PALIGNR     mm1, mm4, 1, mm4
-    test        r1d, r1d
-    jz .fix_lt_2
-    test        r2d, r2d
-    jz .fix_tr_1
+    pxor       xmm5, xmm3, xmm1
+    psrlq      xmm5, 56
+    psllq      xmm5, 56
+    pxor       xmm1, xmm5
 .do_top:
-    PRED4x4_LOWPASS mm4, mm2, mm1, mm3, mm5
-    movq2dq    xmm1, mm4
+    PRED4x4_LOWPASS xmm7, xmm2, xmm1, xmm3, xmm5
     test        r2d, r2d
     jz .fix_tr_2
-    movq        mm1, [r0+8]
-    movq        mm5, mm1
-    movq        mm2, mm1
-    movq        mm4, mm1
-    psrlq       mm5, 56
-    PALIGNR     mm2, mm3, 7, mm3
-    PALIGNR     mm5, mm4, 1, mm4
-    PRED4x4_LOWPASS mm1, mm2, mm5, mm1, mm4
+    movq       xmm0, [r0+8]
+    psrlq      xmm5, xmm0, 56
+    punpcklqdq xmm3, xmm0
+    psrldq     xmm3, 7
+    punpcklqdq xmm4, xmm0, xmm5
+    psrldq     xmm4, 1
+    PRED4x4_LOWPASS xmm1, xmm3, xmm4, xmm0, xmm4
 .do_topright:
-    movq2dq    xmm5, mm1
-    pslldq     xmm5, 8
-    por        xmm1, xmm5
-INIT_XMM cpuname
+    movq       xmm0, xmm1
+    pslldq     xmm0, 8
+    por        xmm7, xmm0
     lea         r2, [r4+r3*2]
-    movdqa    xmm2, xmm1
-    movdqa    xmm3, xmm1
-    PALIGNR   xmm1, xmm0, 7, xmm4
-    PALIGNR   xmm2, xmm0, 9, xmm5
-    lea         r1, [r2+r3*2]
-    PALIGNR   xmm3, xmm0, 8, xmm0
-    movdqa    xmm4, xmm1
-    pavgb     xmm4, xmm3
-    lea         r0, [r1+r3*2]
-    PRED4x4_LOWPASS xmm3, xmm1, xmm2, xmm3, xmm5
+    movdqa    xmm2, xmm7
+    movdqa    xmm3, xmm7
+    PALIGNR   xmm7, xmm6, 7, xmm4
+    PALIGNR   xmm2, xmm6, 9, xmm0
+    lea         r1, [r4+r3*4]
+    PALIGNR   xmm3, xmm6, 8, xmm6
+    pavgb     xmm4, xmm7, xmm3
+    lea         r0, [r2+r3*4]
+    PRED4x4_LOWPASS xmm3, xmm7, xmm2, xmm3, xmm5
     punpcklbw xmm4, xmm3
     movhlps   xmm3, xmm4
     movq   [r0+r3*2], xmm4
@@ -1648,11 +1638,16 @@ INIT_XMM cpuname
     movq   [r1+r3*1], xmm4
     movq   [r4+r3*1], xmm3
     RET
+.fix_tr_2:
+    punpcklbw  xmm3, xmm3
+    pshufd     xmm3, xmm3, 0xEE
+    pshuflw    xmm1, xmm3, 0xFF
+    jmp .do_topright
 %endmacro
 
-INIT_MMX sse2
+INIT_XMM sse2
 PRED8x8L_HORIZONTAL_DOWN
-INIT_MMX ssse3
+INIT_XMM ssse3
 PRED8x8L_HORIZONTAL_DOWN
 
 
;-------------------------------------------------------------------------------
diff --git a/tests/checkasm/h264pred.c b/tests/checkasm/h264pred.c
index f4538a3562..2a61384a36 100644
--- a/tests/checkasm/h264pred.c
+++ b/tests/checkasm/h264pred.c
@@ -40,6 +40,7 @@ static const char * const pred4x4_modes[4][15] = {
         [HOR_DOWN_PRED       ] = "horizontal_right",
         [VERT_LEFT_PRED      ] = "vertical_left",
         [HOR_UP_PRED         ] = "horizontal_up",
+        [HOR_DOWN_PRED       ] = "horizontal_down",
         [LEFT_DC_PRED        ] = "left_dc",
         [TOP_DC_PRED         ] = "top_dc",
         [DC_128_PRED         ] = "dc_128",
-- 
2.52.0


>From e5b84654a8721584ac54a300de9e571f803ac266 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sun, 31 May 2026 01:38:46 -0700
Subject: [PATCH 09/10] avcodec/x86/h264_intrapred: Deprecate MMX from
 pred16x16_dc_8

Convert use of MMX to SSE2; no change in performance.

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 8009eabe1b..2de58c647a 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -113,17 +113,16 @@ PRED16x16_H
 ;-----------------------------------------------------------------------------
 
 %macro PRED16x16_DC 0
-cglobal pred16x16_dc_8, 2,7
+cglobal pred16x16_dc_8, 2,7,2
     mov       r4, r0
     sub       r0, r1
-    pxor      mm0, mm0
-    pxor      mm1, mm1
-    psadbw    mm0, [r0+0]
-    psadbw    mm1, [r0+8]
+    pxor      m0, m0
+    psadbw    m0, [r0]
+    psrldq    m1, m0, 8
     dec        r0
     movzx     r5d, byte [r0+r1*1]
-    paddw     mm0, mm1
-    movd      r6d, mm0
+    paddw      m0, m1
+    movd      r6d, m0
     lea        r0, [r0+r1*2]
 %rep 7
     movzx     r2d, byte [r0+r1*0]
-- 
2.52.0


>From 067bb418d30929fdf0982b541ae0f8fd7e186da8 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sun, 31 May 2026 14:16:43 -0700
Subject: [PATCH 10/10] avcodec/x86/h264_intrapred: Deprecate MMX from all
 pred4x4 functions

Convert all use of MMX to XMM; no change in performance.

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred.asm    | 340 ++++++++++++++-------------
 libavcodec/x86/h264_intrapred_init.c |  53 ++---
 2 files changed, 203 insertions(+), 190 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred.asm 
b/libavcodec/x86/h264_intrapred.asm
index 2de58c647a..511e703863 100644
--- a/libavcodec/x86/h264_intrapred.asm
+++ b/libavcodec/x86/h264_intrapred.asm
@@ -1650,19 +1650,19 @@ INIT_XMM ssse3
 PRED8x8L_HORIZONTAL_DOWN
 
 
;-------------------------------------------------------------------------------
-; void ff_pred4x4_dc_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                             ptrdiff_t stride)
+; void ff_pred4x4_dc_8_sse2(uint8_t *src, const uint8_t *topright,
+;                           ptrdiff_t stride)
 
;-------------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_dc_8, 3,5
-    pxor   mm7, mm7
+INIT_XMM sse2
+cglobal pred4x4_dc_8, 3,5,2
+    pxor    m1, m1
     mov     r4, r0
     sub     r0, r2
-    movd   mm0, [r0]
-    psadbw mm0, mm7
+    movd    m0, [r0]
+    psadbw  m0, m1
     movzx  r1d, byte [r0+r2*1-1]
-    movd   r3d, mm0
+    movd   r3d, m0
     add    r3d, r1d
     movzx  r1d, byte [r0+r2*2-1]
     lea     r0, [r0+r2*2]
@@ -1681,16 +1681,16 @@ cglobal pred4x4_dc_8, 3,5
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_pred4x4_tm_vp8_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                 ptrdiff_t stride)
+; void ff_pred4x4_tm_vp8_8_sse2(uint8_t *src, const uint8_t *topright,
+;                               ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_tm_vp8_8, 3,6
+INIT_XMM sse2
+cglobal pred4x4_tm_vp8_8, 3,6,4
     sub        r0, r2
-    pxor      mm7, mm7
-    movd      mm0, [r0]
-    punpcklbw mm0, mm7
+    pxor       m1, m1
+    movd       m0, [r0]
+    punpcklbw  m0, m1
     movzx     r4d, byte [r0-1]
     mov       r5d, 2
 .loop:
@@ -1698,66 +1698,67 @@ cglobal pred4x4_tm_vp8_8, 3,6
     movzx     r3d, byte [r0+r2*2-1]
     sub       r1d, r4d
     sub       r3d, r4d
-    movd      mm2, r1d
-    movd      mm4, r3d
-    pshufw    mm2, mm2, 0
-    pshufw    mm4, mm4, 0
-    paddw     mm2, mm0
-    paddw     mm4, mm0
-    packuswb  mm2, mm2
-    packuswb  mm4, mm4
-    movd [r0+r2*1], mm2
-    movd [r0+r2*2], mm4
+    movd       m2, r1d
+    movd       m3, r3d
+    pshuflw    m2, m2, 0
+    pshuflw    m3, m3, 0
+    paddw      m2, m0
+    paddw      m3, m0
+    packuswb   m2, m2
+    packuswb   m3, m3
+    movd [r0+r2*1], m2
+    movd [r0+r2*2], m3
     lea        r0, [r0+r2*2]
     dec       r5d
     jg .loop
     RET
 
 INIT_XMM ssse3
-cglobal pred4x4_tm_vp8_8, 3,3
+cglobal pred4x4_tm_vp8_8, 3,3,8
     sub         r0, r2
-    movq       mm6, [tm_shuf]
-    pxor       mm1, mm1
-    movd       mm0, [r0]
-    punpcklbw  mm0, mm1
-    movd       mm7, [r0-4]
-    pshufb     mm7, mm6
+    movq        m6, [tm_shuf]
+    pxor        m1, m1
+    movd        m0, [r0]
+    punpcklbw   m0, m1
+    movd        m7, [r0-4]
+    pshufb      m7, m6
     lea         r1, [r0+r2*2]
-    movd       mm2, [r0+r2*1-4]
-    movd       mm3, [r0+r2*2-4]
-    movd       mm4, [r1+r2*1-4]
-    movd       mm5, [r1+r2*2-4]
-    pshufb     mm2, mm6
-    pshufb     mm3, mm6
-    pshufb     mm4, mm6
-    pshufb     mm5, mm6
-    psubw      mm0, mm7
-    paddw      mm2, mm0
-    paddw      mm3, mm0
-    paddw      mm4, mm0
-    paddw      mm5, mm0
-    packuswb   mm2, mm2
-    packuswb   mm3, mm3
-    packuswb   mm4, mm4
-    packuswb   mm5, mm5
-    movd [r0+r2*1], mm2
-    movd [r0+r2*2], mm3
-    movd [r1+r2*1], mm4
-    movd [r1+r2*2], mm5
+    movd        m2, [r0+r2*1-4]
+    movd        m3, [r0+r2*2-4]
+    movd        m4, [r1+r2*1-4]
+    movd        m5, [r1+r2*2-4]
+    pshufb      m2, m6
+    pshufb      m3, m6
+    pshufb      m4, m6
+    pshufb      m5, m6
+    psubw       m0, m7
+    paddw       m2, m0
+    paddw       m3, m0
+    paddw       m4, m0
+    paddw       m5, m0
+    packuswb    m2, m2
+    packuswb    m3, m3
+    packuswb    m4, m4
+    packuswb    m5, m5
+    movd [r0+r2*1], m2
+    movd [r0+r2*2], m3
+    movd [r1+r2*1], m4
+    movd [r1+r2*2], m5
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_pred4x4_vertical_vp8_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                       ptrdiff_t stride)
+; void ff_pred4x4_vertical_vp8_8_sse2(uint8_t *src, const uint8_t *topright,
+;                                     ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
+INIT_XMM sse2
 cglobal pred4x4_vertical_vp8_8, 3,3
     sub       r0, r2
     movd      m1, [r0-1]
     movd      m0, [r0]
     mova      m2, m0   ;t0 t1 t2 t3
-    punpckldq m0, [r1] ;t0 t1 t2 t3 t4 t5 t6 t7
+    movq      m4, [r1]
+    punpckldq m0, m4 ;t0 t1 t2 t3 t4 t5 t6 t7
     lea       r1, [r0+r2*2]
     psrlq     m0, 8    ;t1 t2 t3 t4
     PRED4x4_LOWPASS m2, m1, m0, m2, m4
@@ -1768,14 +1769,15 @@ cglobal pred4x4_vertical_vp8_8, 3,3
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_pred4x4_down_left_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                    ptrdiff_t stride)
+; void ff_pred4x4_down_left_8_sse2(uint8_t *src, const uint8_t *topright,
+;                                  ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
-INIT_MMX mmxext
-cglobal pred4x4_down_left_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_down_left_8, 3,3,5
     sub       r0, r2
     movq      m1, [r0]
-    punpckldq m1, [r1]
+    movq      m2, [r1]
+    punpckldq m1, m2
     movq      m2, m1
     movq      m0, m1
     psllq     m1, 8
@@ -1795,12 +1797,12 @@ cglobal pred4x4_down_left_8, 3,3
     RET
 
 ;------------------------------------------------------------------------------
-; void ff_pred4x4_vertical_left_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                        ptrdiff_t stride)
+; void ff_1_sse2(uint8_t *src, const uint8_t *topright,
+;                                      ptrdiff_t stride)
 ;------------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_vertical_left_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_vertical_left_8, 3,3,6
     sub       r0, r2
     movq      m1, [r0]
     punpckldq m1, [r1]
@@ -1812,142 +1814,160 @@ cglobal pred4x4_vertical_left_8, 3,3
     pavgb     m4, m1
     PRED4x4_LOWPASS m0, m1, m2, m0, m5
     lea       r1, [r0+r2*2]
-    movh      [r0+r2*1], m4
-    movh      [r0+r2*2], m0
+    movd      [r0+r2*1], m4
+    movd      [r0+r2*2], m0
     psrlq     m4, 8
     psrlq     m0, 8
-    movh      [r1+r2*1], m4
-    movh      [r1+r2*2], m0
+    movd      [r1+r2*1], m4
+    movd      [r1+r2*2], m0
     RET
 
 ;------------------------------------------------------------------------------
-; void ff_pred4x4_horizontal_up_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                        ptrdiff_t stride)
+; void ff_pred4x4_horizontal_up_8_sse2(uint8_t *src, const uint8_t *topright,
+;                                      ptrdiff_t stride)
 ;------------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_horizontal_up_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_horizontal_up_8, 3,3,7
     sub       r0, r2
     lea       r1, [r0+r2*2]
     movd      m0, [r0+r2*1-4]
-    punpcklbw m0, [r0+r2*2-4]
+    movd      m1, [r0+r2*2-4]
+    punpcklbw m0, m1
     movd      m1, [r1+r2*1-4]
-    punpcklbw m1, [r1+r2*2-4]
-    punpckhwd m0, m1
-    movq      m1, m0
-    punpckhbw m1, m1
-    pshufw    m1, m1, 0xFF
-    punpckhdq m0, m1
-    movq      m2, m0
-    movq      m3, m0
-    movq      m7, m0
+    movd      m2, [r1+r2*2-4]
+    punpcklbw m1, m2
+    punpcklwd m0, m1
+    pshufd    m0, m0, 0xFF
+    mova      m1, m0
+    punpcklbw m1, m1
+    pshuflw   m1, m1, 0xFF
+    punpckldq m0, m1
+    mova      m2, m0
+    mova      m3, m0
+    mova      m6, m0
     psrlq     m2, 16
     psrlq     m3, 8
-    pavgb     m7, m3
-    PRED4x4_LOWPASS m3, m0, m2, m3, m5
-    punpcklbw m7, m3
-    movd    [r0+r2*1], m7
-    psrlq    m7, 16
-    movd    [r0+r2*2], m7
-    psrlq    m7, 16
-    movd    [r1+r2*1], m7
+    pavgb     m6, m3
+    PRED4x4_LOWPASS m4, m0, m2, m3, m5
+    punpcklbw m6, m4
+    movd    [r0+r2*1], m6
+    psrlq    m6, 16
+    movd    [r0+r2*2], m6
+    psrlq    m6, 16
+    movd    [r1+r2*1], m6
     movd    [r1+r2*2], m1
     RET
 
 ;------------------------------------------------------------------------------
-; void ff_pred4x4_horizontal_down_8_mmxext(uint8_t *src,
-;                                          const uint8_t *topright,
-;                                          ptrdiff_t stride)
+; void ff_pred4x4_horizontal_down_8_sse2(uint8_t *src,
+;                                        const uint8_t *topright,
+;                                        ptrdiff_t stride)
 ;------------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_horizontal_down_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_horizontal_down_8, 3,3,6
     sub       r0, r2
     lea       r1, [r0+r2*2]
-    movh      m0, [r0-4]      ; lt ..
-    punpckldq m0, [r0]        ; t3 t2 t1 t0 lt .. .. ..
+    pxor      m0, m0
+    movhps    m0, [r0-4]      ; t3 t2 t1 t0 lt .. .. ..
     psllq     m0, 8           ; t2 t1 t0 lt .. .. .. ..
     movd      m1, [r1+r2*2-4] ; l3
-    punpcklbw m1, [r1+r2*1-4] ; l2 l3
+    movd      m2, [r1+r2*1-4]
+    punpcklbw m1, m2          ; l2 l3
     movd      m2, [r0+r2*2-4] ; l1
-    punpcklbw m2, [r0+r2*1-4] ; l0 l1
-    punpckhwd m1, m2          ; l0 l1 l2 l3
+    movd      m3, [r0+r2*1-4]
+    punpcklbw m2, m3          ; l0 l1
+    punpcklwd m1, m2          ; l0 l1 l2 l3
     punpckhdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
-    movq      m0, m1
-    movq      m2, m1
-    movq      m5, m1
-    psrlq     m0, 16          ; .. .. t2 t1 t0 lt l0 l1
-    psrlq     m2, 8           ; .. t2 t1 t0 lt l0 l1 l2
-    pavgb     m5, m2
-    PRED4x4_LOWPASS m2, m1, m0, m2, m4
-    punpcklbw m5, m2
-    psrlq     m2, 32
-    PALIGNR   m2, m5, 6, m4
-    movh      [r1+r2*2], m5
-    psrlq     m5, 16
-    movh      [r1+r2*1], m5
-    psrlq     m5, 16
-    movh      [r0+r2*2], m5
-    movh      [r0+r2*1], m2
+    pshufd    m1, m1, 0xEE
+    psrlq     m0, m1, 16      ; .. .. t2 t1 t0 lt l0 l1
+    psrlq     m2, m1, 8       ; .. t2 t1 t0 lt l0 l1 l2
+    pavgb     m5, m1, m2
+    PRED4x4_LOWPASS m3, m1, m0, m2, m4
+    punpcklbw  m5, m3
+    psrlq      m3, 32
+    mova       m0, m5
+    punpcklqdq m5, m3
+    psrldq     m5, 6
+    movd       [r1+r2*2], m0
+    psrlq      m0, 16
+    movd       [r1+r2*1], m0
+    psrlq      m0, 16
+    movd       [r0+r2*2], m0
+    movd       [r0+r2*1], m5
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_pred4x4_vertical_right_8_mmxext(uint8_t *src,
-;                                         const uint8_t *topright,
-;                                         ptrdiff_t stride)
+; void ff_pred4x4_vertical_right_8_sse2(uint8_t *src,
+;                                       const uint8_t *topright,
+;                                       ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_vertical_right_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_vertical_right_8, 3,3,6
     sub     r0, r2
     lea     r1, [r0+r2*2]
-    movh    m0, [r0]                    ; ........t3t2t1t0
-    movq    m5, m0
-    PALIGNR m0, [r0-8], 7, m1           ; ......t3t2t1t0lt
-    pavgb   m5, m0
-    PALIGNR m0, [r0+r2*1-8], 7, m1      ; ....t3t2t1t0ltl0
-    movq    m1, m0
-    PALIGNR m0, [r0+r2*2-8], 7, m2      ; ..t3t2t1t0ltl0l1
-    movq    m2, m0
-    PALIGNR m0, [r1+r2*1-8], 7, m3      ; t3t2t1t0ltl0l1l2
-    PRED4x4_LOWPASS m2, m1, m0, m2, m4
-    movq    m1, m2
-    psrlq   m2, 16
+    movd    m5, [r0]                    ; ........t3t2t1t0
+    movu    m1, [r0-8]                  ; .....t3t2t1t0lt.
+    psrldq  m1, 7                       ; ......t3t2t1t0lt
+    pavgb   m5, m1
+    movq    m2, [r0+r2*1-8]
+    punpcklqdq m2, m1
+    psrldq  m2, 7                       ; ....t3t2t1t0ltl0
+    mova    m1, m2
+    movq    m3, [r0+r2*2-8]
+    punpcklqdq m3, m2
+    psrldq  m3, 7                       ; ..t3t2t1t0ltl0l1
+    movq    m0, [r1+r2*1-8]
+    punpcklqdq m0, m3
+    psrldq  m0, 7                       ; t3t2t1t0ltl0l1l2
+    PRED4x4_LOWPASS m3, m1, m0, m3, m4
+    mova    m1, m3
+    psrlq   m3, 16
     psllq   m1, 48
-    movh    [r0+r2*1], m5
-    movh    [r0+r2*2], m2
-    PALIGNR m5, m1, 7, m3
-    psllq   m1, 8
-    movh    [r1+r2*1], m5
-    PALIGNR m2, m1, 7, m1
-    movh    [r1+r2*2], m2
+    movd    [r0+r2*1], m5
+    movd    [r0+r2*2], m3
+    mova    m2, m1
+    punpcklqdq m1, m5
+    psrldq  m1, 7
+    psllq   m2, 8
+    movd    [r1+r2*1], m1
+    punpcklqdq m2, m3
+    psrldq  m2, 7
+    movd    [r1+r2*2], m2
     RET
 
 ;-----------------------------------------------------------------------------
-; void ff_pred4x4_down_right_8_mmxext(uint8_t *src, const uint8_t *topright,
-;                                     ptrdiff_t stride)
+; void ff_pred4x4_down_right_8_sse2(uint8_t *src, const uint8_t *topright,
+;                                   ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_down_right_8, 3,3
+INIT_XMM sse2
+cglobal pred4x4_down_right_8, 3,3,5
     sub       r0, r2
     lea       r1, [r0+r2*2]
     movq      m1, [r1-8]
-    movq      m2, [r0+r2*1-8]
-    punpckhbw m2, [r0-8]
-    movh      m3, [r0]
-    punpckhwd m1, m2
-    PALIGNR   m3, m1, 5, m1
-    movq      m1, m3
-    PALIGNR   m3, [r1+r2*1-8], 7, m4
-    movq      m0, m3
-    PALIGNR   m3, [r1+r2*2-8], 7, m4
-    PRED4x4_LOWPASS m0, m3, m1, m0, m4
-    movh      [r1+r2*2], m0
+    movd      m2, [r0+r2*1-4]
+    movd      m3, [r0-4]
+    punpcklbw m2, m3
+    movd      m3, [r0]
+    punpcklwd m1, m2
+    pshufd    m1, m1, 0xEE
+    punpcklqdq m1, m3
+    psrldq     m1, 5
+    movq       m3, [r1+r2*1-8]
+    punpcklqdq m3, m1
+    psrldq     m3, 7
+    movq       m2, [r1+r2*2-8]
+    punpcklqdq m2, m3
+    psrldq     m2, 7
+    PRED4x4_LOWPASS m0, m2, m1, m3, m4
+    movd      [r1+r2*2], m0
     psrlq     m0, 8
-    movh      [r1+r2*1], m0
+    movd      [r1+r2*1], m0
     psrlq     m0, 8
-    movh      [r0+r2*2], m0
+    movd      [r0+r2*2], m0
     psrlq     m0, 8
-    movh      [r0+r2*1], m0
+    movd      [r0+r2*1], m0
     RET
diff --git a/libavcodec/x86/h264_intrapred_init.c 
b/libavcodec/x86/h264_intrapred_init.c
index f84b727cca..38d4045df9 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -139,16 +139,16 @@ PRED8x8L(horizontal_up, 8, sse2)
 PRED8x8L(horizontal_down, 8, sse2)
 PRED8x8L(horizontal_down, 8, ssse3)
 
-PRED4x4(dc, 8, mmxext)
-PRED4x4(down_left, 8, mmxext)
-PRED4x4(down_right, 8, mmxext)
-PRED4x4(vertical_left, 8, mmxext)
-PRED4x4(vertical_right, 8, mmxext)
-PRED4x4(horizontal_up, 8, mmxext)
-PRED4x4(horizontal_down, 8, mmxext)
-PRED4x4(tm_vp8, 8, mmxext)
+PRED4x4(dc, 8, sse2)
+PRED4x4(down_left, 8, sse2)
+PRED4x4(down_right, 8, sse2)
+PRED4x4(vertical_left, 8, sse2)
+PRED4x4(vertical_right, 8, sse2)
+PRED4x4(horizontal_up, 8, sse2)
+PRED4x4(horizontal_down, 8, sse2)
+PRED4x4(tm_vp8, 8, sse2)
 PRED4x4(tm_vp8, 8, ssse3)
-PRED4x4(vertical_vp8, 8, mmxext)
+PRED4x4(vertical_vp8, 8, sse2)
 
 av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
                                    const int bit_depth,
@@ -157,27 +157,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int 
codec_id,
     int cpu_flags = av_get_cpu_flags();
 
     if (bit_depth == 8) {
-        if (EXTERNAL_MMXEXT(cpu_flags)) {
-            h->pred4x4  [DIAG_DOWN_RIGHT_PRED   ] = 
ff_pred4x4_down_right_8_mmxext;
-            h->pred4x4  [VERT_RIGHT_PRED        ] = 
ff_pred4x4_vertical_right_8_mmxext;
-            h->pred4x4  [HOR_DOWN_PRED          ] = 
ff_pred4x4_horizontal_down_8_mmxext;
-            h->pred4x4  [DC_PRED                ] = ff_pred4x4_dc_8_mmxext;
-            if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8 ||
-                codec_id == AV_CODEC_ID_H264) {
-                h->pred4x4  [DIAG_DOWN_LEFT_PRED] = 
ff_pred4x4_down_left_8_mmxext;
-            }
-            if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == AV_CODEC_ID_H264) {
-                h->pred4x4  [VERT_LEFT_PRED     ] = 
ff_pred4x4_vertical_left_8_mmxext;
-            }
-            if (codec_id != AV_CODEC_ID_RV40) {
-                h->pred4x4  [HOR_UP_PRED        ] = 
ff_pred4x4_horizontal_up_8_mmxext;
-            }
-            if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
-                h->pred4x4  [TM_VP8_PRED        ] = ff_pred4x4_tm_vp8_8_mmxext;
-                h->pred4x4  [VERT_PRED          ] = 
ff_pred4x4_vertical_vp8_8_mmxext;
-            }
-        }
-
         if (EXTERNAL_SSE(cpu_flags)) {
             h->pred16x16[VERT_PRED8x8] = ff_pred16x16_vertical_8_sse;
         }
@@ -195,18 +174,32 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, 
int codec_id,
             h->pred8x8l [VERT_LEFT_PRED       ] = 
ff_pred8x8l_vertical_left_8_sse2;
             h->pred8x8l [HOR_UP_PRED          ] = 
ff_pred8x8l_horizontal_up_8_sse2;
             h->pred8x8l [HOR_DOWN_PRED        ] = 
ff_pred8x8l_horizontal_down_8_sse2;
+            h->pred4x4  [DIAG_DOWN_RIGHT_PRED ] = ff_pred4x4_down_right_8_sse2;
+            h->pred4x4  [VERT_RIGHT_PRED      ] = 
ff_pred4x4_vertical_right_8_sse2;
+            h->pred4x4  [HOR_DOWN_PRED        ] = 
ff_pred4x4_horizontal_down_8_sse2;
+            h->pred4x4  [DC_PRED              ] = ff_pred4x4_dc_8_sse2;
             if (chroma_format_idc <= 1) {
                 h->pred8x8  [HOR_PRED8x8      ] = ff_pred8x8_horizontal_8_sse2;
                 h->pred8x8  [VERT_PRED8x8     ] = ff_pred8x8_vertical_8_sse2;
                 if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == 
AV_CODEC_ID_H264) {
                     h->pred8x8 [TOP_DC_PRED8x8] = ff_pred8x8_top_dc_8_sse2;
                     h->pred8x8 [DC_PRED8x8    ] = ff_pred8x8_dc_8_sse2;
+                    h->pred4x4 [VERT_LEFT_PRED] = 
ff_pred4x4_vertical_left_8_sse2;
                 }
             }
+            if (codec_id != AV_CODEC_ID_RV40) {
+                h->pred4x4  [HOR_UP_PRED      ] = 
ff_pred4x4_horizontal_up_8_sse2;
+            }
+            if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8 ||
+                codec_id == AV_CODEC_ID_H264) {
+                h->pred4x4[DIAG_DOWN_LEFT_PRED] = ff_pred4x4_down_left_8_sse2;
+            }
             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
                 h->pred16x16[PLANE_PRED8x8    ] = ff_pred16x16_tm_vp8_8_sse2;
                 h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_sse2;
                 h->pred8x8  [DC_PRED8x8       ] = ff_pred8x8_dc_rv40_8_sse2;
+                h->pred4x4  [TM_VP8_PRED      ] = ff_pred4x4_tm_vp8_8_sse2;
+                h->pred4x4  [VERT_PRED        ] = 
ff_pred4x4_vertical_vp8_8_sse2;
             } else {
                 if (chroma_format_idc <= 1)
                     h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_plane_8_sse2;
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to