--- libavcodec/x86/Makefile | 1 + libavcodec/x86/huffyuvencdsp.asm | 58 ++++++++++++++++++++++++++++++++++++++ libavcodec/x86/huffyuvencdsp_mmx.c | 37 ++++-------------------- 3 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 libavcodec/x86/huffyuvencdsp.asm
diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index 4591e4b..e1b1f0c 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -115,6 +115,7 @@ YASM-OBJS-$(CONFIG_H264QPEL) += x86/h264_qpel_8bit.o \ YASM-OBJS-$(CONFIG_HPELDSP) += x86/fpel.o \ x86/hpeldsp.o YASM-OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp.o +YASM-OBJS-$(CONFIG_HUFFYUVENCDSP) += x86/huffyuvencdsp.o YASM-OBJS-$(CONFIG_IDCTDSP) += x86/idctdsp.o YASM-OBJS-$(CONFIG_LLAUDDSP) += x86/lossless_audiodsp.o YASM-OBJS-$(CONFIG_LLVIDDSP) += x86/lossless_videodsp.o diff --git a/libavcodec/x86/huffyuvencdsp.asm b/libavcodec/x86/huffyuvencdsp.asm new file mode 100644 index 0000000..97de7e9 --- /dev/null +++ b/libavcodec/x86/huffyuvencdsp.asm @@ -0,0 +1,58 @@ +;************************************************************************ +;* SIMD-optimized HuffYUV encoding functions +;* Copyright (c) 2000, 2001 Fabrice Bellard +;* Copyright (c) 2002-2004 Michael Niedermayer <michae...@gmx.at> +;* +;* MMX optimization by Nick Kurshev <nickol...@mail.ru> +;* Conversion to NASM format by Tiancheng "Timothy" Gu <timothyg...@gmail.com> +;* +;* This file is part of FFmpeg. +;* +;* FFmpeg is free software; you can redistribute it and/or +;* modify it under the terms of the GNU Lesser General Public +;* License as published by the Free Software Foundation; either +;* version 2.1 of the License, or (at your option) any later version. +;* +;* FFmpeg is distributed in the hope that it will be useful, +;* but WITHOUT ANY WARRANTY; without even the implied warranty of +;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;* Lesser General Public License for more details. +;* +;* You should have received a copy of the GNU Lesser General Public +;* License along with FFmpeg; if not, write to the Free Software +;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +;****************************************************************************** + +%include "libavutil/x86/x86util.asm" + +section .text + +INIT_MMX mmx +; void ff_diff_bytes_mmx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, +; intptr_t w); +cglobal diff_bytes, 4,6,0, dst, src1, src2, w, i + xor iq, iq + cmp wq, 16 + jb .loop2 + sub wq, 15 +.loop: + mova m0, [src2q + iq] + mova m1, [src1q + iq] + psubb m1, m0 + mova [iq + dstq], m1 + mova m0, [src2q + iq + 8] + mova m1, [src1q + iq + 8] + psubb m1, m0 + mova [8 + iq + dstq], m1 + add iq, 16 + cmp iq, wq + jb .loop + add wq, 15 +.loop2: + mov r6b, byte [src1q + iq] + sub r6b, byte [src2q + iq] + mov byte [dstq + iq], r6b + inc iq + cmp iq, wq + jb .loop2 + REP_RET diff --git a/libavcodec/x86/huffyuvencdsp_mmx.c b/libavcodec/x86/huffyuvencdsp_mmx.c index ee60f4c..c5f81c8 100644 --- a/libavcodec/x86/huffyuvencdsp_mmx.c +++ b/libavcodec/x86/huffyuvencdsp_mmx.c @@ -29,33 +29,10 @@ #include "libavcodec/huffyuvencdsp.h" #include "libavcodec/mathops.h" -#if HAVE_INLINE_ASM - -static void diff_bytes_mmx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, - intptr_t w) -{ - x86_reg i = 0; - - if (w >= 16) - __asm__ volatile ( - "1: \n\t" - "movq (%2, %0), %%mm0 \n\t" - "movq (%1, %0), %%mm1 \n\t" - "psubb %%mm0, %%mm1 \n\t" - "movq %%mm1, (%3, %0) \n\t" - "movq 8(%2, %0), %%mm0 \n\t" - "movq 8(%1, %0), %%mm1 \n\t" - "psubb %%mm0, %%mm1 \n\t" - "movq %%mm1, 8(%3, %0) \n\t" - "add $16, %0 \n\t" - "cmp %4, %0 \n\t" - " jb 1b \n\t" - : "+r" (i) - : "r" (src1), "r" (src2), "r" (dst), "r" ((x86_reg) w - 15)); +void ff_diff_bytes_mmx(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, + intptr_t w); - for (; i < w; i++) - dst[i + 0] = src1[i + 0] - src2[i + 0]; -} +#if HAVE_INLINE_ASM static void sub_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, intptr_t w, @@ -101,15 +78,13 @@ static void sub_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *src1, av_cold void ff_huffyuvencdsp_init_x86(HuffYUVEncDSPContext *c) { -#if HAVE_INLINE_ASM - int cpu_flags = av_get_cpu_flags(); + av_unused int cpu_flags = av_get_cpu_flags(); - if (INLINE_MMX(cpu_flags)) { - c->diff_bytes = diff_bytes_mmx; + if (EXTERNAL_MMX(cpu_flags)) { + c->diff_bytes = ff_diff_bytes_mmx; } if (INLINE_MMXEXT(cpu_flags)) { c->sub_hfyu_median_pred = sub_hfyu_median_pred_mmxext; } -#endif /* HAVE_INLINE_ASM */ } -- 1.9.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel