merge the experimental x86_64 branch
[neatlibc.git] / x86_64 / string.s
blob9793df138ae82214c672a3adad09767c1b150ca1
1 format ELF64
3 public memcpy
4 memcpy:
5 mov rax, rdi
6 mov rcx, rdx
7 cld
8 rep movsb
9 ret
11 public memmove
12 memmove:
13 mov rcx, rdx
14 cmp rdi, rsi
15 jng .usual
16 mov rax, rsi
17 add rax, rcx
18 cmp rdi, rax
19 jg .usual
21 mov rax, rdi
22 std
23 add rsi, rcx
24 add rdi, rcx
25 dec rsi
26 dec rdi
27 rep movsb
28 ret
29 .usual:
30 mov rax, rdi
31 cld
32 rep movsb
33 ret
35 public memset
36 memset:
37 mov rcx, rdx
38 mov rax, rsi
39 mov rdx, rdi
40 cld
41 rep stosb
42 mov rax, rdx
43 ret
45 public memchr
46 memchr:
47 mov rax, rsi
48 mov rcx, rdx
49 cld
50 repnz scasb
51 jne .failed
52 mov rax, rdi
53 dec rax
54 ret
55 .failed:
56 xor eax, eax
57 ret
59 public memcmp
60 memcmp:
61 xor eax, eax
62 mov rcx, rdx
63 jecxz .ret
65 cld
66 rep cmpsb
67 jz .ret
68 xor eax, eax
69 mov al, [rdi - 1]
70 xor ecx, ecx
71 mov cl, [rsi - 1]
72 sub eax, ecx
73 .ret:
74 ret
76 public strlen
77 strlen:
78 xor eax, eax
79 mov rcx, -1
80 cld
81 repnz scasb
82 mov rax, rcx
83 not rax
84 dec rax
85 ret
87 public memrchr
88 memrchr:
89 mov eax, esi
90 mov rcx, rdx
91 add rdi, rcx
92 dec rdi
93 std
94 repnz scasb
95 jne .failed
96 mov rax, rdi
97 inc rax
98 ret
99 .failed:
100 xor eax, eax
103 public strchr
104 strchr:
105 .loop:
106 mov al, [rdi]
107 cmp al, sil
108 jz .done
109 inc rdi
110 test al, al
111 jnz .loop
112 xor edi, edi
113 .done:
114 mov rax, rdi
117 public strcmp
118 strcmp:
119 xor eax, eax
120 .loop:
121 mov al, [rdi]
122 cmp al, [rsi]
123 jnz .ret
124 inc rdi
125 inc rsi
126 test al, al
127 jnz .loop
129 .ret:
130 movzx rcx, byte [rsi]
131 sub rax, rcx
134 public strcpy
135 strcpy:
136 mov rdx, rdi
138 .loop:
139 lodsb
140 stosb
141 or al, al
142 jnz .loop
143 mov rax, rdx
146 public strrchr
147 strrchr:
148 xor edx, edx
149 dec rdi
150 .loop:
151 inc rdi
152 mov al, [rdi]
153 test al, al
154 jz .done
155 cmp al, sil
156 jnz .loop
157 mov rdx, rdi
158 jmp .loop
159 .done:
160 mov rax, rdx
163 public strncmp
164 strncmp:
165 xor eax, eax
166 .loop:
167 test rdx, rdx
168 jz .failed
169 mov al, [rdi]
170 cmp al, [rsi]
171 jnz .ret
172 inc rsi
173 inc rdi
174 dec rdx
175 test al, al
176 jnz .loop
177 .failed:
178 xor eax, eax
180 .ret:
181 movzx ecx, byte [rsi]
182 sub eax, ecx