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

Convert INIT_MMX mmxext to INIT_XMM sse2 for 8x8 L2 functions
(qpel PIXELS_L2 8 and qpeldsp PUT_NO_RND_PIXELS_L2 8) which were the
last MMX in qpel.asm/qpeldsp.asm. Performance identical.

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




>From cc857809dc52e34905b3826d482a2d66585ce484 Mon Sep 17 00:00:00 2001
From: Zuxy Meng <[email protected]>
Date: Sat, 5 Sep 2026 21:24:25 -0700
Subject: [PATCH] avcodec/x86/qpel: convert 8x8_l2 from MMX to SSE2

Convert INIT_MMX mmxext to INIT_XMM sse2 for 8x8 L2 functions
(qpel PIXELS_L2 8 and qpeldsp PUT_NO_RND_PIXELS_L2 8) which were the
last MMX in qpel.asm/qpeldsp.asm. Performance identical.

Signed-off-by: Zuxy Meng <[email protected]>
---
 libavcodec/x86/h264_qpel.c    |  2 --
 libavcodec/x86/qpel.asm       | 64 +++++++++++++++++++++++------------
 libavcodec/x86/qpel.h         | 12 +++----
 libavcodec/x86/qpeldsp.asm    | 32 ++++++++++--------
 libavcodec/x86/qpeldsp_init.c | 12 +++----
 5 files changed, 72 insertions(+), 50 deletions(-)

diff --git a/libavcodec/x86/h264_qpel.c b/libavcodec/x86/h264_qpel.c
index 0cc653c6ca..1f01583142 100644
--- a/libavcodec/x86/h264_qpel.c
+++ b/libavcodec/x86/h264_qpel.c
@@ -39,8 +39,6 @@ void ff_avg_pixels4x4_l2_mmxext(uint8_t *dst, const uint8_t 
*src1, const uint8_t
     ff_put_pixels4x4_l2_mmxext((dst), (src1), (src2), (dststride))
 #define ff_avg_pixels4x4_l2_mmxext(dst, src1, src2, dststride, src1stride) \
     ff_avg_pixels4x4_l2_mmxext((dst), (src1), (src2), (dststride))
-#define ff_put_pixels8x8_l2_sse2  ff_put_pixels8x8_l2_mmxext
-#define ff_avg_pixels8x8_l2_sse2  ff_avg_pixels8x8_l2_mmxext
 
 #define DEF_QPEL(OPNAME)\
 void ff_ ## OPNAME ## _h264_qpel4_h_lowpass_mmxext(uint8_t *dst, const uint8_t 
*src, ptrdiff_t dstStride, ptrdiff_t srcStride);\
diff --git a/libavcodec/x86/qpel.asm b/libavcodec/x86/qpel.asm
index cffab9dc91..3a1d2940a5 100644
--- a/libavcodec/x86/qpel.asm
+++ b/libavcodec/x86/qpel.asm
@@ -25,48 +25,68 @@
 
 SECTION .text
 
-%macro op_avg 2
+%macro AVG8 2
+    movq   m2, %2
+    pavgb  %1, m2
+%endmacro
+
+%macro AVG16 2
+    pavgb  %1, %2
+%endmacro
+
+%macro op_avg_8 2
+    movq   m2, %2
+    pavgb  %1, m2
+    movq   %2, %1
+%endmacro
+
+%macro op_avg_16 2
     pavgb  %1, %2
     mova   %2, %1
 %endmacro
 
-%macro op_put 2
+%macro op_put_8 2
+    movq   %2, %1
+%endmacro
+
+%macro op_put_16 2
     mova   %2, %1
 %endmacro
 
-%macro PIXELS_L2 2 ; avg vs put, size
-%define OP op_%1
-; void ff_avg/put_pixels8x8_l2_mmxext(uint8_t *dst, const uint8_t *src1, const 
uint8_t *src2,
-;                                     ptrdiff_t dstStride, ptrdiff_t 
src1Stride)
-cglobal %1_pixels%2x%2_l2, 5,6,2
+%define MOV8  movq
+%define MOV16 movu
+
+%macro PIXELS_L2 3 ; avg vs put, size
+%define OP op_%1_%2
+; void ff_avg/put_pixels8x8_l2_sse2(uint8_t *dst, const uint8_t *src1, const 
uint8_t *src2,
+;                                   ptrdiff_t dstStride, ptrdiff_t src1Stride)
+cglobal %1_pixels%2x%2_l2, 5,6,%3
     mov         r5d, %2
 .loop:
-    movu         m0, [r1]
-    movu         m1, [r1+r4]
+    MOV%2        m0, [r1]
+    MOV%2        m1, [r1+r4]
     lea          r1, [r1+2*r4]
-    pavgb        m0, [r2]
-    pavgb        m1, [r2+mmsize]
+    AVG%2        m0, [r2]
+    AVG%2        m1, [r2+%2]
     OP           m0, [r0]
     OP           m1, [r0+r3]
     lea          r0, [r0+2*r3]
-    movu         m0, [r1]
-    movu         m1, [r1+r4]
+    MOV%2        m0, [r1]
+    MOV%2        m1, [r1+r4]
     lea          r1, [r1+2*r4]
-    pavgb        m0, [r2+2*mmsize]
-    pavgb        m1, [r2+3*mmsize]
+    AVG%2        m0, [r2+2*%2]
+    AVG%2        m1, [r2+3*%2]
     OP           m0, [r0]
     OP           m1, [r0+r3]
     lea          r0, [r0+2*r3]
-    add          r2, 4*mmsize
+    add          r2, 4*%2
     sub         r5d, 4
     jne       .loop
     RET
 %endmacro
 
-INIT_MMX mmxext
-PIXELS_L2 put, 8
-PIXELS_L2 avg, 8
-
 INIT_XMM sse2
-PIXELS_L2 put, 16
-PIXELS_L2 avg, 16
+PIXELS_L2 put, 8, 3
+PIXELS_L2 avg, 8, 3
+PIXELS_L2 put, 16, 2
+PIXELS_L2 avg, 16, 2
diff --git a/libavcodec/x86/qpel.h b/libavcodec/x86/qpel.h
index b17317b64d..30030d8183 100644
--- a/libavcodec/x86/qpel.h
+++ b/libavcodec/x86/qpel.h
@@ -24,12 +24,12 @@
 #include "libavutil/attributes_internal.h"
 
 FF_VISIBILITY_PUSH_HIDDEN
-void ff_put_pixels8x8_l2_mmxext(uint8_t *dst,
-                                const uint8_t *src1, const uint8_t *src2,
-                                ptrdiff_t dstStride, ptrdiff_t src1Stride);
-void ff_avg_pixels8x8_l2_mmxext(uint8_t *dst,
-                                const uint8_t *src1, const uint8_t *src2,
-                                ptrdiff_t dstStride, ptrdiff_t src1Stride);
+void ff_put_pixels8x8_l2_sse2(uint8_t *dst,
+                              const uint8_t *src1, const uint8_t *src2,
+                              ptrdiff_t dstStride, ptrdiff_t src1Stride);
+void ff_avg_pixels8x8_l2_sse2(uint8_t *dst,
+                              const uint8_t *src1, const uint8_t *src2,
+                              ptrdiff_t dstStride, ptrdiff_t src1Stride);
 void ff_put_pixels16x16_l2_sse2(uint8_t *dst,
                                 const uint8_t *src1, const uint8_t *src2,
                                 ptrdiff_t dstStride, ptrdiff_t src1Stride);
diff --git a/libavcodec/x86/qpeldsp.asm b/libavcodec/x86/qpeldsp.asm
index f9cdee331c..4d2cdddb3a 100644
--- a/libavcodec/x86/qpeldsp.asm
+++ b/libavcodec/x86/qpeldsp.asm
@@ -44,6 +44,11 @@ coeff16_1: times 2 db 20, -6, 20, -6, -6, 20, -6, 20
 
 SECTION .text
 
+%define MOVU8  movq
+%define MOVA8  movq
+%define MOVU16 movu
+%define MOVA16 mova
+
 %macro PUT_NO_RND_PIXELS_L2 1
 ; void ff_put_no_rnd_pixels8x8_l2(uint8_t *dst, const uint8_t *src1, const 
uint8_t *src2,
 ;                                 ptrdiff_t dstStride, ptrdiff_t src1Stride)
@@ -51,12 +56,12 @@ cglobal put_no_rnd_pixels%1x%1_l2, 5,6,5
     pcmpeqb      m4, m4
     mov         r5d, %1
 .loop:
-    movu         m0, [r1]
+    MOVU%1       m0, [r1]
     add          r1, r4
-    movu         m1, [r1]
+    MOVU%1       m1, [r1]
     add          r1, r4
-    mova         m2, [r2]
-    mova         m3, [r2+%1]
+    MOVA%1       m2, [r2]
+    MOVA%1       m3, [r2+%1]
     pxor         m0, m4
     pxor         m1, m4
     pxor         m2, m4
@@ -65,16 +70,16 @@ cglobal put_no_rnd_pixels%1x%1_l2, 5,6,5
     pavgb        m1, m3
     pxor         m0, m4
     pxor         m1, m4
-    mova       [r0], m0
+    MOVA%1     [r0], m0
     add          r0, r3
-    mova       [r0], m1
+    MOVA%1     [r0], m1
     add          r0, r3
-    movu         m0, [r1]
+    MOVU%1       m0, [r1]
     add          r1, r4
-    movu         m1, [r1]
+    MOVU%1       m1, [r1]
     add          r1, r4
-    mova         m2, [r2+2*%1]
-    mova         m3, [r2+3*%1]
+    MOVA%1       m2, [r2+2*%1]
+    MOVA%1       m3, [r2+3*%1]
     add          r2, 4*%1
     pxor         m0, m4
     pxor         m1, m4
@@ -84,18 +89,17 @@ cglobal put_no_rnd_pixels%1x%1_l2, 5,6,5
     pavgb        m1, m3
     pxor         m0, m4
     pxor         m1, m4
-    mova       [r0], m0
+    MOVA%1     [r0], m0
     add          r0, r3
-    mova       [r0], m1
+    MOVA%1     [r0], m1
     add          r0, r3
     sub         r5d, 4
     jne .loop
     RET
 %endmacro
 
-INIT_MMX mmxext
-PUT_NO_RND_PIXELS_L2 8
 INIT_XMM sse2
+PUT_NO_RND_PIXELS_L2 8
 PUT_NO_RND_PIXELS_L2 16
 
 %macro L2 5
diff --git a/libavcodec/x86/qpeldsp_init.c b/libavcodec/x86/qpeldsp_init.c
index 771961c1b5..bd327e445c 100644
--- a/libavcodec/x86/qpeldsp_init.c
+++ b/libavcodec/x86/qpeldsp_init.c
@@ -34,9 +34,9 @@
 #include "qpel.h"
 
 FF_VISIBILITY_PUSH_HIDDEN
-void ff_put_no_rnd_pixels8x8_l2_mmxext(uint8_t *dst,
-                                       const uint8_t *src1, const uint8_t 
*src2,
-                                       ptrdiff_t dstStride, ptrdiff_t 
src1Stride);
+void ff_put_no_rnd_pixels8x8_l2_sse2(uint8_t *dst,
+                                     const uint8_t *src1, const uint8_t *src2,
+                                     ptrdiff_t dstStride, ptrdiff_t 
src1Stride);
 void ff_put_no_rnd_pixels16x16_l2_sse2(uint8_t *dst,
                                        const uint8_t *src1, const uint8_t 
*src2,
                                        ptrdiff_t dstStride, ptrdiff_t 
src1Stride);
@@ -241,10 +241,10 @@ MACRO(put,,                SIZE, SIZEP1, HXMM, VXMM, 
HVXMM, L2) \
 MACRO(avg,,                SIZE, SIZEP1, HXMM, VXMM, HVXMM, L2) \
 MACRO(put_no_rnd, no_rnd_, SIZE, SIZEP1, HXMM, VXMM, HVXMM, L2)
 
-QPEL3(QPEL_H,   8,  9, ssse3, sse2, ssse3, mmxext)
+QPEL3(QPEL_H,   8,  9, ssse3, sse2, ssse3, sse2)
 QPEL3(QPEL_H,  16, 17, ssse3, sse2, ssse3, sse2)
-QPEL3(QPEL_V,   8,  9, ssse3, sse2, ssse3, mmxext)
-QPEL3(QPEL_HV,  8,  9, ssse3, sse2, ssse3, mmxext)
+QPEL3(QPEL_V,   8,  9, ssse3, sse2, ssse3, sse2)
+QPEL3(QPEL_HV,  8,  9, ssse3, sse2, ssse3, sse2)
 QPEL3(QPEL_V,  16, 17, ssse3, sse2, ssse3, sse2)
 QPEL3(QPEL_HV, 16, 17, ssse3, sse2, ssse3, sse2)
 
-- 
2.52.0

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

Reply via email to