| Index: fusl/src/string/x86_64/memset.s
|
| diff --git a/fusl/src/string/x86_64/memset.s b/fusl/src/string/x86_64/memset.s
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2d3f5e52b8afe8d612c0fd0b04f4e8a01f078489
|
| --- /dev/null
|
| +++ b/fusl/src/string/x86_64/memset.s
|
| @@ -0,0 +1,72 @@
|
| +.global memset
|
| +.type memset,@function
|
| +memset:
|
| + movzbq %sil,%rax
|
| + mov $0x101010101010101,%r8
|
| + imul %r8,%rax
|
| +
|
| + cmp $126,%rdx
|
| + ja 2f
|
| +
|
| + test %edx,%edx
|
| + jz 1f
|
| +
|
| + mov %sil,(%rdi)
|
| + mov %sil,-1(%rdi,%rdx)
|
| + cmp $2,%edx
|
| + jbe 1f
|
| +
|
| + mov %ax,1(%rdi)
|
| + mov %ax,(-1-2)(%rdi,%rdx)
|
| + cmp $6,%edx
|
| + jbe 1f
|
| +
|
| + mov %eax,(1+2)(%rdi)
|
| + mov %eax,(-1-2-4)(%rdi,%rdx)
|
| + cmp $14,%edx
|
| + jbe 1f
|
| +
|
| + mov %rax,(1+2+4)(%rdi)
|
| + mov %rax,(-1-2-4-8)(%rdi,%rdx)
|
| + cmp $30,%edx
|
| + jbe 1f
|
| +
|
| + mov %rax,(1+2+4+8)(%rdi)
|
| + mov %rax,(1+2+4+8+8)(%rdi)
|
| + mov %rax,(-1-2-4-8-16)(%rdi,%rdx)
|
| + mov %rax,(-1-2-4-8-8)(%rdi,%rdx)
|
| + cmp $62,%edx
|
| + jbe 1f
|
| +
|
| + mov %rax,(1+2+4+8+16)(%rdi)
|
| + mov %rax,(1+2+4+8+16+8)(%rdi)
|
| + mov %rax,(1+2+4+8+16+16)(%rdi)
|
| + mov %rax,(1+2+4+8+16+24)(%rdi)
|
| + mov %rax,(-1-2-4-8-16-32)(%rdi,%rdx)
|
| + mov %rax,(-1-2-4-8-16-24)(%rdi,%rdx)
|
| + mov %rax,(-1-2-4-8-16-16)(%rdi,%rdx)
|
| + mov %rax,(-1-2-4-8-16-8)(%rdi,%rdx)
|
| +
|
| +1: mov %rdi,%rax
|
| + ret
|
| +
|
| +2: test $15,%edi
|
| + mov %rdi,%r8
|
| + mov %rax,-8(%rdi,%rdx)
|
| + mov %rdx,%rcx
|
| + jnz 2f
|
| +
|
| +1: shr $3,%rcx
|
| + rep
|
| + stosq
|
| + mov %r8,%rax
|
| + ret
|
| +
|
| +2: xor %edx,%edx
|
| + sub %edi,%edx
|
| + and $15,%edx
|
| + mov %rax,(%rdi)
|
| + mov %rax,8(%rdi)
|
| + sub %rdx,%rcx
|
| + add %rdx,%rdi
|
| + jmp 1b
|
|
|