[PR] avcodec/x86/h264_intrapred_10bit: Replace MMX with SSE2 (PR #23976)

zuxy via ffmpeg-devel <[email protected]> Sat, 01 Aug 2026 23:47:21 -0000
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178562804213.59.5053838610508754132@29965ddac10e>
PR #23976 opened by zuxy
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23976
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23976.patch

Replace MMX implementation of pred4x4_dc_10 and pred4x4_horizontal_up_10
with SSE2.

  pred4x4_dc_10_c:                          9.7
  pred4x4_dc_10_mmxext:                     3.7 ( 2.63x)
  pred4x4_dc_10_sse2:                       3.6 ( 2.71x)

  pred4x4_horizontal_up_10_c:              13.7
  pred4x4_horizontal_up_10_mmxext:          5.5 ( 2.52x)
  pred4x4_horizontal_up_10_sse2:            4.6 ( 2.96x)

Signed-off-by: Zuxy Meng <[email protected]>

# Summary of changes

Briefly describe what this PR does and why.

<!--
If this PR requires new FATE test samples, attach them to the PR and
list their target paths below (relative to the fate-suite root).

Attached filenames must match the sample's filename:

```fate-samples
# e.g. vorbis/new-sample.ogg
```
-->



>From 84b4b9fb5490890590c016f5518158c116236afa Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sat, 1 Aug 2026 15:10:27 -0700
Subject: [PATCH] avcodec/x86/h264_intrapred_10bit: Replace MMX with SSE2

Replace MMX implementation of pred4x4_dc_10 and pred4x4_horizontal_up_10
with SSE2.

  pred4x4_dc_10_c:                          9.7
  pred4x4_dc_10_mmxext:                     3.7 ( 2.63x)
  pred4x4_dc_10_sse2:                       3.6 ( 2.71x)

  pred4x4_horizontal_up_10_c:              13.7
  pred4x4_horizontal_up_10_mmxext:          5.5 ( 2.52x)
  pred4x4_horizontal_up_10_sse2:            4.6 ( 2.96x)

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_intrapred_10bit.asm | 54 +++++++++++++------------
 libavcodec/x86/h264_intrapred_init.c    | 10 ++---
 2 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/libavcodec/x86/h264_intrapred_10bit.asm b/libavcodec/x86/h264_intrapred_10bit.asm
index 2f30807332..152a7b71e0 100644
--- a/libavcodec/x86/h264_intrapred_10bit.asm
+++ b/libavcodec/x86/h264_intrapred_10bit.asm
@@ -176,18 +176,21 @@ PRED4x4_HD
 ; void ff_pred4x4_dc_10(pixel *src, const pixel *topright, ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
 
-INIT_MMX mmxext
-cglobal pred4x4_dc_10, 3, 3
+INIT_XMM sse2
+cglobal pred4x4_dc_10, 3, 3, 3
     sub    r0, r2
     lea    r1, [r0+r2*2]
-    movq   m2, [r0+r2*1-8]
-    paddw  m2, [r0+r2*2-8]
-    paddw  m2, [r1+r2*1-8]
-    paddw  m2, [r1+r2*2-8]
-    psrlq  m2, 48
+    movzx r3d, word [r0+r2*1-2]
+    add   r3w, [r0+r2*2-2]
+    add   r3w, [r1+r2*1-2]
+    add   r3w, [r1+r2*2-2]
+    add   r3w, 4
+    movd   m2, r3d
     movq   m0, [r0]
-    HADDW  m0, m1
-    paddw  m0, [pw_4]
+    pshuflw m1, m0, q1032
+    paddw  m0, m1
+    pshuflw m1, m0, q3201
+    paddw  m0, m1
     paddw  m0, m2
     psrlw  m0, 3
     SPLATW m0, m0, 0
@@ -262,27 +265,28 @@ PRED4x4_VL
 ; void ff_pred4x4_horizontal_up_10(pixel *src, const pixel *topright,
 ;                                  ptrdiff_t stride)
 ;-----------------------------------------------------------------------------
-INIT_MMX mmxext
-cglobal pred4x4_horizontal_up_10, 3, 3
+INIT_XMM sse2
+cglobal pred4x4_horizontal_up_10, 3, 3, 5
     sub       r0, r2
     lea       r1, [r0+r2*2]
-    movq      m0, [r0+r2*1-8]
-    punpckhwd m0, [r0+r2*2-8]
-    movq      m1, [r1+r2*1-8]
-    punpckhwd m1, [r1+r2*2-8]
-    punpckhdq m0, m1
-    pshufw    m1, m1, 0xFF
+    movd      m0, [r0+r2*1-4]
+    movd      m3, [r0+r2*2-4]
+    punpcklwd m0, m3
+    movd      m1, [r1+r2*1-4]
+    movd      m3, [r1+r2*2-4]
+    punpcklwd m1, m3
+    punpckldq m0, m1
+    punpckhqdq m0, m0
+    pshuflw   m1, m1, q3333
     movq      [r1+r2*2], m1
     movd      [r1+r2*1+4], m1
-    pshufw    m2, m0, 11111001b
-    movq      m1, m2
-    pavgw     m2, m0
+    pshuflw   m1, m0, q3321
+    pavgw     m2, m1, m0
 
-    pshufw    m5, m0, 11111110b
-    PRED4x4_LOWPASS m1, m0, m5, m1
-    movq      m6, m2
-    punpcklwd m6, m1
-    movq      [r0+r2*1], m6
+    pshuflw   m4, m0, q3332
+    PRED4x4_LOWPASS m1, m0, m4, m1
+    punpcklwd m3, m2, m1
+    movq      [r0+r2*1], m3
     psrlq     m2, 16
     psrlq     m1, 16
     punpcklwd m2, m1
diff --git a/libavcodec/x86/h264_intrapred_init.c b/libavcodec/x86/h264_intrapred_init.c
index 0248f86491..98abea0b53 100644
--- a/libavcodec/x86/h264_intrapred_init.c
+++ b/libavcodec/x86/h264_intrapred_init.c
@@ -32,7 +32,7 @@ void ff_pred4x4_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, \
                                                     const uint8_t *topright, \
                                                     ptrdiff_t stride);
 
-PRED4x4(dc, 10, mmxext)
+PRED4x4(dc, 10, sse2)
 PRED4x4(down_left, 10, sse2)
 PRED4x4(down_left, 10, avx)
 PRED4x4(down_right, 10, sse2)
@@ -43,7 +43,7 @@ PRED4x4(vertical_left, 10, avx)
 PRED4x4(vertical_right, 10, sse2)
 PRED4x4(vertical_right, 10, ssse3)
 PRED4x4(vertical_right, 10, avx)
-PRED4x4(horizontal_up, 10, mmxext)
+PRED4x4(horizontal_up, 10, sse2)
 PRED4x4(horizontal_down, 10, sse2)
 PRED4x4(horizontal_down, 10, ssse3)
 PRED4x4(horizontal_down, 10, avx)
@@ -245,15 +245,13 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
             }
         }
     } else if (bit_depth == 10) {
-        if (EXTERNAL_MMXEXT(cpu_flags)) {
-            h->pred4x4[DC_PRED             ] = ff_pred4x4_dc_10_mmxext;
-            h->pred4x4[HOR_UP_PRED         ] = ff_pred4x4_horizontal_up_10_mmxext;
-        }
         if (EXTERNAL_SSE2(cpu_flags)) {
+            h->pred4x4[DC_PRED             ] = ff_pred4x4_dc_10_sse2;
             h->pred4x4[DIAG_DOWN_LEFT_PRED ] = ff_pred4x4_down_left_10_sse2;
             h->pred4x4[DIAG_DOWN_RIGHT_PRED] = ff_pred4x4_down_right_10_sse2;
             h->pred4x4[VERT_LEFT_PRED      ] = ff_pred4x4_vertical_left_10_sse2;
             h->pred4x4[VERT_RIGHT_PRED     ] = ff_pred4x4_vertical_right_10_sse2;
+            h->pred4x4[HOR_UP_PRED         ] = ff_pred4x4_horizontal_up_10_sse2;
             h->pred4x4[HOR_DOWN_PRED       ] = ff_pred4x4_horizontal_down_10_sse2;
 
             if (chroma_format_idc <= 1) {
-- 
2.52.0

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