diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-02-10 20:20:36 +0300 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-02-11 04:54:09 +0300 |
commit | a30ac54a19d27920ec262ebb104e1f48092a3715 (patch) | |
tree | b10fb52d87c891e190faf757d665b7c254dace2c /libavcodec/x86 | |
parent | 952f231588c18cd1a95e001c517f2d529017363f (diff) |
Add x86-optimized versions of exponent_min().
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
(cherry picked from commit dda3f0ef48aa5c3b03566b60b6bf63211e1fe579)
Diffstat (limited to 'libavcodec/x86')
-rw-r--r-- | libavcodec/x86/Makefile | 4 | ||||
-rw-r--r-- | libavcodec/x86/ac3dsp.asm | 67 | ||||
-rw-r--r-- | libavcodec/x86/ac3dsp_mmx.c | 45 | ||||
-rw-r--r-- | libavcodec/x86/x86util.asm | 10 |
4 files changed, 126 insertions, 0 deletions
diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index 83cec00442..1b58fa121f 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -17,6 +17,10 @@ MMX-OBJS-$(CONFIG_H264PRED) += x86/h264_intrapred_init.o YASM-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_yasm.o +MMX-OBJS-$(CONFIG_AC3_ENCODER) += x86/ac3dsp_mmx.o +MMX-OBJS-$(CONFIG_AC3_FIXED_ENCODER) += x86/ac3dsp_mmx.o +YASM-OBJS-$(CONFIG_AC3_ENCODER) += x86/ac3dsp.o +YASM-OBJS-$(CONFIG_AC3_FIXED_ENCODER) += x86/ac3dsp.o MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp_mmx.o MMX-OBJS-$(CONFIG_MP1FLOAT_DECODER) += x86/mpegaudiodec_mmx.o MMX-OBJS-$(CONFIG_MP2FLOAT_DECODER) += x86/mpegaudiodec_mmx.o diff --git a/libavcodec/x86/ac3dsp.asm b/libavcodec/x86/ac3dsp.asm new file mode 100644 index 0000000000..e71c51cf33 --- /dev/null +++ b/libavcodec/x86/ac3dsp.asm @@ -0,0 +1,67 @@ +;***************************************************************************** +;* x86-optimized AC-3 DSP utils +;* Copyright (c) 2011 Justin Ruggles +;* +;* 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 "x86inc.asm" +%include "x86util.asm" + +SECTION .text + +;----------------------------------------------------------------------------- +; void ff_ac3_exponent_min(uint8_t *exp, int num_reuse_blocks, int nb_coefs) +;----------------------------------------------------------------------------- + +%macro AC3_EXPONENT_MIN 1 +cglobal ac3_exponent_min_%1, 3,4,2, exp, reuse_blks, expn, offset + shl reuse_blksq, 8 + jz .end + LOOP_ALIGN +.nextexp: + mov offsetq, reuse_blksq + mova m0, [expq+offsetq] + sub offsetq, 256 + LOOP_ALIGN +.nextblk: + PMINUB m0, [expq+offsetq], m1 + sub offsetq, 256 + jae .nextblk + mova [expq], m0 + add expq, mmsize + sub expnq, mmsize + jg .nextexp +.end: + REP_RET +%endmacro + +%define PMINUB PMINUB_MMX +%define LOOP_ALIGN +INIT_MMX +AC3_EXPONENT_MIN mmx +%ifdef HAVE_MMX2 +%define PMINUB PMINUB_MMXEXT +%define LOOP_ALIGN ALIGN 16 +AC3_EXPONENT_MIN mmxext +%endif +%ifdef HAVE_SSE +INIT_XMM +AC3_EXPONENT_MIN sse2 +%endif +%undef PMINUB +%undef LOOP_ALIGN diff --git a/libavcodec/x86/ac3dsp_mmx.c b/libavcodec/x86/ac3dsp_mmx.c new file mode 100644 index 0000000000..7ce3aa358d --- /dev/null +++ b/libavcodec/x86/ac3dsp_mmx.c @@ -0,0 +1,45 @@ +/* + * x86-optimized AC-3 DSP utils + * Copyright (c) 2011 Justin Ruggles + * + * 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/x86_cpu.h" +#include "dsputil_mmx.h" +#include "libavcodec/ac3dsp.h" + +extern void ff_ac3_exponent_min_mmx (uint8_t *exp, int num_reuse_blocks, int nb_coefs); +extern void ff_ac3_exponent_min_mmxext(uint8_t *exp, int num_reuse_blocks, int nb_coefs); +extern void ff_ac3_exponent_min_sse2 (uint8_t *exp, int num_reuse_blocks, int nb_coefs); + +av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c) +{ + int mm_flags = av_get_cpu_flags(); + +#if HAVE_YASM + if (mm_flags & AV_CPU_FLAG_MMX) { + c->ac3_exponent_min = ff_ac3_exponent_min_mmx; + } + if (mm_flags & AV_CPU_FLAG_MMX2 && HAVE_MMX2) { + c->ac3_exponent_min = ff_ac3_exponent_min_mmxext; + } + if (mm_flags & AV_CPU_FLAG_SSE2 && HAVE_SSE) { + c->ac3_exponent_min = ff_ac3_exponent_min_sse2; + } +#endif +} diff --git a/libavcodec/x86/x86util.asm b/libavcodec/x86/x86util.asm index 7cabc70b31..b28a6198f7 100644 --- a/libavcodec/x86/x86util.asm +++ b/libavcodec/x86/x86util.asm @@ -434,3 +434,13 @@ movh [%7], %3 movh [%7+%8], %4 %endmacro + +%macro PMINUB_MMX 3 ; dst, src, tmp + mova %3, %1 + psubusb %3, %2 + psubb %1, %3 +%endmacro + +%macro PMINUB_MMXEXT 3 ; dst, src, ignored + pminub %1, %2 +%endmacro |