Last change
on this file since 690 was
444,
checked in by satin@…, 6 years ago
|
add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc
|
File size:
1.1 KB
|
Rev | Line | |
---|
[444] | 1 | #if defined __thumb__ |
---|
| 2 | |
---|
| 3 | #include "../../string/strchr.c" |
---|
| 4 | |
---|
| 5 | #else |
---|
| 6 | |
---|
| 7 | #include <string.h> |
---|
| 8 | #include "xscale.h" |
---|
| 9 | |
---|
| 10 | char * |
---|
| 11 | strchr (const char *s, int c) |
---|
| 12 | { |
---|
| 13 | unsigned int c2; |
---|
| 14 | asm (PRELOADSTR ("%0") : : "r" (s)); |
---|
| 15 | |
---|
| 16 | c &= 0xff; |
---|
| 17 | |
---|
| 18 | #ifndef __OPTIMIZE_SIZE__ |
---|
| 19 | /* Skip unaligned part. */ |
---|
| 20 | if ((long)s & 3) |
---|
| 21 | { |
---|
| 22 | s--; |
---|
| 23 | do |
---|
| 24 | { |
---|
| 25 | int c2 = *++s; |
---|
| 26 | if (c2 == c) |
---|
| 27 | return (char *)s; |
---|
| 28 | if (c2 == '\0') |
---|
| 29 | return 0; |
---|
| 30 | } |
---|
| 31 | while (((long)s & 3) != 0); |
---|
| 32 | } |
---|
| 33 | |
---|
| 34 | c2 = c + (c << 8); |
---|
| 35 | c2 += c2 << 16; |
---|
| 36 | |
---|
| 37 | /* Load two constants: |
---|
| 38 | R6 = 0xfefefeff [ == ~(0x80808080 << 1) ] |
---|
| 39 | R5 = 0x80808080 */ |
---|
| 40 | |
---|
| 41 | asm (PRELOADSTR ("%0") "\n\ |
---|
| 42 | mov r5, #0x80\n\ |
---|
| 43 | add r5, r5, #0x8000\n\ |
---|
| 44 | add r5, r5, r5, lsl #16\n\ |
---|
| 45 | mvn r6, r5, lsl #1\n\ |
---|
| 46 | \n\ |
---|
| 47 | sub %0, %0, #4\n\ |
---|
| 48 | 0:\n\ |
---|
| 49 | ldr r1, [%0, #4]!\n\ |
---|
| 50 | " PRELOADSTR ("%0") "\n\ |
---|
| 51 | add r3, r1, r6\n\ |
---|
| 52 | bic r3, r3, r1\n\ |
---|
| 53 | ands r2, r3, r5\n\ |
---|
| 54 | bne 1f\n\ |
---|
| 55 | eor r2, r1, %1\n\ |
---|
| 56 | add r3, r2, r6\n\ |
---|
| 57 | bic r3, r3, r2\n\ |
---|
| 58 | ands r1, r3, r5\n\ |
---|
| 59 | beq 0b\n\ |
---|
| 60 | 1:" |
---|
| 61 | : "=&r" (s) |
---|
| 62 | : "r" (c2), "0" (s) |
---|
| 63 | : "r1", "r2", "r3", "r5", "r6", "cc"); |
---|
| 64 | #endif |
---|
| 65 | |
---|
| 66 | while (*s && *s != c) |
---|
| 67 | s++; |
---|
| 68 | if (*s == c) |
---|
| 69 | return (char *)s; |
---|
| 70 | return NULL; |
---|
| 71 | } |
---|
| 72 | |
---|
| 73 | #endif |
---|
Note: See
TracBrowser
for help on using the repository browser.