diff --git a/libavcodec/cavsdsp.c b/libavcodec/cavsdsp.c index bdb8d6d064..15020a8ce8 100644 --- a/libavcodec/cavsdsp.c +++ b/libavcodec/cavsdsp.c @@ -546,5 +546,6 @@ av_cold void ff_cavsdsp_init(CAVSDSPContext* c, AVCodecContext *avctx) { c->cavs_idct8_add = cavs_idct8_add_c; c->idct_perm = FF_NO_IDCT_PERM; - if (HAVE_MMX) ff_cavsdsp_init_mmx(c, avctx); + if (ARCH_X86) + ff_cavsdsp_init_x86(c, avctx); } diff --git a/libavcodec/cavsdsp.h b/libavcodec/cavsdsp.h index 99b0ea3774..fff9c1cc90 100644 --- a/libavcodec/cavsdsp.h +++ b/libavcodec/cavsdsp.h @@ -37,6 +37,6 @@ typedef struct CAVSDSPContext { } CAVSDSPContext; void ff_cavsdsp_init(CAVSDSPContext* c, AVCodecContext *avctx); -void ff_cavsdsp_init_mmx(CAVSDSPContext* c, AVCodecContext *avctx); +void ff_cavsdsp_init_x86(CAVSDSPContext* c, AVCodecContext *avctx); #endif /* AVCODEC_CAVSDSP_H */ diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile index d0cfb955a7..2962d39f0b 100644 --- a/libavcodec/x86/Makefile +++ b/libavcodec/x86/Makefile @@ -2,6 +2,7 @@ OBJS += x86/fmtconvert_init.o OBJS-$(CONFIG_AAC_DECODER) += x86/sbrdsp_init.o OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp_init.o +OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp.o OBJS-$(CONFIG_DNXHD_ENCODER) += x86/dnxhdenc.o OBJS-$(CONFIG_FFT) += x86/fft_init.o OBJS-$(CONFIG_H264DSP) += x86/h264dsp_init.o @@ -29,7 +30,6 @@ MMX-OBJS += x86/dsputil_mmx.o \ x86/idct_sse2_xvid.o \ x86/simple_idct.o \ -MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp.o MMX-OBJS-$(CONFIG_DWT) += x86/snowdsp.o MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o \ x86/motion_est.o diff --git a/libavcodec/x86/cavsdsp.c b/libavcodec/x86/cavsdsp.c index aef74c4d36..5350f7ea6a 100644 --- a/libavcodec/x86/cavsdsp.c +++ b/libavcodec/x86/cavsdsp.c @@ -25,11 +25,13 @@ #include "libavutil/common.h" #include "libavutil/cpu.h" #include "libavutil/x86/asm.h" +#include "libavutil/x86/cpu.h" #include "libavcodec/dsputil.h" #include "libavcodec/cavsdsp.h" #include "dsputil_mmx.h" +#include "config.h" -#if HAVE_INLINE_ASM +#if (HAVE_MMXEXT_INLINE || HAVE_AMD3DNOW_INLINE) /* in/out: mma=mma+mmb, mmb=mmb-mma */ #define SUMSUB_BA( a, b ) \ @@ -433,15 +435,12 @@ static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc03_ ## MMX(uint8_t *dst, ui "pavgb " #temp ", " #a " \n\t"\ "mov" #size " " #a ", " #b " \n\t" -QPEL_CAVS(put_, PUT_OP, 3dnow) -QPEL_CAVS(avg_, AVG_3DNOW_OP, 3dnow) +#endif /* (HAVE_MMXEXT_INLINE || HAVE_AMD3DNOW_INLINE) */ + +#if HAVE_MMXEXT_INLINE QPEL_CAVS(put_, PUT_OP, mmx2) QPEL_CAVS(avg_, AVG_MMX2_OP, mmx2) -CAVS_MC(put_, 8, 3dnow) -CAVS_MC(put_, 16,3dnow) -CAVS_MC(avg_, 8, 3dnow) -CAVS_MC(avg_, 16,3dnow) CAVS_MC(put_, 8, mmx2) CAVS_MC(put_, 16,mmx2) CAVS_MC(avg_, 8, mmx2) @@ -463,6 +462,16 @@ static void ff_cavsdsp_init_mmx2(CAVSDSPContext* c, AVCodecContext *avctx) { c->cavs_idct8_add = cavs_idct8_add_mmx; c->idct_perm = FF_TRANSPOSE_IDCT_PERM; } +#endif /* HAVE_MMXEXT_INLINE */ + +#if HAVE_AMD3DNOW_INLINE +QPEL_CAVS(put_, PUT_OP, 3dnow) +QPEL_CAVS(avg_, AVG_3DNOW_OP, 3dnow) + +CAVS_MC(put_, 8, 3dnow) +CAVS_MC(put_, 16,3dnow) +CAVS_MC(avg_, 8, 3dnow) +CAVS_MC(avg_, 16,3dnow) static void ff_cavsdsp_init_3dnow(CAVSDSPContext* c, AVCodecContext *avctx) { #define dspfunc(PFX, IDX, NUM) \ @@ -480,15 +489,16 @@ static void ff_cavsdsp_init_3dnow(CAVSDSPContext* c, AVCodecContext *avctx) { c->cavs_idct8_add = cavs_idct8_add_mmx; c->idct_perm = FF_TRANSPOSE_IDCT_PERM; } +#endif /* HAVE_AMD3DNOW_INLINE */ -#endif /* HAVE_INLINE_ASM */ - -void ff_cavsdsp_init_mmx(CAVSDSPContext *c, AVCodecContext *avctx) +av_cold void ff_cavsdsp_init_x86(CAVSDSPContext *c, AVCodecContext *avctx) { int mm_flags = av_get_cpu_flags(); -#if HAVE_INLINE_ASM +#if HAVE_MMXEXT_INLINE if (mm_flags & AV_CPU_FLAG_MMXEXT) ff_cavsdsp_init_mmx2(c, avctx); +#endif /* HAVE_MMXEXT_INLINE */ +#if HAVE_AMD3DNOW_INLINE if (mm_flags & AV_CPU_FLAG_3DNOW) ff_cavsdsp_init_3dnow(c, avctx); -#endif /* HAVE_INLINE_ASM */ +#endif /* HAVE_AMD3DNOW_INLINE */ }