asm for memmove on i386 and x86_64
authorRich Felker <dalias@aerifal.cx>
Mon, 10 Sep 2012 23:04:24 +0000 (19:04 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 10 Sep 2012 23:04:24 +0000 (19:04 -0400)
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.

src/string/i386/memmove.s [new file with mode: 0644]
src/string/x86_64/memmove.s [new file with mode: 0644]

diff --git a/src/string/i386/memmove.s b/src/string/i386/memmove.s
new file mode 100644 (file)
index 0000000..6e6cc8e
--- /dev/null
@@ -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
diff --git a/src/string/x86_64/memmove.s b/src/string/x86_64/memmove.s
new file mode 100644 (file)
index 0000000..247f0ac
--- /dev/null
@@ -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