mirror of
git://git.musl-libc.org/musl
synced 2024-12-19 05:14:47 +00:00
asm for memmove on i386 and x86_64
for the sake of simplicity, I've only used rep movsb rather than breaking up the copy for using rep movsd/q. on all modern cpus, this seems to be fine, but if there are performance problems, there might be a need to go back and add support for rep movsd/q.
This commit is contained in:
parent
a9555a995c
commit
2bf469310d
21
src/string/i386/memmove.s
Normal file
21
src/string/i386/memmove.s
Normal file
@ -0,0 +1,21 @@
|
||||
.global memmove
|
||||
.type memmove,@function
|
||||
memmove:
|
||||
mov 4(%esp),%eax
|
||||
sub 8(%esp),%eax
|
||||
cmp 12(%esp),%eax
|
||||
jae memcpy
|
||||
push %esi
|
||||
push %edi
|
||||
mov 12(%esp),%edi
|
||||
mov 16(%esp),%esi
|
||||
mov 20(%esp),%ecx
|
||||
lea -1(%edi,%ecx),%edi
|
||||
lea -1(%esi,%ecx),%esi
|
||||
std
|
||||
rep movsb
|
||||
cld
|
||||
lea 1(%edi),%eax
|
||||
pop %edi
|
||||
pop %esi
|
||||
ret
|
15
src/string/x86_64/memmove.s
Normal file
15
src/string/x86_64/memmove.s
Normal file
@ -0,0 +1,15 @@
|
||||
.global memmove
|
||||
.type memmove,@function
|
||||
memmove:
|
||||
mov %rdi,%rax
|
||||
sub %rsi,%rax
|
||||
cmp %rdx,%rax
|
||||
jae memcpy
|
||||
mov %rdx,%rcx
|
||||
lea -1(%rdi,%rdx),%rdi
|
||||
lea -1(%rsi,%rdx),%rsi
|
||||
std
|
||||
rep movsb
|
||||
cld
|
||||
lea 1(%rdi),%rax
|
||||
ret
|
Loading…
Reference in New Issue
Block a user