memchr: handle zero length
[neatlibc.git] / x86_64 / string.s
blob873b7071f91c85e33ae60a2e51185853599783d9
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 test rcx, rcx
50 jz .failed
51 cld
52 repnz scasb
53 jne .failed
54 mov rax, rdi
55 dec rax
56 ret
57 .failed:
58 xor eax, eax
59 ret
61 public memcmp
62 memcmp:
63 xor eax, eax
64 mov rcx, rdx
65 jecxz .ret
67 cld
68 rep cmpsb
69 jz .ret
70 xor eax, eax
71 mov al, [rdi - 1]
72 xor ecx, ecx
73 mov cl, [rsi - 1]
74 sub eax, ecx
75 .ret:
76 ret
78 public strlen
79 strlen:
80 xor eax, eax
81 mov rcx, -1
82 cld
83 repnz scasb
84 mov rax, rcx
85 not rax
86 dec rax
87 ret
89 public memrchr
90 memrchr:
91 mov eax, esi
92 mov rcx, rdx
93 add rdi, rcx
94 dec rdi
95 test rcx, rcx
96 jz .failed
97 std
98 repnz scasb
99 jne .failed
100 mov rax, rdi
101 inc rax
103 .failed:
104 xor eax, eax
107 public strchr
108 strchr:
109 .loop:
110 mov al, [rdi]
111 cmp al, sil
112 jz .done
113 inc rdi
114 test al, al
115 jnz .loop
116 xor edi, edi
117 .done:
118 mov rax, rdi
121 public strcmp
122 strcmp:
123 xor eax, eax
124 .loop:
125 mov al, [rdi]
126 cmp al, [rsi]
127 jnz .ret
128 inc rdi
129 inc rsi
130 test al, al
131 jnz .loop
133 .ret:
134 movzx rcx, byte [rsi]
135 sub rax, rcx
138 public strcpy
139 strcpy:
140 mov rdx, rdi
142 .loop:
143 lodsb
144 stosb
145 or al, al
146 jnz .loop
147 mov rax, rdx
150 public strrchr
151 strrchr:
152 xor edx, edx
153 dec rdi
154 .loop:
155 inc rdi
156 mov al, [rdi]
157 test al, al
158 jz .done
159 cmp al, sil
160 jnz .loop
161 mov rdx, rdi
162 jmp .loop
163 .done:
164 mov rax, rdx
167 public strncmp
168 strncmp:
169 xor eax, eax
170 .loop:
171 test rdx, rdx
172 jz .failed
173 mov al, [rdi]
174 cmp al, [rsi]
175 jnz .ret
176 inc rsi
177 inc rdi
178 dec rdx
179 test al, al
180 jnz .loop
181 .failed:
182 xor eax, eax
184 .ret:
185 movzx ecx, byte [rsi]
186 sub eax, ecx