* commit '6a8561dbd7c078eb75985f7011ad1ad3fda9e223': x86: Factorize duplicated inline assembly snippets Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -111,60 +111,6 @@ void ff_put_no_rnd_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, uint8_t *src, | |||
| #if HAVE_INLINE_ASM | |||
| #define JUMPALIGN() __asm__ volatile (".p2align 3"::) | |||
| #define MOVQ_ZERO(regd) __asm__ volatile ("pxor %%"#regd", %%"#regd ::) | |||
| #define MOVQ_BFE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "paddb %%"#regd", %%"#regd" \n\t" ::) | |||
| #ifndef PIC | |||
| #define MOVQ_BONE(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_bone)) | |||
| #define MOVQ_WTWO(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_wtwo)) | |||
| #else | |||
| // for shared library it's better to use this way for accessing constants | |||
| // pcmpeqd -> -1 | |||
| #define MOVQ_BONE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "packuswb %%"#regd", %%"#regd" \n\t" ::) | |||
| #define MOVQ_WTWO(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "psllw $1, %%"#regd" \n\t"::) | |||
| #endif | |||
| // using regr as temporary and for the output result | |||
| // first argument is unmodifed and second is trashed | |||
| // regfe is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGB_MMX(rega, regb, regr, regfe) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pand "#regfe", "#regb" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" | |||
| // mm6 is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGBP_MMX(rega, regb, regr, regc, regd, regp) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "movq "#regc", "#regp" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "por "#regd", "#regp" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pxor "#regc", "#regd" \n\t" \ | |||
| "pand %%mm6, "#regb" \n\t" \ | |||
| "pand %%mm6, "#regd" \n\t" \ | |||
| "psrlq $1, "#regd" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" \ | |||
| "psubb "#regd", "#regp" \n\t" | |||
| /***********************************/ | |||
| /* MMX rounding */ | |||
| @@ -72,6 +72,82 @@ extern const double ff_pd_2[2]; | |||
| "pcmpeqd %%" #regd ", %%" #regd " \n\t" \ | |||
| "psrlw $15, %%" #regd ::) | |||
| #define JUMPALIGN() __asm__ volatile (".p2align 3"::) | |||
| #define MOVQ_ZERO(regd) __asm__ volatile ("pxor %%"#regd", %%"#regd ::) | |||
| #define MOVQ_BFE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "paddb %%"#regd", %%"#regd" \n\t" ::) | |||
| #ifndef PIC | |||
| #define MOVQ_BONE(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_bone)) | |||
| #define MOVQ_WTWO(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_wtwo)) | |||
| #else | |||
| // for shared library it's better to use this way for accessing constants | |||
| // pcmpeqd -> -1 | |||
| #define MOVQ_BONE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "packuswb %%"#regd", %%"#regd" \n\t" ::) | |||
| #define MOVQ_WTWO(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "psllw $1, %%"#regd" \n\t"::) | |||
| #endif | |||
| // using regr as temporary and for the output result | |||
| // first argument is unmodifed and second is trashed | |||
| // regfe is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGB_MMX_NO_RND(rega, regb, regr, regfe) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "pand "#regb", "#regr" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pand "#regfe", "#regb" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "paddb "#regb", "#regr" \n\t" | |||
| #define PAVGB_MMX(rega, regb, regr, regfe) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pand "#regfe", "#regb" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" | |||
| // mm6 is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGBP_MMX_NO_RND(rega, regb, regr, regc, regd, regp) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "movq "#regc", "#regp" \n\t" \ | |||
| "pand "#regb", "#regr" \n\t" \ | |||
| "pand "#regd", "#regp" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pxor "#regc", "#regd" \n\t" \ | |||
| "pand %%mm6, "#regb" \n\t" \ | |||
| "pand %%mm6, "#regd" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psrlq $1, "#regd" \n\t" \ | |||
| "paddb "#regb", "#regr" \n\t" \ | |||
| "paddb "#regd", "#regp" \n\t" | |||
| #define PAVGBP_MMX(rega, regb, regr, regc, regd, regp) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "movq "#regc", "#regp" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "por "#regd", "#regp" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pxor "#regc", "#regd" \n\t" \ | |||
| "pand %%mm6, "#regb" \n\t" \ | |||
| "pand %%mm6, "#regd" \n\t" \ | |||
| "psrlq $1, "#regd" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" \ | |||
| "psubb "#regd", "#regp" \n\t" | |||
| void ff_dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx); | |||
| void ff_dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx); | |||
| @@ -77,82 +77,6 @@ void ff_avg_pixels8_xy2_3dnow(uint8_t *block, const uint8_t *pixels, | |||
| #if HAVE_INLINE_ASM | |||
| #define JUMPALIGN() __asm__ volatile (".p2align 3"::) | |||
| #define MOVQ_ZERO(regd) __asm__ volatile ("pxor %%"#regd", %%"#regd ::) | |||
| #define MOVQ_BFE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "paddb %%"#regd", %%"#regd" \n\t" ::) | |||
| #ifndef PIC | |||
| #define MOVQ_BONE(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_bone)) | |||
| #define MOVQ_WTWO(regd) __asm__ volatile ("movq %0, %%"#regd" \n\t" :: "m"(ff_wtwo)) | |||
| #else | |||
| // for shared library it's better to use this way for accessing constants | |||
| // pcmpeqd -> -1 | |||
| #define MOVQ_BONE(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "packuswb %%"#regd", %%"#regd" \n\t" ::) | |||
| #define MOVQ_WTWO(regd) \ | |||
| __asm__ volatile ( \ | |||
| "pcmpeqd %%"#regd", %%"#regd" \n\t" \ | |||
| "psrlw $15, %%"#regd" \n\t" \ | |||
| "psllw $1, %%"#regd" \n\t"::) | |||
| #endif | |||
| // using regr as temporary and for the output result | |||
| // first argument is unmodifed and second is trashed | |||
| // regfe is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGB_MMX_NO_RND(rega, regb, regr, regfe) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "pand "#regb", "#regr" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pand "#regfe", "#regb" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "paddb "#regb", "#regr" \n\t" | |||
| #define PAVGB_MMX(rega, regb, regr, regfe) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pand "#regfe", "#regb" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" | |||
| // mm6 is supposed to contain 0xfefefefefefefefe | |||
| #define PAVGBP_MMX_NO_RND(rega, regb, regr, regc, regd, regp) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "movq "#regc", "#regp" \n\t" \ | |||
| "pand "#regb", "#regr" \n\t" \ | |||
| "pand "#regd", "#regp" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pxor "#regc", "#regd" \n\t" \ | |||
| "pand %%mm6, "#regb" \n\t" \ | |||
| "pand %%mm6, "#regd" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psrlq $1, "#regd" \n\t" \ | |||
| "paddb "#regb", "#regr" \n\t" \ | |||
| "paddb "#regd", "#regp" \n\t" | |||
| #define PAVGBP_MMX(rega, regb, regr, regc, regd, regp) \ | |||
| "movq "#rega", "#regr" \n\t" \ | |||
| "movq "#regc", "#regp" \n\t" \ | |||
| "por "#regb", "#regr" \n\t" \ | |||
| "por "#regd", "#regp" \n\t" \ | |||
| "pxor "#rega", "#regb" \n\t" \ | |||
| "pxor "#regc", "#regd" \n\t" \ | |||
| "pand %%mm6, "#regb" \n\t" \ | |||
| "pand %%mm6, "#regd" \n\t" \ | |||
| "psrlq $1, "#regd" \n\t" \ | |||
| "psrlq $1, "#regb" \n\t" \ | |||
| "psubb "#regb", "#regr" \n\t" \ | |||
| "psubb "#regd", "#regp" \n\t" | |||
| /***********************************/ | |||
| /* MMX no rounding */ | |||
| #define NO_RND 1 | |||