|
fast memory copy code(1)
void static fmemcpy(void *dest, void *src, int n) { #if 1 __asm { mov edi,dest mov esi,src mov ecx,n push ecx // align 64 byte and ecx,63 rep movsb pop ecx shr ecx,6 cmp ecx,0 je _mmx_copy_end _mmx_copy: movq mm0,[esi+0] movq mm1,[esi+8] movq [edi+0],mm0 movq [edi+8],mm1 movq mm2,[esi+16] movq mm3,[esi+24] movq [edi+16],mm2 movq [edi+24],mm3 movq mm0,[esi+32] movq mm1,[esi+40] movq [edi+32],mm0 movq [edi+40],mm1 movq mm2,[esi+48] movq mm3,[esi+56] movq [edi+48],mm2 movq [edi+56],mm3 add esi,64 add edi,64 dec ecx jnz _mmx_copy _mmx_copy_end: emms } #else __asm { mov esi, src mov ecx, n mov ebx, ecx shr ebx, 11 // 2048 bytes at a time mov edi, dest loop2k: // Copy 2k into temporary buffer push edi mov edi, tbuf
|