diff options
author | Nick Kurshev <nickols_k@mail.ru> | 2001-10-28 11:48:50 +0000 |
---|---|---|
committer | Nick Kurshev <nickols_k@mail.ru> | 2001-10-28 11:48:50 +0000 |
commit | 49a0c6eec83ace5faec994b8791c9eeb19778eed (patch) | |
tree | e49693989548366638489187eb1b14883f2a84df | |
parent | 607d7d03736a61da4b86875831199c2e13e9c87b (diff) | |
download | ffmpeg-49a0c6eec83ace5faec994b8791c9eeb19778eed.tar.gz |
mmx optimized 24to32
Originally committed as revision 2511 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
-rw-r--r-- | postproc/rgb2rgb.c | 30 | ||||
-rw-r--r-- | postproc/rgb2rgb_template.c | 30 |
2 files changed, 56 insertions, 4 deletions
diff --git a/postproc/rgb2rgb.c b/postproc/rgb2rgb.c index 5c85f1043a..dc5f062f3e 100644 --- a/postproc/rgb2rgb.c +++ b/postproc/rgb2rgb.c @@ -3,14 +3,39 @@ #include "rgb2rgb.h" #include "mmx.h" -/* TODO: MMX optimization */ - void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) { uint8_t *dest = dst; uint8_t *s = src; uint8_t *end; +#ifdef HAVE_MMX + const uint64_t mask32 = 0x00FFFFFF00FFFFFFULL; + uint8_t *mm_end; +#endif end = s + src_size; +#ifdef HAVE_MMX + mm_end = (uint8_t*)((((unsigned long)end)/16)*16); + __asm __volatile("movq %0, %%mm7"::"m"(mask32):"memory"); + while(s < mm_end) + { + __asm __volatile( + "movd %1, %%mm0\n\t" + "movd 3%1, %%mm1\n\t" + "movd 6%1, %%mm2\n\t" + "movd 9%1, %%mm3\n\t" + "punpckldq %%mm1, %%mm0\n\t" + "punpckldq %%mm3, %%mm2\n\t" + "pand %%mm7, %%mm0\n\t" + "pand %%mm7, %%mm2\n\t" + "movq %%mm0, %0\n\t" + "movq %%mm2, 8%0" + :"=m"(*dest) + :"m"(*s) + :"memory"); + dest += 16; + s += 12; + } +#endif while(s < end) { *dest++ = *s++; @@ -20,6 +45,7 @@ void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) } } +/* TODO: MMX optimization */ void rgb32to24(uint8_t *src,uint8_t *dst,uint32_t src_size) { uint8_t *dest = dst; diff --git a/postproc/rgb2rgb_template.c b/postproc/rgb2rgb_template.c index 5c85f1043a..dc5f062f3e 100644 --- a/postproc/rgb2rgb_template.c +++ b/postproc/rgb2rgb_template.c @@ -3,14 +3,39 @@ #include "rgb2rgb.h" #include "mmx.h" -/* TODO: MMX optimization */ - void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) { uint8_t *dest = dst; uint8_t *s = src; uint8_t *end; +#ifdef HAVE_MMX + const uint64_t mask32 = 0x00FFFFFF00FFFFFFULL; + uint8_t *mm_end; +#endif end = s + src_size; +#ifdef HAVE_MMX + mm_end = (uint8_t*)((((unsigned long)end)/16)*16); + __asm __volatile("movq %0, %%mm7"::"m"(mask32):"memory"); + while(s < mm_end) + { + __asm __volatile( + "movd %1, %%mm0\n\t" + "movd 3%1, %%mm1\n\t" + "movd 6%1, %%mm2\n\t" + "movd 9%1, %%mm3\n\t" + "punpckldq %%mm1, %%mm0\n\t" + "punpckldq %%mm3, %%mm2\n\t" + "pand %%mm7, %%mm0\n\t" + "pand %%mm7, %%mm2\n\t" + "movq %%mm0, %0\n\t" + "movq %%mm2, 8%0" + :"=m"(*dest) + :"m"(*s) + :"memory"); + dest += 16; + s += 12; + } +#endif while(s < end) { *dest++ = *s++; @@ -20,6 +45,7 @@ void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) } } +/* TODO: MMX optimization */ void rgb32to24(uint8_t *src,uint8_t *dst,uint32_t src_size) { uint8_t *dest = dst; |