This source file includes following definitions.
- strlen
- strcmp
- strncmp
- strcpy
- strncpy
- strcat
- strncat
- strchr
- strpbrk
- strspn
- strtok
- memset
- memcpy
- memmove
- memcmp
1
2
3
4
5
6
7 extern __inline__ size_t strlen(const char* str)
8 {
9 register int retval, tmp;
10
11 __asm__("ldub [%1], %2\n\t"
12 "or %%g0, %%g0, %0\n\t"
13 "orcc %2, %%g0, %%g0\n\t"
14 "be 2f\n\t"
15 "add %1, 0x1, %1\n\t"
16 "1: ldub [%1], %2\n\t"
17 "add %0, 0x1, %0\n\t"
18 "orcc %2, %%g0, %%g0\n\t"
19 "bne 1b\n\t"
20 "add %1, 0x1, %1\n\t"
21 "2:" :
22 "=r" (retval) :
23 "r" (str), "r" (tmp=0));
24
25 return retval;
26 }
27
28 extern __inline__ int strcmp(const char* str1, const char* str2)
29 {
30 register unsigned int tmp1, tmp2;
31 register int retval;
32
33 __asm__("ldub [%1], %3\n\t"
34 "ldub [%2], %4\n\t"
35 "1: add %2, 0x1, %2\n\t"
36 "cmp %3, %4\n\t"
37 "bne,a 2f\n\t"
38 "sub %2, 0x1, %2\n\t"
39 "ldub [%1], %3\n\t"
40 "add %1, 0x1, %1\n\t"
41 "cmp %3, 0x0\n\t"
42 "bne,a 1b\n\t"
43 "ldub [%2], %4\n\t"
44 "b 3f\n\t"
45 "or %%g0, %%g0, %0\n\t"
46 "2: ldub [%1], %3\n\t"
47 "ldub [%2], %4\n\t"
48 "sub %3, %4, %0\n\t"
49 "3: \n\t" :
50 "=r" (retval) :
51 "r" (str1), "r" (str2),
52 "r" (tmp1=0), "r" (tmp2=0));
53
54 return retval;
55 }
56
57 extern __inline__ int strncmp(const char* str1, const char* str2, size_t strlen)
58 {
59 register char tmp1, tmp2;
60 register int retval;
61
62 __asm__("cmp %3, 0x0\n\t"
63 "be 2f\n\t"
64 "ldub [%2], %5\n\t"
65 "1: ldub [%1], %4\n\t"
66 "sub %4, %5, %0\n\t"
67 "cmp %0, 0x0\n\t"
68 "bne 2f\n\t"
69 "add %2, 0x1, %2\n\t"
70 "cmp %4, 0x0\n\t"
71 "be 2f\n\t"
72 "add %1, 0x1, %1\n\t"
73 "addcc %3, -1, %3\n\t"
74 "bne,a 1b\n\t"
75 "ldub [%2], %5\n\t"
76 "2: " :
77 "=r" (retval) :
78 "r" (str1), "r" (str2),
79 "r" (strlen), "r" (tmp1=0),
80 "r" (tmp2=0));
81
82 return retval;
83 }
84
85
86 extern __inline__ char *strcpy(char* dest, const char* source)
87 {
88 register char tmp;
89 register char *retval;
90
91 __asm__("or %%g0, %2, %0\n\t"
92 "ldub [%1], %3\n\t"
93 "1: stb %3, [%2]\n\t"
94 "cmp %3, 0x0\n\t"
95 "bne,a 1b\n\t"
96 "ldub [%1], %3\n\t" :
97 "=r" (retval) :
98 "r" (source), "r" (dest), "r" (tmp));
99
100 return retval;
101 }
102
103 extern __inline__ char *strncpy(char *dest, const char *source, size_t cpylen)
104 {
105 register char tmp;
106 register char *retval;
107
108 __asm__("or %%g0, %1, %0\n\t"
109 "1: cmp %4, 0x0\n\t"
110 "be 2f\n\t"
111 "ldub [%1], %3\n\t"
112 "add %1, 0x1, %1\n\t"
113 "stb %3, [%2]\n\t"
114 "sub %4, 0x1, %4\n\t"
115 "ba 1\n\t"
116 "add %2, 0x1, %2\n\t" :
117 "=r" (retval) :
118 "r" (dest), "r" (source),
119 "r" (tmp), "r" (cpylen));
120
121 return retval;
122 }
123
124 extern __inline__ char *strcat(char *dest, const char *src)
125 {
126 register char *retval;
127 register char temp;
128
129 __asm__("or %%g0, %1, %0\n\t"
130 "1: ldub [%1], %3\n\t"
131 "cmp %3, 0x0\n\t"
132 "bne,a 1b\n\t"
133 "add %1, 0x1, %1\n\t"
134 "2: ldub [%2], %3\n\t"
135 "stb %3, [%1]\n\t"
136 "add %1, 0x1, %1\n\t"
137 "cmp %3, 0x0\n\t"
138 "bne 2b\n\t"
139 "add %2, 0x1, %2\n\t" :
140 "=r" (retval) :
141 "r" (dest), "r" (src), "r" (temp=0));
142
143 return retval;
144 }
145
146 extern __inline__ char *strncat(char *dest, const char *src, size_t len)
147 {
148 register char *retval;
149 register char temp;
150
151 __asm__("or %%g0, %1, %0\n\t"
152 "1: ldub [%1], %3\n\t"
153 "cmp %3, 0x0\n\t"
154 "bne,a 1b\n\t"
155 "add %1, 0x1, %1\n\t"
156 "2: ldub [%2], %3\n\t"
157 "stb %3, [%1]\n\t"
158 "add %1, 0x1, %1\n\t"
159 "add %3, -1, %3\n\t"
160 "cmp %3, 0x0\n\t"
161 "bne 2b\n\t"
162 "add %2, 0x1, %2\n\t" :
163 "=r" (retval) :
164 "r" (dest), "r" (src), "r" (len), "r" (temp=0));
165
166 return retval;
167 }
168
169 extern __inline__ char *strchr(const char *src, char c)
170 {
171 register char temp;
172 register char *trick;
173
174 __asm__("1: ldub [%0], %2\n\t"
175 "cmp %2, %1\n\t"
176 "bne,a 1b\n\t"
177 "add %0, 0x1, %0\n\t"
178 "or %%g0, %0, %3\n\t" :
179 "=r" (src) :
180 "r" (c), "r" (temp=0), "r" (trick=0), "0" (src));
181
182 return trick;
183 }
184
185 extern __inline__ char *strpbrk(const char *cs, const char *ct)
186 {
187 register char temp1, temp2;
188 register char *scratch;
189 register char *trick;
190
191 __asm__("or %%g0, %1, %4\n\t"
192 "1: ldub [%0], %2\n\t"
193 "2: ldub [%1], %3\n\t"
194 "cmp %3, %2\n\t"
195 "be 3f\n\t"
196 "nop\n\t"
197 "cmp %3, 0x0\n\t"
198 "bne 2b\n\t"
199 "add %1, 0x1, %1\n\t"
200 "or %%g0, %4, %1\n\t"
201 "b 1b\n\t"
202 "add %0, 0x1, %0\n\t"
203 "or %%g0, %0, %5\n\t" :
204 "=r" (cs) :
205 "r" (ct), "r" (temp1), "r" (temp2), "r" (scratch), "r" (trick=0),
206 "0" (cs), "1" (ct));
207
208 return trick;
209
210 }
211
212
213 extern __inline__ size_t strspn(const char *s, const char *accept)
214 {
215 register char temp1, temp2;
216 register char* scratch;
217 register size_t trick;
218
219 __asm__("or %%g0, %1, %4\n\t"
220 "1: ldub [%0], %2\n\t"
221 "2: ldub [%1], %3\n\t"
222 "cmp %3, 0x0\n\t"
223 "be 3f\n\t"
224 "cmp %3, %2"
225 "bne 2b\n\t"
226 "add %1, 0x1, %1\n\t"
227 "add %0, 0x1, %0\n\t"
228 "b 1b\n\t"
229 "add %5, 0x1, %5\n\t"
230 "3: or %%g0, %0, %4\n\t" :
231 "=r" (s) :
232 "r" (accept), "r" (temp1), "r" (temp2),
233 "r" (scratch), "r" (trick=0), "0" (s));
234
235 return trick;
236
237 }
238
239 extern __inline__ char *strtok(char *s, const char *ct)
240 {
241 static char* old;
242 register char *tok;
243
244 if (s == (char *) 0)
245 {
246 if (old == (char *) 0)
247 {
248 return (char *) 0;
249 }
250 else
251 s = old;
252 }
253
254 s += strspn(s, ct);
255 if(*s == '\0')
256 {
257 old = (char *) 0;
258 return (char *) 0;
259 }
260
261 tok = s;
262 s = strpbrk(tok, ct);
263 if (s == (char *) 0)
264 old = (char *) 0;
265 else
266 {
267 *s = '\0';
268 old = s + 1;
269 }
270 return tok;
271 }
272
273
274 extern __inline__ void *memset(void *src, char c, size_t count)
275 {
276 register void *retval;
277
278 __asm__("or %%g0, %1, %0\n\t"
279 "1: add %1, 0x1, %1\n\t"
280 "2: add %3, -1, %3\n\t"
281 "cmp %3, -1\n\t"
282 "bne,a 1b\n\t"
283 "stb %2, [%1]\n\t" :
284 "=r" (retval) :
285 "r" (src), "r" (c), "r" (count));
286
287 return retval;
288 }
289
290 extern __inline__ void *memcpy(void *dest, const void *src, size_t count)
291 {
292 register void *retval;
293 register char tmp;
294
295 __asm__("or %%g0, %1, %0\n\t"
296 "add %3, -1, %3\n\t"
297 "cmp %3, -1\n\t"
298 "be 2f\n\t"
299 "1: ldub [%2], %4\n\t"
300 "add %2, 0x1, %2\n\t"
301 "add %3, -1, %3\n\t"
302 "cmp %3, -1\n\t"
303 "stb %4, [%1]\n\t"
304 "bne 1b\n\t"
305 "add %1, 0x1, %1\n\t"
306 "2: " :
307 "=r" (retval) :
308 "r" (dest), "r" (src), "r" (count), "r" (tmp));
309
310 return retval;
311 }
312
313 extern __inline__ void *memmove(void *dest, const void *src, size_t count)
314 {
315 register void *retval;
316 register char tmp;
317
318 __asm__("or %%g0, %1, %1\n\t"
319 "add %3, -1, %3\n\t"
320 "cmp %3, -1\n\t"
321 "be 2f\n\t"
322 "1: ldub [%2], %4\n\t"
323 "add %2, 0x1, %2\n\t"
324 "add %3, -1, %3\n\t"
325 "cmp %3, -1\n\t"
326 "stb %4, [%1]\n\t"
327 "bne 1b\n\t"
328 "add %1, 0x1, %1\n\t"
329 "2: " :
330 "=r" (retval) :
331 "r" (dest), "r" (src), "r" (count), "r" (tmp));
332
333 return retval;
334 }
335
336 extern __inline__ int memcmp(const void *cs, const void *ct, size_t count)
337 {
338 register int retval;
339 register unsigned long tmp1, tmp2;
340
341 __asm__("or %%g0, %1, %0\n\t"
342 "cmp %3, 0x0\n\t"
343 "ble,a 3f\n\t"
344 "or %%g0, %%g0, %0\n\t"
345 "1: ldub [%1], %4\n\t"
346 "ldub [%2], %5\n\t"
347 "cmp %4, %5\n\t"
348 "be,a 2f\n\t"
349 "add %1, 0x1, %1\n\t"
350 "bgeu 3f\n\t"
351 "or %%g0, 0x1, %0\n\t"
352 "b 3f\n\t"
353 "or %%g0, -1, %0\n\t"
354 "2: add %3, -1, %3\n\t"
355 "cmp %3, 0x0\n\t"
356 "bg 1b\n\t"
357 "add %2, 0x1, %2\n\t"
358 "or %%g0, %%g0, %0\n\t"
359 "3: " :
360 "=r" (retval) :
361 "r" (cs), "r" (ct), "r" (count), "r" (tmp1=0), "r" (tmp2=0));
362
363 return retval;
364 }
365