This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

The following commit(s) were added to refs/heads/master by this push:
     new 270e18c364 avcodec/x86/h264: convert chroma MC MMX to SSE2
270e18c364 is described below

commit 270e18c36463655579b55005b7a7f0eea91fd2e4
Author:     Zuxy Meng <[email protected]>
AuthorDate: Sat Oct 10 21:52:31 2026 -0700
Commit:     Zuxy Meng <[email protected]>
CommitDate: Sat Oct 17 18:41:34 2026 -0700

    avcodec/x86/h264: convert chroma MC MMX to SSE2
    
    Convert the last MMX (mmxext) chroma MC functions, 8-bit mc2
    put/avg and 10-bit mc4/mc2 put/avg, to SSE2. pshufw becomes
    pshuflw (identical low half); the 10-bit MC4 macro needs no code
    change (SPLATW is dual-ISA). Dispatch moves from EXTERNAL_MMXEXT
    to EXTERNAL_SSE2.
    
    checkasm h264chroma passes. No difference in performance.
---
 libavcodec/x86/h264_chromamc.asm       | 34 +++++++++++++++++-----------------
 libavcodec/x86/h264_chromamc_10bit.asm | 30 +++++++++++++++---------------
 libavcodec/x86/h264chroma_init.c       | 29 +++++++++++++----------------
 tests/checkasm/h264chroma.c            |  4 ++--
 4 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/libavcodec/x86/h264_chromamc.asm b/libavcodec/x86/h264_chromamc.asm
index 705da95feb..9fc88029d9 100644
--- a/libavcodec/x86/h264_chromamc.asm
+++ b/libavcodec/x86/h264_chromamc.asm
@@ -1,5 +1,5 @@
 ;******************************************************************************
-;* MMX/SSSE3-optimized functions for H.264 chroma MC
+;* SSE2/SSSE3-optimized functions for H.264 chroma MC
 ;* Copyright (c) 2005 Zoltan Hidvegi <hzoli -a- hzoli -d- com>,
 ;*               2005-2008 Loren Merritt
 ;*
@@ -67,8 +67,8 @@ SECTION .text
     jne .next4rows
 %endmacro
 
-%macro chroma_mc2_mmx_func 2
-cglobal %1_%2_chroma_mc2, 6, 7, 0
+%macro chroma_mc2_sse2_func 2
+cglobal %1_%2_chroma_mc2, 6, 7, 6
     mov          r6d, r4d
     shl          r4d, 16
     sub          r4d, r6d
@@ -78,29 +78,29 @@ cglobal %1_%2_chroma_mc2, 6, 7, 0
     sub          r4d, r5d         ; x*(8-y)<<16 | (8-x)*(8-y)
 
     movd          m5, r4d
-    movd          m6, r5d
+    movd          m4, r5d
     punpckldq     m5, m5          ; mm5 = {A,B,A,B}
-    punpckldq     m6, m6          ; mm6 = {C,D,C,D}
-    pxor          m7, m7
+    punpckldq     m4, m4          ; mm4 = {C,D,C,D}
+    pxor          m3, m3
     movd          m2, [r1]
-    punpcklbw     m2, m7
-    pshufw        m2, m2, 0x94    ; mm0 = src[0,1,1,2]
+    punpcklbw     m2, m3
+    pshuflw       m2, m2, 0x94    ; mm0 = src[0,1,1,2]
 
 .nextrow:
     add           r1, r2
     movq          m1, m2
     pmaddwd       m1, m5          ; mm1 = A * src[0,1] + B * src[1,2]
     movd          m0, [r1]
-    punpcklbw     m0, m7
-    pshufw        m0, m0, 0x94    ; mm0 = src[0,1,1,2]
+    punpcklbw     m0, m3
+    pshuflw       m0, m0, 0x94    ; mm0 = src[0,1,1,2]
     movq          m2, m0
-    pmaddwd       m0, m6
+    pmaddwd       m0, m4
     paddw         m1, [rnd_2d_%2]
     paddw         m1, m0          ; mm1 += C * src[0,1] + D * src[1,2]
     psrlw         m1, 6
-    packssdw      m1, m7
-    packuswb      m1, m7
-    CHROMAMC_AVG4 m1, m3, [r0]
+    packssdw      m1, m3
+    packuswb      m1, m3
+    CHROMAMC_AVG4 m1, m0, [r0]
     movd         r5d, m1
     mov         [r0], r5w
     add           r0, r2
@@ -125,14 +125,14 @@ cglobal %1_%2_chroma_mc2, 6, 7, 0
 %endmacro
 
 
-INIT_MMX mmxext
+INIT_XMM sse2
 %define CHROMAMC_AVG  NOTHING
 %define CHROMAMC_AVG4 NOTHING
-chroma_mc2_mmx_func put, h264
+chroma_mc2_sse2_func put, h264
 
 %define CHROMAMC_AVG  DIRECT_AVG
 %define CHROMAMC_AVG4 COPY_AVG
-chroma_mc2_mmx_func avg, h264
+chroma_mc2_sse2_func avg, h264
 
 %macro chroma_mc8_ssse3_func 2-3
 cglobal %1_%2_chroma_mc8%3, 6, 7+UNIX64, 8
diff --git a/libavcodec/x86/h264_chromamc_10bit.asm 
b/libavcodec/x86/h264_chromamc_10bit.asm
index d4f92c90c7..d13d06d6a3 100644
--- a/libavcodec/x86/h264_chromamc_10bit.asm
+++ b/libavcodec/x86/h264_chromamc_10bit.asm
@@ -202,7 +202,7 @@ cglobal %1_h264_chroma_mc4_10, 6,6,7
 ;                                 int h, int mx, int my)
 ;-----------------------------------------------------------------------------
 %macro CHROMA_MC2 1
-cglobal %1_h264_chroma_mc2_10, 6,7
+cglobal %1_h264_chroma_mc2_10, 6,7,6
     mov          r6d, r4d
     shl          r4d, 16
     sub          r4d, r6d
@@ -212,24 +212,26 @@ cglobal %1_h264_chroma_mc2_10, 6,7
     sub          r4d, r5d         ; x*(8-y)<<16 | (8-x)*(8-y)
 
     movd          m5, r4d
-    movd          m6, r5d
+    movd          m4, r5d
     punpckldq     m5, m5          ; mm5 = {A,B,A,B}
-    punpckldq     m6, m6          ; mm6 = {C,D,C,D}
-    pxor          m7, m7
-    pshufw        m2, [r1], 0x94    ; mm0 = src[0,1,1,2]
+    punpckldq     m4, m4          ; mm4 = {C,D,C,D}
+    pxor          m3, m3
+    movq          m2, [r1]
+    pshuflw       m2, m2, 0x94    ; mm0 = src[0,1,1,2]
 
 .nextrow:
     add           r1, r2
     movq          m1, m2
     pmaddwd       m1, m5          ; mm1 = A * src[0,1] + B * src[1,2]
-    pshufw        m0, [r1], 0x94    ; mm0 = src[0,1,1,2]
+    movq          m0, [r1]
+    pshuflw       m0, m0, 0x94    ; mm0 = src[0,1,1,2]
     movq          m2, m0
-    pmaddwd       m0, m6
+    pmaddwd       m0, m4
     paddw         m1, [pw_32]
     paddw         m1, m0          ; mm1 += C * src[0,1] + D * src[1,2]
     psrlw         m1, 6
-    packssdw      m1, m7
-    CHROMAMC_AVG  m1, m3, [r0]
+    packssdw      m1, m3
+    CHROMAMC_AVG  m1, m0, [r0]
     movd        [r0], m1
     add           r0, r2
     dec          r3d
@@ -247,23 +249,21 @@ cglobal %1_h264_chroma_mc2_10, 6,7
 %endmacro
 
 %define CHROMAMC_AVG  NOTHING
-INIT_XMM sse2
-CHROMA_MC8 put
 %if HAVE_AVX_EXTERNAL
 INIT_XMM avx
 CHROMA_MC8 put
 %endif
-INIT_MMX mmxext
+INIT_XMM sse2
+CHROMA_MC8 put
 CHROMA_MC4 put
 CHROMA_MC2 put
 
 %define CHROMAMC_AVG  AVG
-INIT_XMM sse2
-CHROMA_MC8 avg
 %if HAVE_AVX_EXTERNAL
 INIT_XMM avx
 CHROMA_MC8 avg
 %endif
-INIT_MMX mmxext
+INIT_XMM sse2
+CHROMA_MC8 avg
 CHROMA_MC4 avg
 CHROMA_MC2 avg
diff --git a/libavcodec/x86/h264chroma_init.c b/libavcodec/x86/h264chroma_init.c
index 6eb52746ad..6a5d24614d 100644
--- a/libavcodec/x86/h264chroma_init.c
+++ b/libavcodec/x86/h264chroma_init.c
@@ -24,9 +24,9 @@
 #include "libavutil/x86/cpu.h"
 #include "libavcodec/h264chroma.h"
 
-void ff_put_h264_chroma_mc2_mmxext   (uint8_t *dst, const uint8_t *src,
+void ff_put_h264_chroma_mc2_sse2     (uint8_t *dst, const uint8_t *src,
                                       ptrdiff_t stride, int h, int x, int y);
-void ff_avg_h264_chroma_mc2_mmxext   (uint8_t *dst, const uint8_t *src,
+void ff_avg_h264_chroma_mc2_sse2     (uint8_t *dst, const uint8_t *src,
                                       ptrdiff_t stride, int h, int x, int y);
 
 void ff_put_h264_chroma_mc8_rnd_ssse3(uint8_t *dst, const uint8_t *src,
@@ -44,10 +44,10 @@ void ff_ ## OP ## _h264_chroma_mc ## NUM ## _ ## DEPTH ## _ 
## OPT      \
                                      (uint8_t *dst, const uint8_t *src, \
                                       ptrdiff_t stride, int h, int x, int y);
 
-CHROMA_MC(put, 2, 10, mmxext)
-CHROMA_MC(avg, 2, 10, mmxext)
-CHROMA_MC(put, 4, 10, mmxext)
-CHROMA_MC(avg, 4, 10, mmxext)
+CHROMA_MC(put, 2, 10, sse2)
+CHROMA_MC(avg, 2, 10, sse2)
+CHROMA_MC(put, 4, 10, sse2)
+CHROMA_MC(avg, 4, 10, sse2)
 CHROMA_MC(put, 8, 10, sse2)
 CHROMA_MC(avg, 8, 10, sse2)
 CHROMA_MC(put, 8, 10, avx)
@@ -58,19 +58,16 @@ av_cold void ff_h264chroma_init_x86(H264ChromaContext *c, 
int bit_depth)
     int high_bit_depth = bit_depth > 8;
     int cpu_flags      = av_get_cpu_flags();
 
-    if (EXTERNAL_MMXEXT(cpu_flags) && !high_bit_depth) {
-        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_mmxext;
-        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_mmxext;
-    }
-
-    if (EXTERNAL_MMXEXT(cpu_flags) && bit_depth > 8 && bit_depth <= 10) {
-        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_10_mmxext;
-        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_10_mmxext;
-        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_10_mmxext;
-        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_10_mmxext;
+    if (EXTERNAL_SSE2(cpu_flags) && !high_bit_depth) {
+        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_sse2;
+        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_sse2;
     }
 
     if (EXTERNAL_SSE2(cpu_flags) && bit_depth > 8 && bit_depth <= 10) {
+        c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_10_sse2;
+        c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_10_sse2;
+        c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_10_sse2;
+        c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_10_sse2;
         c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_10_sse2;
         c->avg_h264_chroma_pixels_tab[0] = ff_avg_h264_chroma_mc8_10_sse2;
     }
diff --git a/tests/checkasm/h264chroma.c b/tests/checkasm/h264chroma.c
index 5115b8b3f1..5697b2b2d8 100644
--- a/tests/checkasm/h264chroma.c
+++ b/tests/checkasm/h264chroma.c
@@ -46,8 +46,8 @@ static void check_chroma_mc(void)
     DECLARE_ALIGNED_16(uint8_t, dst0)[16 * 18 * 2];
     DECLARE_ALIGNED_16(uint8_t, dst1)[16 * 18 * 2];
 
-    declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, const uint8_t *src,
-                      ptrdiff_t stride, int h, int x, int y);
+    declare_func(void, uint8_t *dst, const uint8_t *src,
+                 ptrdiff_t stride, int h, int x, int y);
 
     for (int bit_depth = 8; bit_depth <= 10; bit_depth++) {
         ff_h264chroma_init(&h, bit_depth);

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to