about summary refs log tree commit diff
path: root/src/string/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'src/string/x86_64')
-rw-r--r--src/string/x86_64/memset.s41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/string/x86_64/memset.s b/src/string/x86_64/memset.s
new file mode 100644
index 00000000..fc06eef8
--- /dev/null
+++ b/src/string/x86_64/memset.s
@@ -0,0 +1,41 @@
+.global memset
+.type memset,@function
+memset:
+	and $0xff,%esi
+	mov $0x101010101010101,%rax
+	mov %rdx,%rcx
+	mov %rdi,%r8
+	imul %rsi,%rax
+	cmp $16,%rcx
+	jb 1f
+
+	mov %rax,-8(%rdi,%rcx)
+	shr $3,%rcx
+	rep
+	stosq
+	mov %r8,%rax
+	ret
+
+1:	test %ecx,%ecx
+	jz 1f
+
+	mov %al,(%rdi)
+	mov %al,-1(%rdi,%rcx)
+	cmp $2,%ecx
+	jbe 1f
+
+	mov %al,1(%rdi)
+	mov %al,-2(%rdi,%rcx)
+	cmp $4,%ecx
+	jbe 1f
+
+	mov %eax,(%rdi)
+	mov %eax,-4(%rdi,%rcx)
+	cmp $8,%ecx
+	jbe 1f
+
+	mov %eax,4(%rdi)
+	mov %eax,-8(%rdi,%rcx)
+
+1:	mov %r8,%rax
+	ret