register const char* s=src+src_size; register char* d=dst+src_size; register int offs=-src_size;
register int offs=15-src_size; register const char* s=src-offs; register char* d=dst-offs;
static inline void RENAME(rgb15to16)(const uint8_t *src,uint8_t *dst,unsigned src_size){#ifdef HAVE_MMX  register const char* s=src+src_size;  register char* d=dst+src_size;  register int offs=-src_size;  __asm __volatile(PREFETCH"	%0"::"m"(*(s+offs)));  __asm __volatile(	"movq	%0, %%mm4\n\t"	::"m"(mask15s));  while(offs<0)  {	__asm __volatile(		PREFETCH"	32%1\n\t"		"movq	%1, %%mm0\n\t"		"movq	8%1, %%mm2\n\t"		"movq	%%mm0, %%mm1\n\t"		"movq	%%mm2, %%mm3\n\t"		"pand	%%mm4, %%mm0\n\t"		"pand	%%mm4, %%mm2\n\t"		"paddw	%%mm1, %%mm0\n\t"		"paddw	%%mm3, %%mm2\n\t"		MOVNTQ"	%%mm0, %0\n\t"		MOVNTQ"	%%mm2, 8%0"		:"=m"(*(d+offs))		:"m"(*(s+offs))		);	offs+=16;  }  __asm __volatile(SFENCE:::"memory");  __asm __volatile(EMMS:::"memory");#else#if 0   const uint16_t *s1=( uint16_t * )src;   uint16_t *d1=( uint16_t * )dst;   uint16_t *e=((uint8_t *)s1)+src_size;   while( s1<e ){     register int x=*( s1++ );     /* rrrrrggggggbbbbb        0rrrrrgggggbbbbb        0111 1111 1110 0000=0x7FE0        00000000000001 1111=0x001F */     *( d1++ )=( x&0x001F )|( ( x&0x7FE0 )<<1 );   }#else	const unsigned *s1=( unsigned * )src;	unsigned *d1=( unsigned * )dst;	int i;	int size= src_size>>2;	for(i=0; i<size; i++)	{		register int x= s1[i];//		d1[i] = x + (x&0x7FE07FE0); //faster but need msbit =0 which might not allways be true		d1[i] = (x&0x7FFF7FFF) + (x&0x7FE07FE0);	}#endif#endif}