Mercurial > mplayer.hg
comparison postproc/rgb2rgb.c @ 2510:42e1ae2c8f5f
mmx optimized 24to32
author | nick |
---|---|
date | Sun, 28 Oct 2001 11:48:50 +0000 |
parents | 94f9825a3736 |
children | 6db23dd30242 |
comparison
equal
deleted
inserted
replaced
2509:22ee3be96a7f | 2510:42e1ae2c8f5f |
---|---|
1 #include <inttypes.h> | 1 #include <inttypes.h> |
2 #include "../config.h" | 2 #include "../config.h" |
3 #include "rgb2rgb.h" | 3 #include "rgb2rgb.h" |
4 #include "mmx.h" | 4 #include "mmx.h" |
5 | |
6 /* TODO: MMX optimization */ | |
7 | 5 |
8 void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) | 6 void rgb24to32(uint8_t *src,uint8_t *dst,uint32_t src_size) |
9 { | 7 { |
10 uint8_t *dest = dst; | 8 uint8_t *dest = dst; |
11 uint8_t *s = src; | 9 uint8_t *s = src; |
12 uint8_t *end; | 10 uint8_t *end; |
11 #ifdef HAVE_MMX | |
12 const uint64_t mask32 = 0x00FFFFFF00FFFFFFULL; | |
13 uint8_t *mm_end; | |
14 #endif | |
13 end = s + src_size; | 15 end = s + src_size; |
16 #ifdef HAVE_MMX | |
17 mm_end = (uint8_t*)((((unsigned long)end)/16)*16); | |
18 __asm __volatile("movq %0, %%mm7"::"m"(mask32):"memory"); | |
19 while(s < mm_end) | |
20 { | |
21 __asm __volatile( | |
22 "movd %1, %%mm0\n\t" | |
23 "movd 3%1, %%mm1\n\t" | |
24 "movd 6%1, %%mm2\n\t" | |
25 "movd 9%1, %%mm3\n\t" | |
26 "punpckldq %%mm1, %%mm0\n\t" | |
27 "punpckldq %%mm3, %%mm2\n\t" | |
28 "pand %%mm7, %%mm0\n\t" | |
29 "pand %%mm7, %%mm2\n\t" | |
30 "movq %%mm0, %0\n\t" | |
31 "movq %%mm2, 8%0" | |
32 :"=m"(*dest) | |
33 :"m"(*s) | |
34 :"memory"); | |
35 dest += 16; | |
36 s += 12; | |
37 } | |
38 #endif | |
14 while(s < end) | 39 while(s < end) |
15 { | 40 { |
16 *dest++ = *s++; | 41 *dest++ = *s++; |
17 *dest++ = *s++; | 42 *dest++ = *s++; |
18 *dest++ = *s++; | 43 *dest++ = *s++; |
19 *dest++ = 0; | 44 *dest++ = 0; |
20 } | 45 } |
21 } | 46 } |
22 | 47 |
48 /* TODO: MMX optimization */ | |
23 void rgb32to24(uint8_t *src,uint8_t *dst,uint32_t src_size) | 49 void rgb32to24(uint8_t *src,uint8_t *dst,uint32_t src_size) |
24 { | 50 { |
25 uint8_t *dest = dst; | 51 uint8_t *dest = dst; |
26 uint8_t *s = src; | 52 uint8_t *s = src; |
27 uint8_t *end; | 53 uint8_t *end; |