From 92f8e06ecb431a427ea13d794e5a6bc927a034d2 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 7 May 2013 00:42:22 +0200 Subject: [PATCH] x86: dsputil hpeldsp: Move shared template functions into separate object --- libavcodec/x86/Makefile | 4 +++- libavcodec/x86/dsputil_mmx.c | 23 ++++------------------- libavcodec/x86/dsputil_mmx.h | 10 ++++++++++ libavcodec/x86/hpeldsp_init.c | 7 +++++++ libavcodec/x86/hpeldsp_rnd_template.c | 2 -- libavcodec/x86/rnd_mmx.c | 32 ++++++++++++++++++++++++++++++++ libavcodec/x86/rnd_template.c | 17 +++++++++++++---- 7 files changed, 69 insertions(+), 26 deletions(-) create mode 100644 libavcodec/x86/rnd_mmx.c diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index da4798f..f13f3e0 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -36,12 +36,14 @@ MMX-OBJS-$(CONFIG_DSPUTIL) += x86/dsputil_mmx.o \ x86/fpel_mmx.o \ x86/idct_mmx_xvid.o \ x86/idct_sse2_xvid.o \ + x86/rnd_mmx.o \ x86/simple_idct.o \ MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o \ x86/motion_est.o MMX-OBJS-$(CONFIG_HPELDSP) += x86/fpel_mmx.o \ - x86/hpeldsp_mmx.o + x86/hpeldsp_mmx.o \ + x86/rnd_mmx.o MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o YASM-OBJS-$(CONFIG_AAC_DECODER) += x86/sbrdsp.o diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index 46859a6..bd19947 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -100,21 +100,6 @@ void ff_put_no_rnd_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, uint8_t *src, #if HAVE_INLINE_ASM /***********************************/ -/* MMX rounding */ - -#define DEF(x, y) x ## _ ## y ## _mmx -#define SET_RND MOVQ_WTWO -#define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX(a, b, c, d, e, f) -#define PAVGB(a, b, c, e) PAVGB_MMX(a, b, c, e) - -#include "rnd_template.c" - -#undef DEF -#undef SET_RND -#undef PAVGBP -#undef PAVGB - -/***********************************/ /* standard MMX */ void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels, @@ -877,19 +862,19 @@ QPEL_OP(put_no_rnd_, ff_pw_15, _no_rnd_, mmxext) #if HAVE_INLINE_ASM void ff_put_rv40_qpel8_mc33_mmx(uint8_t *dst, uint8_t *src, ptrdiff_t stride) { - put_pixels8_xy2_mmx(dst, src, stride, 8); + ff_put_pixels8_xy2_mmx(dst, src, stride, 8); } void ff_put_rv40_qpel16_mc33_mmx(uint8_t *dst, uint8_t *src, ptrdiff_t stride) { - put_pixels16_xy2_mmx(dst, src, stride, 16); + ff_put_pixels16_xy2_mmx(dst, src, stride, 16); } void ff_avg_rv40_qpel8_mc33_mmx(uint8_t *dst, uint8_t *src, ptrdiff_t stride) { - avg_pixels8_xy2_mmx(dst, src, stride, 8); + ff_avg_pixels8_xy2_mmx(dst, src, stride, 8); } void ff_avg_rv40_qpel16_mc33_mmx(uint8_t *dst, uint8_t *src, ptrdiff_t stride) { - avg_pixels16_xy2_mmx(dst, src, stride, 16); + ff_avg_pixels16_xy2_mmx(dst, src, stride, 16); } static void gmc_mmx(uint8_t *dst, uint8_t *src, diff --git a/libavcodec/x86/dsputil_mmx.h b/libavcodec/x86/dsputil_mmx.h index 5fe7366..28cc07b 100644 --- a/libavcodec/x86/dsputil_mmx.h +++ b/libavcodec/x86/dsputil_mmx.h @@ -176,6 +176,16 @@ void ff_put_pixels16_sse2(uint8_t *block, const uint8_t *pixels, void ff_avg_pixels8_x2_mmx(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h); +void ff_avg_pixels8_xy2_mmx(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h); +void ff_avg_pixels16_xy2_mmx(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h); + +void ff_put_pixels8_xy2_mmx(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h); +void ff_put_pixels16_xy2_mmx(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h); + void ff_put_rv40_qpel8_mc33_mmx(uint8_t *block, uint8_t *pixels, ptrdiff_t stride); void ff_put_rv40_qpel16_mc33_mmx(uint8_t *block, uint8_t *pixels, ptrdiff_t stride); void ff_avg_rv40_qpel8_mc33_mmx(uint8_t *block, uint8_t *pixels, ptrdiff_t stride); diff --git a/libavcodec/x86/hpeldsp_init.c b/libavcodec/x86/hpeldsp_init.c index 0f30517..739099e 100644 --- a/libavcodec/x86/hpeldsp_init.c +++ b/libavcodec/x86/hpeldsp_init.c @@ -77,8 +77,12 @@ void ff_avg_pixels8_xy2_3dnow(uint8_t *block, const uint8_t *pixels, #define avg_pixels8_mmx ff_avg_pixels8_mmx #define avg_pixels8_x2_mmx ff_avg_pixels8_x2_mmx #define avg_pixels16_mmx ff_avg_pixels16_mmx +#define avg_pixels8_xy2_mmx ff_avg_pixels8_xy2_mmx +#define avg_pixels16_xy2_mmx ff_avg_pixels16_xy2_mmx #define put_pixels8_mmx ff_put_pixels8_mmx #define put_pixels16_mmx ff_put_pixels16_mmx +#define put_pixels8_xy2_mmx ff_put_pixels8_xy2_mmx +#define put_pixels16_xy2_mmx ff_put_pixels16_xy2_mmx #define avg_no_rnd_pixels16_mmx ff_avg_pixels16_mmx #define put_no_rnd_pixels8_mmx ff_put_pixels8_mmx #define put_no_rnd_pixels16_mmx ff_put_pixels16_mmx @@ -91,13 +95,16 @@ void ff_avg_pixels8_xy2_3dnow(uint8_t *block, const uint8_t *pixels, #define SET_RND MOVQ_WONE #define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX_NO_RND(a, b, c, d, e, f) #define PAVGB(a, b, c, e) PAVGB_MMX_NO_RND(a, b, c, e) +#define STATIC static +#include "rnd_template.c" #include "hpeldsp_rnd_template.c" #undef DEF #undef SET_RND #undef PAVGBP #undef PAVGB +#undef STATIC /***********************************/ /* MMX rounding */ diff --git a/libavcodec/x86/hpeldsp_rnd_template.c b/libavcodec/x86/hpeldsp_rnd_template.c index 90619b4..7ad54a7 100644 --- a/libavcodec/x86/hpeldsp_rnd_template.c +++ b/libavcodec/x86/hpeldsp_rnd_template.c @@ -24,8 +24,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "rnd_template.c" - // put_pixels static void DEF(put, pixels8_x2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h) { diff --git a/libavcodec/x86/rnd_mmx.c b/libavcodec/x86/rnd_mmx.c new file mode 100644 index 0000000..791b911 --- /dev/null +++ b/libavcodec/x86/rnd_mmx.c @@ -0,0 +1,32 @@ +/* + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "dsputil_mmx.h" + +#if HAVE_INLINE_ASM + +#define DEF(x, y) ff_ ## x ## _ ## y ## _mmx +#define SET_RND MOVQ_WTWO +#define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX(a, b, c, d, e, f) +#define PAVGB(a, b, c, e) PAVGB_MMX(a, b, c, e) +#define STATIC + +#include "rnd_template.c" + +#endif /* HAVE_INLINE_ASM */ diff --git a/libavcodec/x86/rnd_template.c b/libavcodec/x86/rnd_template.c index 03f2a0d..fb275f7 100644 --- a/libavcodec/x86/rnd_template.c +++ b/libavcodec/x86/rnd_template.c @@ -24,8 +24,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include + // put_pixels -static void DEF(put, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h) +STATIC void DEF(put, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h) { MOVQ_ZERO(mm7); SET_RND(mm6); // =2 for rnd and =1 for no_rnd version @@ -93,7 +97,8 @@ static void DEF(put, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff // avg_pixels // this routine is 'slightly' suboptimal but mostly unused -static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h) +STATIC void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h) { MOVQ_ZERO(mm7); SET_RND(mm6); // =2 for rnd and =1 for no_rnd version @@ -168,12 +173,16 @@ static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff } //FIXME optimize -static void DEF(put, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h){ +STATIC void DEF(put, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h) +{ DEF(put, pixels8_xy2)(block , pixels , line_size, h); DEF(put, pixels8_xy2)(block+8, pixels+8, line_size, h); } -static void DEF(avg, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h){ +STATIC void DEF(avg, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, + ptrdiff_t line_size, int h) +{ DEF(avg, pixels8_xy2)(block , pixels , line_size, h); DEF(avg, pixels8_xy2)(block+8, pixels+8, line_size, h); } -- 2.7.4