38
by Michael Hope
Added the XScale specific routines from Newlib 1.19.0 |
1 |
#include <string.h> |
2 |
#include "xscale.h" |
|
3 |
#undef strcpy
|
|
4 |
||
5 |
char * |
|
6 |
strcpy (char *dest, const char *src) |
|
7 |
{
|
|
8 |
char *dest0 = dest; |
|
9 |
||
10 |
asm (PRELOADSTR ("%0") : : "r" (src)); |
|
11 |
||
12 |
#ifndef __OPTIMIZE_SIZE__
|
|
13 |
if (((long)src & 3) == ((long)dest & 3)) |
|
14 |
{
|
|
15 |
/* Skip unaligned part. */
|
|
16 |
while ((long)src & 3) |
|
17 |
{
|
|
18 |
if (! (*dest++ = *src++)) |
|
19 |
return dest0; |
|
20 |
}
|
|
21 |
||
22 |
/* Load two constants:
|
|
23 |
R4 = 0xfefefeff [ == ~(0x80808080 << 1) ]
|
|
24 |
R5 = 0x80808080 */
|
|
25 |
||
26 |
asm ("mov r5, #0x80\n\ |
|
27 |
ldr r1, [%1, #0]\n\ |
|
28 |
add r5, r5, #0x8000\n\ |
|
29 |
add r5, r5, r5, lsl #16\n\ |
|
30 |
mvn r4, r5, lsl #1\n\ |
|
31 |
\n\ |
|
32 |
add r3, r1, r5\n\ |
|
33 |
bic r3, r3, r1\n\ |
|
34 |
ands r2, r3, r4\n\ |
|
35 |
bne 1f\n\ |
|
36 |
0:\n\ |
|
37 |
ldr r3, [%1, #0]\n\ |
|
38 |
ldr r1, [%1, #4]!\n\ |
|
39 |
" PRELOADSTR("%1") "\n\ |
|
40 |
str r3, [%0], #4\n\ |
|
41 |
add r2, r1, r4\n\ |
|
42 |
bic r2, r2, r1\n\ |
|
43 |
ands r3, r2, r5\n\ |
|
44 |
beq 0b\n\ |
|
45 |
1:"
|
|
46 |
: "=&r" (dest), "=&r" (src) |
|
47 |
: "0" (dest), "1" (src) |
|
48 |
: "r1", "r2", "r3", "r4", "r5", "memory", "cc"); |
|
49 |
}
|
|
50 |
#endif
|
|
51 |
||
52 |
while (*dest++ = *src++) |
|
53 |
asm (PRELOADSTR ("%0") : : "r" (src)); |
|
54 |
return dest0; |
|
55 |
}
|