PR #25518 opened by zuxy URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25518 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25518.patch
Convert the last MMX (mmxext) qpel functions, all 4-wide 8-bit and 10-bit paths, to SSE2, following the 8x8_l2 conversion: new symbols carry the sse2 suffix and dispatch moves from EXTERNAL_MMXEXT to EXTERNAL_SSE2, so SSE2 CPUs without MMXEXT get asm instead of C fallback for 4-wide MC. checkasm h264qpel passes. Almost identical performance. >From 4cde96ac4ee9dad8076ec631dc36b0d8ab996daa Mon Sep 17 00:00:00 2001 From: Zuxy Meng <[email protected]> Date: Mon, 26 Oct 2026 20:12:45 -0700 Subject: [PATCH] avcodec/x86/h264: convert qpel MMX to SSE2 Convert the last MMX (mmxext) qpel functions, all 4-wide 8-bit and 10-bit paths, to SSE2, following the 8x8_l2 conversion: new symbols carry the sse2 suffix and dispatch moves from EXTERNAL_MMXEXT to EXTERNAL_SSE2, so SSE2 CPUs without MMXEXT get asm instead of C fallback for 4-wide MC. checkasm h264qpel passes. identical performance. --- libavcodec/x86/h264_qpel.c | 88 +++++---- libavcodec/x86/h264_qpel_10bit.asm | 283 ++++++++++++++++------------ libavcodec/x86/h264_qpel_8bit.asm | 285 ++++++++++++++++------------- tests/checkasm/h264qpel.c | 2 +- 4 files changed, 370 insertions(+), 288 deletions(-) diff --git a/libavcodec/x86/h264_qpel.c b/libavcodec/x86/h264_qpel.c index 1f015831427..433d7a9c667 100644 --- a/libavcodec/x86/h264_qpel.c +++ b/libavcodec/x86/h264_qpel.c @@ -30,36 +30,36 @@ #include "fpel.h" #include "qpel.h" -void ff_avg_pixels4_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t stride); -void ff_put_pixels4x4_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, - ptrdiff_t stride); -void ff_avg_pixels4x4_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, - ptrdiff_t stride); -#define ff_put_pixels4x4_l2_mmxext(dst, src1, src2, dststride, src1stride) \ - 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)) +void ff_avg_pixels4_sse2(uint8_t *dst, const uint8_t *src, ptrdiff_t stride); +void ff_put_pixels4x4_l2_sse2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, + ptrdiff_t stride); +void ff_avg_pixels4x4_l2_sse2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, + ptrdiff_t stride); +#define ff_put_pixels4x4_l2_sse2(dst, src1, src2, dststride, src1stride) \ + ff_put_pixels4x4_l2_sse2((dst), (src1), (src2), (dststride)) +#define ff_avg_pixels4x4_l2_sse2(dst, src1, src2, dststride, src1stride) \ + ff_avg_pixels4x4_l2_sse2((dst), (src1), (src2), (dststride)) #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);\ +void ff_ ## OPNAME ## _h264_qpel4_h_lowpass_sse2(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride);\ void ff_ ## OPNAME ## _h264_qpel8_h_lowpass_ssse3(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride);\ -void ff_ ## OPNAME ## _h264_qpel4_h_lowpass_l2_mmxext(uint8_t *dst, const uint8_t *src, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src2Stride);\ +void ff_ ## OPNAME ## _h264_qpel4_h_lowpass_l2_sse2(uint8_t *dst, const uint8_t *src, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src2Stride);\ void ff_ ## OPNAME ## _h264_qpel8_h_lowpass_l2_sse2(uint8_t *dst, const uint8_t *src, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src2Stride);\ void ff_ ## OPNAME ## _h264_qpel16_h_lowpass_l2_sse2(uint8_t *dst, const uint8_t *src, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src2Stride);\ void ff_ ## OPNAME ## _h264_qpel8_h_lowpass_l2_ssse3(uint8_t *dst, const uint8_t *src, const uint8_t *src2, ptrdiff_t dstStride, ptrdiff_t src2Stride);\ -void ff_ ## OPNAME ## _h264_qpel4_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride);\ +void ff_ ## OPNAME ## _h264_qpel4_v_lowpass_sse2(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride);\ void ff_ ## OPNAME ## _h264_qpel8or16_v_lowpass_sse2(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h);\ -void ff_ ## OPNAME ## _h264_qpel4_hv_lowpass_h_mmxext(int16_t *tmp, uint8_t *dst, ptrdiff_t dstStride);\ +void ff_ ## OPNAME ## _h264_qpel4_hv_lowpass_h_sse2(int16_t *tmp, uint8_t *dst, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _h264_qpel8or16_hv1_lowpass_op_sse2(const uint8_t *src, int16_t *tmp, ptrdiff_t srcStride, int size);\ void ff_ ## OPNAME ## _h264_qpel8_hv2_lowpass_sse2(uint8_t *dst, int16_t *tmp, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _h264_qpel16_hv2_lowpass_sse2(uint8_t *dst, int16_t *tmp, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _h264_qpel8_hv2_lowpass_ssse3(uint8_t *dst, int16_t *tmp, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _h264_qpel16_hv2_lowpass_ssse3(uint8_t *dst, int16_t *tmp, ptrdiff_t dstStride);\ -void ff_ ## OPNAME ## _pixels4_l2_shift5_mmxext(uint8_t *dst, const int16_t *src16, const uint8_t *src8, ptrdiff_t dstStride);\ +void ff_ ## OPNAME ## _pixels4_l2_shift5_sse2(uint8_t *dst, const int16_t *src16, const uint8_t *src8, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _pixels8_l2_shift5_sse2(uint8_t *dst, const int16_t *src16, const uint8_t *src8, ptrdiff_t dstStride);\ void ff_ ## OPNAME ## _pixels16_l2_shift5_sse2(uint8_t *dst, const int16_t *src16, const uint8_t *src8, ptrdiff_t dstStride);\ -void ff_put_h264_qpel4_hv_lowpass_v_mmxext(const uint8_t *src, int16_t *tmp, ptrdiff_t srcStride); +void ff_put_h264_qpel4_hv_lowpass_v_sse2(const uint8_t *src, int16_t *tmp, ptrdiff_t srcStride); DEF_QPEL(avg) DEF_QPEL(put) @@ -68,8 +68,8 @@ DEF_QPEL(put) static av_always_inline void OPNAME ## h264_qpel4_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride)\ {\ src -= 2*srcStride+2;\ - ff_put_h264_qpel4_hv_lowpass_v_mmxext(src, tmp, srcStride);\ - ff_ ## OPNAME ## h264_qpel4_hv_lowpass_h_mmxext(tmp, dst, dstStride);\ + ff_put_h264_qpel4_hv_lowpass_v_ ## MMX(src, tmp, srcStride);\ + ff_ ## OPNAME ## h264_qpel4_hv_lowpass_h_ ## MMX(tmp, dst, dstStride);\ }\ #define QPEL_H264_H16(OPNAME, EXT) \ @@ -270,8 +270,8 @@ QPEL(put_, 16,XMM, 16, SHIFT5_EXT)\ QPEL(avg_, 8, XMM, 16, SHIFT5_EXT)\ QPEL(avg_, 16,XMM, 16, SHIFT5_EXT)\ -QPEL_H264(put_, mmxext) -QPEL_H264(avg_, mmxext) +QPEL_H264(put_, sse2) +QPEL_H264(avg_, sse2) QPEL_H264_V_XMM(put_, sse2, sse2) QPEL_H264_V_XMM(avg_, sse2, sse2) QPEL_H264_HV_XMM(put_, sse2) @@ -282,7 +282,7 @@ QPEL_H264_V_XMM(put_, ssse3, sse2) QPEL_H264_HV_XMM(put_, ssse3) QPEL_H264_HV_XMM(avg_, ssse3) -H264_MC(H264_MC_V_H_HV, 4, mmxext, 8, mmxext) +H264_MC(H264_MC_V_H_HV, 4, sse2, 16, sse2) H264_MC_816(H264_MC_V, sse2, sse2) H264_MC_816(H264_MC_HV, sse2, sse2) H264_MC_816(H264_MC_H, ssse3, sse2) @@ -304,22 +304,22 @@ void ff_ ## OP ## _h264_qpel ## NUM ## _ ## TYPE ## _ ## DEPTH ## _ ## OPT \ LUMA_MC_OP(put, 16, DEPTH, TYPE, OPT) \ LUMA_MC_OP(avg, 16, DEPTH, TYPE, OPT) -LUMA_MC_4(10, mc00, mmxext) -LUMA_MC_4(10, mc10, mmxext) -LUMA_MC_4(10, mc20, mmxext) -LUMA_MC_4(10, mc30, mmxext) -LUMA_MC_4(10, mc01, mmxext) -LUMA_MC_4(10, mc11, mmxext) -LUMA_MC_4(10, mc21, mmxext) -LUMA_MC_4(10, mc31, mmxext) -LUMA_MC_4(10, mc02, mmxext) -LUMA_MC_4(10, mc12, mmxext) -LUMA_MC_4(10, mc22, mmxext) -LUMA_MC_4(10, mc32, mmxext) -LUMA_MC_4(10, mc03, mmxext) -LUMA_MC_4(10, mc13, mmxext) -LUMA_MC_4(10, mc23, mmxext) -LUMA_MC_4(10, mc33, mmxext) +LUMA_MC_4(10, mc00, sse2) +LUMA_MC_4(10, mc10, sse2) +LUMA_MC_4(10, mc20, sse2) +LUMA_MC_4(10, mc30, sse2) +LUMA_MC_4(10, mc01, sse2) +LUMA_MC_4(10, mc11, sse2) +LUMA_MC_4(10, mc21, sse2) +LUMA_MC_4(10, mc31, sse2) +LUMA_MC_4(10, mc02, sse2) +LUMA_MC_4(10, mc12, sse2) +LUMA_MC_4(10, mc22, sse2) +LUMA_MC_4(10, mc32, sse2) +LUMA_MC_4(10, mc03, sse2) +LUMA_MC_4(10, mc13, sse2) +LUMA_MC_4(10, mc23, sse2) +LUMA_MC_4(10, mc33, sse2) LUMA_MC_816(10, mc00, sse2) LUMA_MC_816(10, mc10, sse2) @@ -386,19 +386,11 @@ av_cold void ff_h264qpel_init_x86(H264QpelContext *c, int bit_depth) int high_bit_depth = bit_depth > 8; int cpu_flags = av_get_cpu_flags(); - if (EXTERNAL_MMXEXT(cpu_flags)) { - if (!high_bit_depth) { - SET_QPEL_FUNCS_1PP(put_h264_qpel, 2, 4, mmxext, ); - SET_QPEL_FUNCS_1PP(avg_h264_qpel, 2, 4, mmxext, ); - c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_pixels4_mmxext; - } else if (bit_depth == 10) { - SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 10_mmxext, ff_); - SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 10_mmxext, ff_); - } - } - if (EXTERNAL_SSE2(cpu_flags)) { if (!high_bit_depth) { + SET_QPEL_FUNCS_1PP(put_h264_qpel, 2, 4, sse2, ); + SET_QPEL_FUNCS_1PP(avg_h264_qpel, 2, 4, sse2, ); + c->avg_h264_qpel_pixels_tab[2][0] = ff_avg_pixels4_sse2; H264_QPEL_FUNCS(0, 1, sse2); H264_QPEL_FUNCS(0, 2, sse2); H264_QPEL_FUNCS(0, 3, sse2); @@ -419,8 +411,10 @@ av_cold void ff_h264qpel_init_x86(H264QpelContext *c, int bit_depth) if (bit_depth == 10) { SET_QPEL_FUNCS(put_h264_qpel, 0, 16, 10_sse2, ff_); SET_QPEL_FUNCS(put_h264_qpel, 1, 8, 10_sse2, ff_); + SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 10_sse2, ff_); SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 10_sse2, ff_); SET_QPEL_FUNCS(avg_h264_qpel, 1, 8, 10_sse2, ff_); + SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 10_sse2, ff_); H264_QPEL_FUNCS_10(1, 0, sse2); H264_QPEL_FUNCS_10(2, 0, sse2); H264_QPEL_FUNCS_10(3, 0, sse2); diff --git a/libavcodec/x86/h264_qpel_10bit.asm b/libavcodec/x86/h264_qpel_10bit.asm index bad2d386eb9..35f71fbc2cd 100644 --- a/libavcodec/x86/h264_qpel_10bit.asm +++ b/libavcodec/x86/h264_qpel_10bit.asm @@ -1,5 +1,5 @@ ;***************************************************************************** -;* MMX/SSE2/AVX-optimized 10-bit H.264 qpel code +;* SSE2/AVX-optimized 10-bit H.264 qpel code ;***************************************************************************** ;* Copyright (C) 2011 x264 project ;* @@ -52,13 +52,26 @@ SECTION .text mova %1, %2 %endmacro -%macro ADDW 3 -%if mmsize == 8 - paddw %1, %2 -%else - movu %3, %2 +; 4-wide (8-byte row) avg store: exact 8-byte traffic via movq, so no +; 16-byte alignment is required of dst. m6 is free at all use sites. +%macro AVG_MOVQ 2 + movq m6, %1 + pavgw %2, m6 + movq %1, %2 +%endmacro + +; MC00 4-wide avg uses only m0, so scratch in m1 keeps its count at 2. +%macro AVG_MOVQ1 2 + movq m1, %1 + pavgw %2, m1 + movq %1, %2 +%endmacro + +; %4 selects the temp load width: movu for 8-wide rows, movq for +; 4-wide 10-bit rows (8 bytes) +%macro ADDW 3-4 movu + %4 %3, %2 paddw %1, %3 -%endif %endmacro %macro FILT_H 4 @@ -74,17 +87,17 @@ SECTION .text %macro PRELOAD_V 0 lea r3, [r2*3] sub r1, r3 - movu m0, [r1+r2] - movu m1, [r1+r2*2] + OP_LOAD m0, [r1+r2] + OP_LOAD m1, [r1+r2*2] add r1, r3 - movu m2, [r1] - movu m3, [r1+r2] - movu m4, [r1+r2*2] + OP_LOAD m2, [r1] + OP_LOAD m3, [r1+r2] + OP_LOAD m4, [r1+r2*2] add r1, r3 %endmacro %macro FILT_V 8 - movu %6, [r1] + OP_LOAD %6, [r1] paddw %1, %6 mova %7, %2 paddw %7, %5 @@ -96,16 +109,19 @@ SECTION .text %endmacro %macro MC 1 -%define OP_MOV mova -INIT_MMX mmxext -%1 put, 4 INIT_XMM sse2 +%define OP_MOV movq +%define OP_LOAD movq +%1 put, 4 +%define OP_MOV mova +%define OP_LOAD movu %1 put, 8 -%define OP_MOV AVG_MOV -INIT_MMX mmxext +%define OP_MOV AVG_MOVQ +%define OP_LOAD movq %1 avg, 4 -INIT_XMM sse2 +%define OP_MOV AVG_MOV +%define OP_LOAD movu %1 avg, 8 %endmacro @@ -153,7 +169,7 @@ cglobal %1_h264_qpel%4_%2_10, %5,%6 + 2,%7 ;cpu, put/avg, mc, 4/8, ... %macro cglobal_mc 6 %assign i %3*2 -%if cpuflag(sse2) +%if %3 == 8 MCAxA_OP %1, %2, %3, i, %4,%5,%6 %endif @@ -170,25 +186,37 @@ stub_%1_h264_qpel%3_%2_10 %+ SUFFIX: ; void ff_h264_qpel_mc00(uint8_t *dst, uint8_t *src, int stride) ;----------------------------------------------------------------------------- %macro COPY4 0 - movu m0, [r1 ] + OP_LOAD m0, [r1 ] OP_MOV [r0 ], m0 - movu m0, [r1+r2 ] + OP_LOAD m0, [r1+r2 ] OP_MOV [r0+r2 ], m0 - movu m0, [r1+r2*2] + OP_LOAD m0, [r1+r2*2] OP_MOV [r0+r2*2], m0 - movu m0, [r1+r3 ] + OP_LOAD m0, [r1+r3 ] OP_MOV [r0+r3 ], m0 %endmacro %macro MC00 1 -INIT_MMX mmxext -cglobal_mc %1, mc00, 4, 3,4,0 +INIT_XMM sse2 +%define OP_LOAD4 movq +%define OP_LOAD8 movu +%ifidn %1, put +%define OP_MOV4 movq +%define OP_MOV8 mova +%else +%define OP_MOV4 AVG_MOVQ1 +%define OP_MOV8 AVG_MOV +%endif +cglobal_mc %1, mc00, 4, 3,4,2 lea r3, [r2*3] +%define OP_MOV OP_MOV4 +%define OP_LOAD OP_LOAD4 COPY4 ret -INIT_XMM sse2 cglobal %1_h264_qpel8_mc00_10, 3,4 +%define OP_MOV OP_MOV8 +%define OP_LOAD OP_LOAD8 lea r3, [r2*3] COPY4 lea r0, [r0+r2*4] @@ -214,28 +242,31 @@ cglobal %1_h264_qpel16_mc00_10, 3,4 RET %endmacro -%define OP_MOV mova MC00 put -%define OP_MOV AVG_MOV MC00 avg ;----------------------------------------------------------------------------- ; void ff_h264_qpel_mc20(uint8_t *dst, uint8_t *src, int stride) ;----------------------------------------------------------------------------- %macro MC_CACHE 1 -%define OP_MOV mova -INIT_MMX mmxext +INIT_XMM sse2 +%define OP_MOV movq +%define OP_LOAD movq %1 put, 4 INIT_XMM ssse3, cache64 +%define OP_MOV mova +%define OP_LOAD movu %1 put, 8 INIT_XMM sse2 %1 put, 8 -%define OP_MOV AVG_MOV -INIT_MMX mmxext +%define OP_MOV AVG_MOVQ +%define OP_LOAD movq %1 avg, 4 INIT_XMM ssse3, cache64 +%define OP_MOV AVG_MOV +%define OP_LOAD movu %1 avg, 8 INIT_XMM sse2 %1 avg, 8 @@ -253,14 +284,13 @@ cglobal_mc %1, mc20, %2, 3,4,9 %endif .nextrow: %if %0 == 4 - movu m2, [r1-4] - movu m3, [r1-2] - movu m4, [r1+0] + movq m2, [r1-4] + movq m3, [r1-2] + movq m4, [r1+0] ADDW m2, [r1+6], m5 ADDW m3, [r1+4], m5 ADDW m4, [r1+2], m5 %else ; movu is slow on these processors -%if mmsize==16 movu m2, [r1-4] movu m0, [r1+6] mova m6, m0 @@ -274,16 +304,6 @@ cglobal_mc %1, mc20, %2, 3,4,9 PALIGNR m7, m0, m2, 6, m5 paddw m4, m7 SWAP 2, 6 -%else - movu m2, [r1-4] - movu m6, [r1+4] - PALIGNR m3, m6, m2, 2, m5 - paddw m3, m6 - PALIGNR m4, m6, m2, 4, m5 - PALIGNR m7, m6, m2, 6, m5 - paddw m4, m7 - paddw m2, [r1+6] -%endif %endif FILT_H m2, m3, m4, p16 @@ -328,14 +348,13 @@ cglobal_mc %1, mc10, %2, 3,5,9 %endif .nextrow: %if %0 == 4 - movu m2, [r1-4] - movu m3, [r1-2] - movu m4, [r1+0] + movq m2, [r1-4] + movq m3, [r1-2] + movq m4, [r1+0] ADDW m2, [r1+6], m5 ADDW m3, [r1+4], m5 ADDW m4, [r1+2], m5 %else ; movu is slow on these processors -%if mmsize==16 movu m2, [r1-4] movu m0, [r1+6] mova m6, m0 @@ -349,23 +368,13 @@ cglobal_mc %1, mc10, %2, 3,5,9 PALIGNR m7, m0, m2, 6, m5 paddw m4, m7 SWAP 2, 6 -%else - movu m2, [r1-4] - movu m6, [r1+4] - PALIGNR m3, m6, m2, 2, m5 - paddw m3, m6 - PALIGNR m4, m6, m2, 4, m5 - PALIGNR m7, m6, m2, 6, m5 - paddw m4, m7 - paddw m2, [r1+6] -%endif %endif FILT_H m2, m3, m4, p16 psraw m2, 1 pxor m0, m0 CLIPW m2, m0, m1 - movu m3, [r4] + OP_LOAD m3, [r4] pavgw m2, m3 OP_MOV [r0], m2 add r0, r2 @@ -391,8 +400,9 @@ v_filt%9_%10_10: ret %endmacro -INIT_MMX mmxext +INIT_XMM sse2 RESET_MM_PERMUTATION +%define OP_LOAD movq %assign i 0 %rep 4 V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 4, i @@ -402,6 +412,7 @@ SWAP 0,1,2,3,4,5 INIT_XMM sse2 RESET_MM_PERMUTATION +%define OP_LOAD movu %assign i 0 %rep 6 V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 8, i @@ -442,7 +453,7 @@ cglobal_mc %1, mc01, %2, 3,5,8 %rep %2 %assign i (j % 6) call v_filt%2_ %+ i %+ _10 - movu m7, [r4] + OP_LOAD m7, [r4] pavgw m0, m7 OP_MOV [r0], m0 SWAP 0,1,2,3,4,5 @@ -472,16 +483,21 @@ h_filt%1_%2_10: ;FILT_H with fewer registers and averaged with the FILT_V result ;m6,m7 are tmp registers, m0 is the FILT_V result, the rest are to be used next in the next iteration ;unfortunately I need three registers, so m5 will have to be re-read from memory - movu m5, [r4-4] - ADDW m5, [r4+6], m7 - movu m6, [r4-2] - ADDW m6, [r4+4], m7 +%if %1 == 4 +%define HROW movq +%else +%define HROW movu +%endif + HROW m5, [r4-4] + ADDW m5, [r4+6], m7, HROW + HROW m6, [r4-2] + ADDW m6, [r4+4], m7, HROW paddw m5, [pw_16] psubw m5, m6 ; a-b psraw m5, 2 ; (a-b)/4 psubw m5, m6 ; (a-b)/4-b - movu m6, [r4+0] - ADDW m6, [r4+2], m7 + HROW m6, [r4+0] + ADDW m6, [r4+2], m7, HROW paddw m5, m6 ; (a-b)/4-b+c psraw m5, 2 ; ((a-b)/4-b+c)/4 paddw m5, m6 ; ((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16 @@ -490,12 +506,12 @@ h_filt%1_%2_10: ;avg FILT_V, FILT_H pavgw m0, m5 %if %0!=4 - movu m5, [r1+r5] + HROW m5, [r1+r5] %endif ret %endmacro -INIT_MMX mmxext +INIT_XMM sse2 RESET_MM_PERMUTATION %assign i 0 %rep 3 @@ -594,7 +610,7 @@ MC MC33 %endmacro %macro FILT_VNRD 8 - movu %6, [r1] + ROWMOV %6, [r1] paddw %1, %6 mova %7, %2 paddw %7, %5 @@ -604,43 +620,47 @@ MC MC33 %endmacro %macro HV 1 -%if mmsize==16 -%define PAD 12 -%define COUNT 2 +%if %1 == 8 +%assign ROWHV mmsize +%assign PAD 12 +%assign COUNT 2 +%define ROWMOV movu %else -%define PAD 4 -%define COUNT 3 +%assign ROWHV 8 +%assign PAD 4 +%assign COUNT 3 +%define ROWMOV movq %endif put_hv%1_10: neg r2 ; This actually saves instructions - lea r1, [r1+r2*2-mmsize+PAD] + lea r1, [r1+r2*2-ROWHV+PAD] lea r4, [rsp+PAD+gprsize] mov r3d, COUNT .v_loop: - movu m0, [r1] + ROWMOV m0, [r1] sub r1, r2 - movu m1, [r1] + ROWMOV m1, [r1] sub r1, r2 - movu m2, [r1] + ROWMOV m2, [r1] sub r1, r2 - movu m3, [r1] + ROWMOV m3, [r1] sub r1, r2 - movu m4, [r1] + ROWMOV m4, [r1] sub r1, r2 %assign i 0 %rep %1-1 FILT_VNRD m0, m1, m2, m3, m4, m5, m6, m7 psubw m0, [pad20] - movu [r4+i*mmsize*3], m0 + ROWMOV [r4+i*ROWHV*3], m0 sub r1, r2 SWAP 0,1,2,3,4,5 %assign i i+1 %endrep FILT_VNRD m0, m1, m2, m3, m4, m5, m6, m7 psubw m0, [pad20] - movu [r4+i*mmsize*3], m0 - add r4, mmsize - lea r1, [r1+r2*8+mmsize] + ROWMOV [r4+i*ROWHV*3], m0 + add r4, ROWHV + lea r1, [r1+r2*8+ROWHV] %if %1==8 lea r1, [r1+r2*4] %endif @@ -650,9 +670,8 @@ put_hv%1_10: ret %endmacro -INIT_MMX mmxext -HV 4 INIT_XMM sse2 +HV 4 HV 8 %macro H_LOOP 1 @@ -667,13 +686,20 @@ HV 8 %define s3 [tap3] %define d1 [depad] %endif +%if %1 == 4 +%assign ROWHL 8 +%define ROWMOV movq +%else +%assign ROWHL mmsize +%define ROWMOV movu +%endif h%1_loop_op: - movu m1, [r1+mmsize-4] - movu m2, [r1+mmsize-2] - mova m3, [r1+mmsize+0] - movu m4, [r1+mmsize+2] - movu m5, [r1+mmsize+4] - movu m6, [r1+mmsize+6] + ROWMOV m1, [r1+ROWHL-4] + ROWMOV m2, [r1+ROWHL-2] + ROWMOV m3, [r1+ROWHL+0] + ROWMOV m4, [r1+ROWHL+2] + ROWMOV m5, [r1+ROWHL+4] + ROWMOV m6, [r1+ROWHL+6] %if num_mmregs > 8 pmaddwd m1, s1 pmaddwd m2, s1 @@ -710,18 +736,22 @@ h%1_loop_op: pxor m0, m0 %endif CLIPW m1, m0, m7 - add r1, mmsize*3 + add r1, ROWHL*3 ret %endmacro -INIT_MMX mmxext -H_LOOP 4 INIT_XMM sse2 +H_LOOP 4 H_LOOP 8 %macro MC22 2 cglobal_mc %1, mc22, %2, 3,7,12 -%define PAD mmsize*8*4*2 ; SIZE*16*4*sizeof(pixel) +%if %2 == 4 +%assign PADMC22 8*8*4*2 ; SIZE*16*4*sizeof(pixel) +%else +%assign PADMC22 mmsize*8*4*2 ; SIZE*16*4*sizeof(pixel) +%endif +%define PAD PADMC22 mov r6, rsp ; backup stack pointer and rsp, ~(mmsize-1) ; align stack sub rsp, PAD @@ -757,7 +787,16 @@ MC MC22 ;----------------------------------------------------------------------------- %macro MC12 2 cglobal_mc %1, mc12, %2, 3,7,12 -%define PAD mmsize*8*4*2 ; SIZE*16*4*sizeof(pixel) +%if %2 == 4 +%assign RBMC12 8 +%assign PADMC12 8*8*4*2 ; SIZE*16*4*sizeof(pixel) +%define ROWMOV movq +%else +%assign RBMC12 mmsize +%assign PADMC12 mmsize*8*4*2 ; SIZE*16*4*sizeof(pixel) +%define ROWMOV movu +%endif +%define PAD PADMC12 mov r6, rsp ; backup stack pointer and rsp, ~(mmsize-1) ; align stack sub rsp, PAD @@ -779,7 +818,7 @@ cglobal_mc %1, mc12, %2, 3,7,12 .h_loop: call h%2_loop_op - movu m3, [r1+r4-2*mmsize] ; movu needed for mc32, etc + ROWMOV m3, [r1+r4-2*RBMC12] ; movu needed for mc32, etc paddw m3, [depad2] psrlw m3, 5 psubw m3, [unpad] @@ -819,23 +858,30 @@ MC MC32 ; void ff_h264_qpel_mc21(uint8_t *dst, uint8_t *src, int stride) ;----------------------------------------------------------------------------- %macro H_NRD 1 +%if %1 == 4 +%assign ROWHN 8 +%define ROWMOV movq +%else +%assign ROWHN mmsize +%define ROWMOV movu +%endif put_h%1_10: add rsp, gprsize mov r3d, %1 xor r4d, r4d mova m6, [pad20] .nextrow: - movu m2, [r5-4] - movu m3, [r5-2] - movu m4, [r5+0] - ADDW m2, [r5+6], m5 - ADDW m3, [r5+4], m5 - ADDW m4, [r5+2], m5 + ROWMOV m2, [r5-4] + ROWMOV m3, [r5-2] + ROWMOV m4, [r5+0] + ADDW m2, [r5+6], m5, ROWMOV + ADDW m3, [r5+4], m5, ROWMOV + ADDW m4, [r5+2], m5, ROWMOV FILT_H2 m2, m3, m4 psubw m2, m6 - mova [rsp+r4], m2 - add r4d, mmsize*3 + ROWMOV [rsp+r4], m2 + add r4d, ROWHN*3 add r5, r2 dec r3d jg .nextrow @@ -843,26 +889,31 @@ put_h%1_10: ret %endmacro -INIT_MMX mmxext -H_NRD 4 INIT_XMM sse2 +H_NRD 4 H_NRD 8 %macro MC21 2 cglobal_mc %1, mc21, %2, 3,7,12 mov r5, r1 .body: -%define PAD mmsize*8*3*2 ; SIZE*16*4*sizeof(pixel) +%if %2 == 4 +%assign RBMC21 8 +%assign PADMC21 8*8*3*2 ; SIZE*16*4*sizeof(pixel) +%else +%assign RBMC21 mmsize +%assign PADMC21 mmsize*8*3*2 ; SIZE*16*4*sizeof(pixel) +%endif mov r6, rsp ; backup stack pointer and rsp, ~(mmsize-1) ; align stack - sub rsp, PAD + sub rsp, PADMC21 call put_h%2_10 - sub rsp, PAD + sub rsp, PADMC21 call put_hv%2_10 - mov r4d, PAD-mmsize ; H buffer + mov r4d, PADMC21-RBMC21 ; H buffer jmp stub_%1_h264_qpel%2_mc12_10 %+ SUFFIX %+ .body %endmacro diff --git a/libavcodec/x86/h264_qpel_8bit.asm b/libavcodec/x86/h264_qpel_8bit.asm index 2bfe6042a13..4335cf02909 100644 --- a/libavcodec/x86/h264_qpel_8bit.asm +++ b/libavcodec/x86/h264_qpel_8bit.asm @@ -1,5 +1,5 @@ ;***************************************************************************** -;* MMX/SSE2/SSSE3-optimized H.264 QPEL code +;* SSE2/SSSE3-optimized H.264 QPEL code ;***************************************************************************** ;* Copyright (c) 2004-2005 Michael Niedermayer, Loren Merritt ;* Copyright (C) 2012 Daniel Kang @@ -31,23 +31,27 @@ cextern pb_0 SECTION .text -; void ff_avg_pixels4_mmxext(uint8_t *block, const uint8_t *pixels, -; ptrdiff_t line_size) -INIT_MMX mmxext -cglobal avg_pixels4, 3,4 +; void ff_avg_pixels4_sse2(uint8_t *block, const uint8_t *pixels, +; ptrdiff_t line_size) +INIT_XMM sse2 +cglobal avg_pixels4, 3,4,5 lea r3, [r2*3] - movh m0, [r1] - movh m1, [r1+r2] - movh m2, [r1+r2*2] - movh m3, [r1+r3] - pavgb m0, [r0] - pavgb m1, [r0+r2] - pavgb m2, [r0+r2*2] - pavgb m3, [r0+r3] - movh [r0], m0 - movh [r0+r2], m1 - movh [r0+r2*2], m2 - movh [r0+r3], m3 + movd m0, [r1] + movd m1, [r1+r2] + movd m2, [r1+r2*2] + movd m3, [r1+r3] + movd m4, [r0] + pavgb m0, m4 + movd m4, [r0+r2] + pavgb m1, m4 + movd m4, [r0+r2*2] + pavgb m2, m4 + movd m4, [r0+r3] + pavgb m3, m4 + movd [r0], m0 + movd [r0+r2], m1 + movd [r0+r2*2], m2 + movd [r0+r3], m3 RET %macro op_avgh 3 @@ -65,57 +69,73 @@ cglobal avg_pixels4, 3,4 movh %2, %1 %endmacro +; 4-wide rows are 4 bytes: movh (movq under XMM) would read 4 extra +; bytes per row, so these use movd. op_*h stays for 8-wide rows. +%macro op_avgf 3 + movd %3, %2 + pavgb %1, %3 + movd %2, %1 +%endmacro + +%macro op_putf 2-3 + movd %2, %1 +%endmacro + %macro op_put 2-3 mova %2, %1 %endmacro -; void ff_put/avg_pixels4x4_l2_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, -; ptrdiff_t stride) +; void ff_put/avg_pixels4x4_l2_sse2(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, +; ptrdiff_t stride) %macro PIXELS4_L2 1 -%define OP op_%1h -cglobal %1_pixels4x4_l2, 4,4 - mova m0, [r1] - mova m1, [r1+r3] +%define OP op_%1f +cglobal %1_pixels4x4_l2, 4,4,4 + movh m0, [r1] + movh m1, [r1+r3] lea r1, [r1+2*r3] - pavgb m0, [r2] - pavgb m1, [r2+4] + movh m3, [r2] + pavgb m0, m3 + movh m3, [r2+4] + pavgb m1, m3 OP m0, [r0], m3 OP m1, [r0+r3], m3 lea r0, [r0+2*r3] - mova m0, [r1] - mova m1, [r1+r3] - pavgb m0, [r2+8] - pavgb m1, [r2+12] + movh m0, [r1] + movh m1, [r1+r3] + movh m3, [r2+8] + pavgb m0, m3 + movh m3, [r2+12] + pavgb m1, m3 OP m0, [r0], m3 OP m1, [r0+r3], m3 RET %endmacro -INIT_MMX mmxext +INIT_XMM sse2 PIXELS4_L2 put PIXELS4_L2 avg %macro QPEL4_H_LOWPASS_OP 1 -cglobal %1_h264_qpel4_h_lowpass, 4,5 ; dst, src, dstStride, srcStride - pxor m7, m7 +cglobal %1_h264_qpel4_h_lowpass, 4,5,7 ; dst, src, dstStride, srcStride + pxor m6, m6 mova m4, [pw_5] mova m5, [pw_16] mov r4d, 4 .loop: - movh m1, [r1-1] - movh m2, [r1+0] - movh m3, [r1+1] - movh m0, [r1+2] - punpcklbw m1, m7 - punpcklbw m2, m7 - punpcklbw m3, m7 - punpcklbw m0, m7 + movd m1, [r1-1] + movd m2, [r1+0] + movd m3, [r1+1] + movd m0, [r1+2] + punpcklbw m1, m6 + punpcklbw m2, m6 + punpcklbw m3, m6 + punpcklbw m0, m6 paddw m1, m0 paddw m2, m3 - movh m0, [r1-2] - movh m3, [r1+3] - punpcklbw m0, m7 - punpcklbw m3, m7 + movd m0, [r1-2] + movd m3, [r1+3] + punpcklbw m0, m6 + punpcklbw m3, m6 paddw m0, m3 psllw m2, 2 psubw m2, m1 @@ -124,7 +144,7 @@ cglobal %1_h264_qpel4_h_lowpass, 4,5 ; dst, src, dstStride, srcStride paddw m0, m2 psraw m0, 5 packuswb m0, m0 - op_%1h m0, [r0], m6 + op_%1f m0, [r0], m1 add r0, r2 add r1, r3 dec r4d @@ -132,7 +152,7 @@ cglobal %1_h264_qpel4_h_lowpass, 4,5 ; dst, src, dstStride, srcStride RET %endmacro -INIT_MMX mmxext +INIT_XMM sse2 QPEL4_H_LOWPASS_OP put QPEL4_H_LOWPASS_OP avg @@ -179,37 +199,37 @@ QPEL8_H_LOWPASS_OP_XMM avg %macro QPEL4_H_LOWPASS_L2_OP 1 -cglobal %1_h264_qpel4_h_lowpass_l2, 5,6 ; dst, src, src2, dstStride, srcStride - pxor m7, m7 +cglobal %1_h264_qpel4_h_lowpass_l2, 5,6,7 ; dst, src, src2, dstStride, srcStride + pxor m6, m6 mova m4, [pw_5] mova m5, [pw_16] mov r5d, 4 .loop: - movh m1, [r1-1] - movh m2, [r1+0] - movh m3, [r1+1] - movh m0, [r1+2] - punpcklbw m1, m7 - punpcklbw m2, m7 - punpcklbw m3, m7 - punpcklbw m0, m7 + movd m1, [r1-1] + movd m2, [r1+0] + movd m3, [r1+1] + movd m0, [r1+2] + punpcklbw m1, m6 + punpcklbw m2, m6 + punpcklbw m3, m6 + punpcklbw m0, m6 paddw m1, m0 paddw m2, m3 - movh m0, [r1-2] - movh m3, [r1+3] - punpcklbw m0, m7 - punpcklbw m3, m7 + movd m0, [r1-2] + movd m3, [r1+3] + punpcklbw m0, m6 + punpcklbw m3, m6 paddw m0, m3 psllw m2, 2 psubw m2, m1 pmullw m2, m4 paddw m0, m5 paddw m0, m2 - movh m3, [r2] + movd m3, [r2] psraw m0, 5 packuswb m0, m0 pavgb m0, m3 - op_%1h m0, [r0], m6 + op_%1f m0, [r0], m1 add r0, r3 add r1, r3 add r2, r4 @@ -218,7 +238,7 @@ cglobal %1_h264_qpel4_h_lowpass_l2, 5,6 ; dst, src, src2, dstStride, srcStride RET %endmacro -INIT_MMX mmxext +INIT_XMM sse2 QPEL4_H_LOWPASS_L2_OP put QPEL4_H_LOWPASS_L2_OP avg @@ -387,13 +407,15 @@ QPEL8_H_LOWPASS_L2_OP_XMM avg ; All functions that call this are required to have function arguments of ; dst, src, dstStride, srcStride +; %1 is the full store op (op_puth/op_avgh for 8-wide rows, +; op_putf/op_avgf for 4-wide rows) %macro FILT_V 1-2 %ifnidn %2, last mova m6, m2 %else SWAP 6, 2 %endif - movh m5, [r1] + OP_LOAD m5, [r1] paddw m6, m3 psllw m6, 2 psubw m6, m1 @@ -406,7 +428,7 @@ QPEL8_H_LOWPASS_L2_OP_XMM avg paddw m6, m0 psraw m6, 5 packuswb m6, m6 - op_%1h m6, [r0], m0 ; 1 + %1 m6, [r0], m0 ; 1 %ifnidn %2, last add r0, r2 %endif @@ -414,31 +436,32 @@ QPEL8_H_LOWPASS_L2_OP_XMM avg %endmacro %macro QPEL4_V_LOWPASS_OP 1 -cglobal %1_h264_qpel4_v_lowpass, 4,4 ; dst, src, dstStride, srcStride +cglobal %1_h264_qpel4_v_lowpass, 4,4,8 ; dst, src, dstStride, srcStride sub r1, r3 sub r1, r3 pxor m7, m7 - movh m0, [r1] - movh m1, [r1+r3] + movd m0, [r1] + movd m1, [r1+r3] lea r1, [r1+2*r3] - movh m2, [r1] - movh m3, [r1+r3] + movd m2, [r1] + movd m3, [r1+r3] lea r1, [r1+2*r3] - movh m4, [r1] + movd m4, [r1] add r1, r3 punpcklbw m0, m7 punpcklbw m1, m7 punpcklbw m2, m7 punpcklbw m3, m7 punpcklbw m4, m7 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1, last + FILT_V op_%1f + FILT_V op_%1f + FILT_V op_%1f + FILT_V op_%1f, last RET %endmacro -INIT_MMX mmxext +%define OP_LOAD movd +INIT_XMM sse2 QPEL4_V_LOWPASS_OP put QPEL4_V_LOWPASS_OP avg @@ -462,28 +485,29 @@ cglobal %1_h264_qpel8or16_v_lowpass, 5,5,8 ; dst, src, dstStride, srcStride, h punpcklbw m2, m7 punpcklbw m3, m7 punpcklbw m4, m7 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h cmp r4d, 16 jne .end - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1 - FILT_V %1, last + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h + FILT_V op_%1h, last .end: RET %endmacro +%define OP_LOAD movh INIT_XMM sse2 QPEL8OR16_V_LOWPASS_OP put QPEL8OR16_V_LOWPASS_OP avg @@ -491,13 +515,15 @@ QPEL8OR16_V_LOWPASS_OP avg ; All functions that use this are required to have args: ; src, tmp, srcSize +; HV_STORE selects the 8-byte (movq, 4-wide) or 16-byte (mova, 8/16-wide) +; tmp row store; set it before instantiating. %macro FILT_HV 1-2 ; offset, last %ifnidn %2, last mova m6, m2 %else SWAP 2, 6 %endif - movh m5, [r0] + OP_LOAD m5, [r0] paddw m6, m3 psllw m6, 2 paddw m0, [pw_16] @@ -510,23 +536,25 @@ QPEL8OR16_V_LOWPASS_OP avg add r0, r2 %endif paddw m6, m0 - mova [r1+%1], m6 + HV_STORE [r1+%1], m6 SWAP 0, 1, 2, 3, 4, 5 %endmacro -INIT_MMX mmxext -cglobal put_h264_qpel4_hv_lowpass_v, 3,5 ; src, tmp, srcStride +%define HV_STORE movq +%define OP_LOAD movd +INIT_XMM sse2 +cglobal put_h264_qpel4_hv_lowpass_v, 3,5,8 ; src, tmp, srcStride mov r4d, 3 mov r3, r0 pxor m7, m7 .loop: - movh m0, [r0] - movh m1, [r0+r2] + movd m0, [r0] + movd m1, [r0+r2] lea r0, [r0+2*r2] - movh m2, [r0] - movh m3, [r0+r2] + movd m2, [r0] + movd m3, [r0+r2] lea r0, [r0+2*r2] - movh m4, [r0] + movd m4, [r0] add r0, r2 punpcklbw m0, m7 punpcklbw m1, m7 @@ -544,16 +572,21 @@ cglobal put_h264_qpel4_hv_lowpass_v, 3,5 ; src, tmp, srcStride jnz .loop RET +%define HV_STORE mova +%define OP_LOAD movh %macro QPEL4_HV1_LOWPASS_OP 1 -cglobal %1_h264_qpel4_hv_lowpass_h, 3,4 ; tmp, dst, dstStride +cglobal %1_h264_qpel4_hv_lowpass_h, 3,4,5 ; tmp, dst, dstStride mov r3d, 4 .loop: - mova m0, [r0] - paddw m0, [r0+10] - mova m1, [r0+2] - paddw m1, [r0+8] - mova m2, [r0+4] - paddw m2, [r0+6] + movq m0, [r0] + movq m3, [r0+10] + paddw m0, m3 + movq m1, [r0+2] + movq m3, [r0+8] + paddw m1, m3 + movq m2, [r0+4] + movq m3, [r0+6] + paddw m2, m3 psubw m0, m1 psraw m0, 2 psubw m0, m1 @@ -562,7 +595,7 @@ cglobal %1_h264_qpel4_hv_lowpass_h, 3,4 ; tmp, dst, dstStride paddw m0, m2 psraw m0, 6 packuswb m0, m0 - op_%1h m0, [r1], m7 + op_%1f m0, [r1], m4 add r0, 24 add r1, r2 dec r3d @@ -570,7 +603,7 @@ cglobal %1_h264_qpel4_hv_lowpass_h, 3,4 ; tmp, dst, dstStride RET %endmacro -INIT_MMX mmxext +INIT_XMM sse2 QPEL4_HV1_LOWPASS_OP put QPEL4_HV1_LOWPASS_OP avg @@ -753,32 +786,36 @@ QPEL8OR16_HV2_LOWPASS_OP_XMM avg %macro PIXELS4_L2_SHIFT5 1 -cglobal %1_pixels4_l2_shift5,4,4 ; dst, src16, src8, dstStride - mova m0, [r1] - mova m1, [r1+24] +cglobal %1_pixels4_l2_shift5,4,4,6 ; dst, src16, src8, dstStride + movh m0, [r1] + movh m1, [r1+24] psraw m0, 5 psraw m1, 5 packuswb m0, m0 packuswb m1, m1 - pavgb m0, [r2] - pavgb m1, [r2+4] - op_%1h m0, [r0], m4 - op_%1h m1, [r0+r3], m5 + movh m2, [r2] + pavgb m0, m2 + movh m2, [r2+4] + pavgb m1, m2 + op_%1f m0, [r0], m4 + op_%1f m1, [r0+r3], m5 lea r0, [r0+r3*2] - mova m0, [r1+48] - mova m1, [r1+72] + movh m0, [r1+48] + movh m1, [r1+72] psraw m0, 5 psraw m1, 5 packuswb m0, m0 packuswb m1, m1 - pavgb m0, [r2+2*4] - pavgb m1, [r2+3*4] - op_%1h m0, [r0], m4 - op_%1h m1, [r0+r3], m5 + movh m2, [r2+2*4] + pavgb m0, m2 + movh m2, [r2+3*4] + pavgb m1, m2 + op_%1f m0, [r0], m4 + op_%1f m1, [r0+r3], m5 RET %endmacro -INIT_MMX mmxext +INIT_XMM sse2 PIXELS4_L2_SHIFT5 put PIXELS4_L2_SHIFT5 avg diff --git a/tests/checkasm/h264qpel.c b/tests/checkasm/h264qpel.c index 96e781f78e2..1e28eb95a68 100644 --- a/tests/checkasm/h264qpel.c +++ b/tests/checkasm/h264qpel.c @@ -74,7 +74,7 @@ void checkasm_check_h264qpel(void) LOCAL_ALIGNED_16(uint8_t, dst1, [BUF_SIZE]); H264QpelContext h; int op, bit_depth, i, j; - declare_func_emms(AV_CPU_FLAG_MMX | AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, const uint8_t *src, ptrdiff_t stride); + declare_func(void, uint8_t *dst, const uint8_t *src, ptrdiff_t stride); for (op = 0; op < 2; op++) { qpel_mc_func (*tab)[16] = op ? h.avg_h264_qpel_pixels_tab : h.put_h264_qpel_pixels_tab; -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
