/*
 * void *memcpy (void *to, const void *from, size_t count)
 *
 * Some optimization research can be found in media/doc/memcpy_optimize.txt
 */

.globl	_memcpy

_memcpy:
	push	%ebp
	mov	%esp,%ebp
	push	%esi
	push	%edi
	mov	0x8(%ebp),%edi
	mov	0xc(%ebp),%esi
	mov	0x10(%ebp),%ecx
	cld
	cmp	$16,%ecx
	jb	.L1
	mov	%ecx,%edx
	test	$3,%edi
	je	.L2
/*
 *  Make the destination dword aligned
 */
        mov	%edi,%ecx
        and	$3,%ecx
        sub	$5,%ecx
        not	%ecx
        sub	%ecx,%edx
        rep	movsb
        mov	%edx,%ecx	
.L2:
	shr	$2,%ecx
	rep	movsl
	mov	%edx,%ecx
	and	$3,%ecx
.L1:	
	test	%ecx,%ecx
	je	.L3
	rep	movsb
.L3:
	pop	%edi
	pop	%esi
	mov	0x8(%ebp),%eax
	leave
	ret

