Mercurial > libavcodec.hg
diff x86/dsputil_mmx.c @ 8760:31138c296ac6 libavcodec
ff_add_hfyu_median_prediction_mmx2
overall ffvhuff decoding speedup: 28% on core2, 25% on k8.
author | lorenm |
---|---|
date | Sun, 08 Feb 2009 17:45:30 +0000 |
parents | 191860960b23 |
children | a5c8210814d7 |
line wrap: on
line diff
--- a/x86/dsputil_mmx.c Sun Feb 08 17:44:04 2009 +0000 +++ b/x86/dsputil_mmx.c Sun Feb 08 17:45:30 2009 +0000 @@ -548,6 +548,41 @@ dst[i] = src1[i] + src2[i]; } +#if HAVE_7REGS +static void add_hfyu_median_prediction_cmov(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top) { + x86_reg w2 = -w; + x86_reg x; + int l = *left & 0xff; + int tl = *left_top & 0xff; + int t; + __asm__ volatile( + "mov %7, %3 \n" + "1: \n" + "movzx (%3,%4), %2 \n" + "mov %2, %k3 \n" + "sub %b1, %b3 \n" + "add %b0, %b3 \n" + "mov %2, %1 \n" + "cmp %0, %2 \n" + "cmovg %0, %2 \n" + "cmovg %1, %0 \n" + "cmp %k3, %0 \n" + "cmovg %k3, %0 \n" + "mov %7, %3 \n" + "cmp %2, %0 \n" + "cmovl %2, %0 \n" + "add (%6,%4), %b0 \n" + "mov %b0, (%5,%4) \n" + "inc %4 \n" + "jl 1b \n" + :"+&q"(l), "+&q"(tl), "=&r"(t), "=&q"(x), "+&r"(w2) + :"r"(dst+w), "r"(diff+w), "rm"(top+w) + ); + *left = l; + *left_top = tl; +} +#endif + #define H263_LOOP_FILTER \ "pxor %%mm7, %%mm7 \n\t"\ "movq %0, %%mm0 \n\t"\ @@ -2328,6 +2363,7 @@ void ff_float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len); void ff_float_to_int16_interleave6_3dnow(int16_t *dst, const float **src, int len); void ff_float_to_int16_interleave6_3dn2(int16_t *dst, const float **src, int len); +void ff_add_hfyu_median_prediction_mmx2(uint8_t *dst, uint8_t *top, uint8_t *diff, int w, int *left, int *left_top); void ff_x264_deblock_v_luma_sse2(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0); void ff_x264_deblock_h_luma_sse2(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0); void ff_x264_deblock_v8_luma_intra_mmxext(uint8_t *pix, int stride, int alpha, int beta); @@ -2760,6 +2796,14 @@ c->biweight_h264_pixels_tab[6]= ff_h264_biweight_4x4_mmx2; c->biweight_h264_pixels_tab[7]= ff_h264_biweight_4x2_mmx2; +#if HAVE_YASM + c->add_hfyu_median_prediction = ff_add_hfyu_median_prediction_mmx2; +#endif +#if HAVE_7REGS + if( mm_flags&FF_MM_3DNOW ) + c->add_hfyu_median_prediction = add_hfyu_median_prediction_cmov; +#endif + if (CONFIG_CAVS_DECODER) ff_cavsdsp_init_mmx2(c, avctx);