x86_64/memset: avoid performing final store twice
[musl] / src / string / x86_64 / memset.s
1 .global memset
2 .type memset,@function
3 memset:
4         movzbl %sil,%esi
5         mov $0x101010101010101,%rax
6         # 64-bit imul has 3-7 cycles latency, launch early
7         imul %rsi,%rax
8
9         cmp $16,%rdx
10         jb 1f
11
12         lea -1(%rdx),%rcx
13         mov %rdi,%r8
14         shr $3,%rcx
15         mov %rax,-8(%rdi,%rdx)
16         rep
17         stosq
18         mov %r8,%rax
19         ret
20
21 1:      test %edx,%edx
22         jz 1f
23
24         mov %al,(%rdi)
25         mov %al,-1(%rdi,%rdx)
26         cmp $2,%edx
27         jbe 1f
28
29         mov %al,1(%rdi)
30         mov %al,-2(%rdi,%rdx)
31         cmp $4,%edx
32         jbe 1f
33
34         mov %eax,(%rdi)
35         mov %eax,-4(%rdi,%rdx)
36         cmp $8,%edx
37         jbe 1f
38
39         mov %eax,4(%rdi)
40         mov %eax,-8(%rdi,%rdx)
41
42 1:      mov %rdi,%rax
43         ret