#include once "window9.bi"

sub FastCopy(byval d as any ptr, byval s as any ptr, byval n as uinteger) export
	#ifdef __FB_ARM__
		memcpy(d , s , n)
	#else
		asm
			#ifndef __FB_64BIT__  
			mov   edi,[d]
			mov   esi,[s]
			mov   ecx,[n]
			
			shr   ecx,1
			jnc   copymmx_2
			movsb
			
			copymmx_2:
			shr   ecx,1
			jnc   copymmx_4
			movsw
			
			copymmx_4:
			shr   ecx,1
			jnc   copymmx_8
			movsd
			
			copymmx_8:
			shr   ecx,1
			jnc   copymmx_16
			movq  mm0,[esi]
			movq  [edi],mm0
			add   esi,8
			add   edi,8
			
			copymmx_16:
			shr   ecx,1
			jnc   copymmx_32
			movq  mm0,[esi]
			movq  [edi],mm0
			movq  mm0,[esi+8]
			movq  [edi+8],mm0
			lea   esi,[esi+16]
			lea   edi,[edi+16]
			
			copymmx_32:
			shr   ecx,1
			jnc   copymmx_64
			movq  mm0,[esi]
			movq  [edi],mm0
			movq  mm0,[esi+8]
			movq  [edi+8],mm0
			movq  mm0,[esi+16]
			movq  [edi+16],mm0
			movq  mm0,[esi+24]
			movq  [edi+24],mm0
			lea   esi,[esi+32]
			lea   edi,[edi+32]
			
			copymmx_64:
			jecxz copymmx_end
			
			copymmx_loop:
			movq   mm0,[esi]
			movq   [edi   ],mm0
			movq   mm1,[esi+ 8]
			movq   [edi+ 8],mm1
			movq   mm2,[esi+16]
			movq   [edi+16],mm2
			movq   mm3,[esi+24]
			movq   [edi+24],mm3
			movq   mm4,[esi+32]
			movq   [edi+32],mm4
			movq   mm5,[esi+40]
			movq   [edi+40],mm5
			movq   mm6,[esi+48]
			movq   [edi+48],mm6
			movq   mm7,[esi+56]
			movq   [edi+56],mm7
			lea    esi,[esi+64]
			lea    edi,[edi+64]
			dec ecx
			jnz copymmx_loop
			
			#else
			
			mov   rdi,[d]
			mov   rsi,[s]
			mov   rcx,[n]
			
			shr   rcx,1
			jnc   copymmx_2
			movsb
			
			copymmx_2:
			shr   rcx,1
			jnc   copymmx_4
			movsw
			
			copymmx_4:
			shr   rcx,1
			jnc   copymmx_8
			movsd
			
			copymmx_8:
			shr   rcx,1
			jnc   copymmx_16
			movq  mm0,[rsi]
			movq  [rdi],mm0
			add   rsi,8
			add   rdi,8
			
			copymmx_16:
			shr   rcx,1
			jnc   copymmx_32
			movq  mm0,[rsi]
			movq  [rdi],mm0
			movq  mm0,[rsi+8]
			movq  [rdi+8],mm0
			lea   rsi,[rsi+16]
			lea   rdi,[rdi+16]
			
			copymmx_32:
			shr   rcx,1
			jnc   copymmx_64
			movq  mm0,[rsi]
			movq  [rdi],mm0
			movq  mm0,[rsi+8]
			movq  [rdi+8],mm0
			movq  mm0,[rsi+16]
			movq  [rdi+16],mm0
			movq  mm0,[rsi+24]
			movq  [rdi+24],mm0
			lea   rsi,[rsi+32]
			lea   rdi,[rdi+32]
			
			copymmx_64:
			jecxz copymmx_end
			
			copymmx_loop:
			movq   mm0,[rsi]
			movq   [rdi   ],mm0
			movq   mm1,[rsi+ 8]
			movq   [rdi+ 8],mm1
			movq   mm2,[rsi+16]
			movq   [rdi+16],mm2
			movq   mm3,[rsi+24]
			movq   [rdi+24],mm3
			movq   mm4,[rsi+32]
			movq   [rdi+32],mm4
			movq   mm5,[rsi+40]
			movq   [rdi+40],mm5
			movq   mm6,[rsi+48]
			movq   [rdi+48],mm6
			movq   mm7,[rsi+56]
			movq   [rdi+56],mm7
			lea    rsi,[rsi+64]
			lea    rdi,[rdi+64]
			dec rcx
			jnz copymmx_loop
			#endif
			copymmx_end:
			emms
		end asm
	#endif
end sub
