-/*
- * void *memcpy (void *to, const void *from, size_t count)
- *
- * NOTE: This code is a duplicate of memmove function from memmove_asm.s
- */
-
-.globl _memcpy
-
-_memcpy:
- push %ebp
- mov %esp,%ebp
-
- push %esi
- push %edi
-
- mov 8(%ebp),%edi
- mov 12(%ebp),%esi
- mov 16(%ebp),%ecx
-
- cmp %esi,%edi
- jbe .CopyUp
- mov %ecx,%eax
- add %esi,%eax
- cmp %eax,%edi
- jb .CopyDown
-
-.CopyUp:
- 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:
- mov 8(%ebp),%eax
- pop %edi
- pop %esi
- leave
- ret
-
-.CopyDown:
- std
-
- add %ecx,%edi
- add %ecx,%esi
-
- cmp $16,%ecx
- jb .L4
- mov %ecx,%edx
- test $3,%edi
- je .L5
-
-/*
- * Make the destination dword aligned
- */
- mov %edi,%ecx
- and $3,%ecx
- sub %ecx,%edx
- dec %esi
- dec %edi
- rep movsb
- mov %edx,%ecx
-
- sub $3,%esi
- sub $3,%edi
-.L6:
- shr $2,%ecx
- rep movsl
- mov %edx,%ecx
- and $3,%ecx
- je .L7
- add $3,%esi
- add $3,%edi
-.L8:
- rep movsb
-.L7:
- cld
- mov 8(%ebp),%eax
- pop %edi
- pop %esi
- leave
- ret
-.L5:
- sub $4,%edi
- sub $4,%esi
- jmp .L6
-
-.L4:
- test %ecx,%ecx
- je .L7
- dec %esi
- dec %edi
- jmp .L8
-