Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions and setting alpha channel to 0xFF
Originally committed as revision 28808 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
This commit is contained in:
parent
3444c91441
commit
a284d03093
@ -1202,6 +1202,25 @@ static inline void RENAME(rgb16tobgr24)(const uint8_t *src, uint8_t *dst, long s
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* mm0 = 00 B3 00 B2 00 B1 00 B0
|
||||
* mm1 = 00 G3 00 G2 00 G1 00 G0
|
||||
* mm2 = 00 R3 00 R2 00 R1 00 R0
|
||||
* mm6 = FF FF FF FF FF FF FF FF
|
||||
* mm7 = 00 00 00 00 00 00 00 00
|
||||
*/
|
||||
#define PACK_RGB32 \
|
||||
"packuswb %%mm7, %%mm0 \n\t" /* 00 00 00 00 B3 B2 B1 B0 */ \
|
||||
"packuswb %%mm7, %%mm1 \n\t" /* 00 00 00 00 G3 G2 G1 G0 */ \
|
||||
"packuswb %%mm7, %%mm2 \n\t" /* 00 00 00 00 R3 R2 R1 R0 */ \
|
||||
"punpcklbw %%mm1, %%mm0 \n\t" /* G3 B3 G2 B2 G1 B1 G0 B0 */ \
|
||||
"punpcklbw %%mm6, %%mm2 \n\t" /* FF R3 FF R2 FF R1 FF R0 */ \
|
||||
"movq %%mm0, %%mm3 \n\t" \
|
||||
"punpcklwd %%mm2, %%mm0 \n\t" /* FF R1 G1 B1 FF R0 G0 B0 */ \
|
||||
"punpckhwd %%mm2, %%mm3 \n\t" /* FF R3 G3 B3 FF R2 G2 B2 */ \
|
||||
MOVNTQ" %%mm0, %0 \n\t" \
|
||||
MOVNTQ" %%mm3, 8%0 \n\t" \
|
||||
|
||||
static inline void RENAME(rgb15to32)(const uint8_t *src, uint8_t *dst, long src_size)
|
||||
{
|
||||
const uint16_t *end;
|
||||
@ -1214,6 +1233,7 @@ static inline void RENAME(rgb15to32)(const uint8_t *src, uint8_t *dst, long src_
|
||||
#if HAVE_MMX
|
||||
__asm__ volatile(PREFETCH" %0"::"m"(*s):"memory");
|
||||
__asm__ volatile("pxor %%mm7,%%mm7 \n\t":::"memory");
|
||||
__asm__ volatile("pcmpeqd %%mm6,%%mm6 \n\t":::"memory");
|
||||
mm_end = end - 3;
|
||||
while (s < mm_end)
|
||||
{
|
||||
@ -1228,25 +1248,7 @@ static inline void RENAME(rgb15to32)(const uint8_t *src, uint8_t *dst, long src_
|
||||
"psllq $3, %%mm0 \n\t"
|
||||
"psrlq $2, %%mm1 \n\t"
|
||||
"psrlq $7, %%mm2 \n\t"
|
||||
"movq %%mm0, %%mm3 \n\t"
|
||||
"movq %%mm1, %%mm4 \n\t"
|
||||
"movq %%mm2, %%mm5 \n\t"
|
||||
"punpcklwd %%mm7, %%mm0 \n\t"
|
||||
"punpcklwd %%mm7, %%mm1 \n\t"
|
||||
"punpcklwd %%mm7, %%mm2 \n\t"
|
||||
"punpckhwd %%mm7, %%mm3 \n\t"
|
||||
"punpckhwd %%mm7, %%mm4 \n\t"
|
||||
"punpckhwd %%mm7, %%mm5 \n\t"
|
||||
"psllq $8, %%mm1 \n\t"
|
||||
"psllq $16, %%mm2 \n\t"
|
||||
"por %%mm1, %%mm0 \n\t"
|
||||
"por %%mm2, %%mm0 \n\t"
|
||||
"psllq $8, %%mm4 \n\t"
|
||||
"psllq $16, %%mm5 \n\t"
|
||||
"por %%mm4, %%mm3 \n\t"
|
||||
"por %%mm5, %%mm3 \n\t"
|
||||
MOVNTQ" %%mm0, %0 \n\t"
|
||||
MOVNTQ" %%mm3, 8%0 \n\t"
|
||||
PACK_RGB32
|
||||
:"=m"(*d)
|
||||
:"m"(*s),"m"(mask15b),"m"(mask15g),"m"(mask15r)
|
||||
:"memory");
|
||||
@ -1292,6 +1294,7 @@ static inline void RENAME(rgb16to32)(const uint8_t *src, uint8_t *dst, long src_
|
||||
#if HAVE_MMX
|
||||
__asm__ volatile(PREFETCH" %0"::"m"(*s):"memory");
|
||||
__asm__ volatile("pxor %%mm7,%%mm7 \n\t":::"memory");
|
||||
__asm__ volatile("pcmpeqd %%mm6,%%mm6 \n\t":::"memory");
|
||||
mm_end = end - 3;
|
||||
while (s < mm_end)
|
||||
{
|
||||
@ -1306,25 +1309,7 @@ static inline void RENAME(rgb16to32)(const uint8_t *src, uint8_t *dst, long src_
|
||||
"psllq $3, %%mm0 \n\t"
|
||||
"psrlq $3, %%mm1 \n\t"
|
||||
"psrlq $8, %%mm2 \n\t"
|
||||
"movq %%mm0, %%mm3 \n\t"
|
||||
"movq %%mm1, %%mm4 \n\t"
|
||||
"movq %%mm2, %%mm5 \n\t"
|
||||
"punpcklwd %%mm7, %%mm0 \n\t"
|
||||
"punpcklwd %%mm7, %%mm1 \n\t"
|
||||
"punpcklwd %%mm7, %%mm2 \n\t"
|
||||
"punpckhwd %%mm7, %%mm3 \n\t"
|
||||
"punpckhwd %%mm7, %%mm4 \n\t"
|
||||
"punpckhwd %%mm7, %%mm5 \n\t"
|
||||
"psllq $8, %%mm1 \n\t"
|
||||
"psllq $16, %%mm2 \n\t"
|
||||
"por %%mm1, %%mm0 \n\t"
|
||||
"por %%mm2, %%mm0 \n\t"
|
||||
"psllq $8, %%mm4 \n\t"
|
||||
"psllq $16, %%mm5 \n\t"
|
||||
"por %%mm4, %%mm3 \n\t"
|
||||
"por %%mm5, %%mm3 \n\t"
|
||||
MOVNTQ" %%mm0, %0 \n\t"
|
||||
MOVNTQ" %%mm3, 8%0 \n\t"
|
||||
PACK_RGB32
|
||||
:"=m"(*d)
|
||||
:"m"(*s),"m"(mask16b),"m"(mask16g),"m"(mask16r)
|
||||
:"memory");
|
||||
|
Loading…
Reference in New Issue
Block a user