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]
