static void SDL_BlitCopy(SDL_BlitInfo *info) { Uint8 *src, *dst; int w, h; int srcskip, dstskip;
w = info->d_width*info->dst->BytesPerPixel; h = info->d_height; src = info->s_pixels; dst = info->d_pixels; srcskip = w+info->s_skip; dstskip = w+info->d_skip; #ifdef MMX_ASMBLIT if(SDL_HasSSE()) { while ( h-- ) { SDL_memcpySSE(dst, src, w); src += srcskip; dst += dstskip; } __asm__ __volatile__ ( " emms\n" ::); } else if(SDL_HasMMX()) { while ( h-- ) { SDL_memcpyMMX(dst, src, w); src += srcskip; dst += dstskip; } __asm__ __volatile__ ( " emms\n" ::); } else #endif while ( h-- ) { SDL_memcpySHMIN(dst, src, w); // SDL_memcpy(dst, src, w); src += srcskip; dst += dstskip; } }
|
static void SDL_memcpySHMIN(Uint8 *to, const Uint8 *from, int len) { int i; unsigned long *lsrc ,*ldst;
lsrc =(unsigned long *)from; ldst =(unsigned long *)to; for(i=0; i<len/8; i++) { *ldst++ = *lsrc++; *ldst++ = *lsrc++; } if (len&7) SDL_memcpy(to, from, len&7); }
#ifdef MMX_ASMBLIT static __inline__ void SDL_memcpyMMX(Uint8 *to, const Uint8 *from, int len) { int i;
for(i=0; i<len/8; i++) { __asm__ __volatile__ ( " movq (%0), %%mm0\n" " movq %%mm0, (%1)\n" : : "r" (from), "r" (to) : "memory"); from+=8; to+=8; } if (len&7) SDL_memcpy(to, from, len&7); }
|