Last change
on this file since 444 was
444,
checked in by satin@…, 6 years ago
|
add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc
|
File size:
1.7 KB
|
Line | |
---|
1 | #if defined __thumb__ |
---|
2 | |
---|
3 | #include "../../string/memmove.c" |
---|
4 | |
---|
5 | #else |
---|
6 | |
---|
7 | #include <string.h> |
---|
8 | #include "xscale.h" |
---|
9 | |
---|
10 | static inline void * |
---|
11 | do_memcpy (void *dst0, const void *src0, size_t len) |
---|
12 | { |
---|
13 | int dummy; |
---|
14 | asm volatile ( |
---|
15 | #ifndef __OPTIMIZE_SIZE__ |
---|
16 | "cmp %2, #0x3\n\ |
---|
17 | bls 3f\n\ |
---|
18 | and lr, %1, #0x3\n\ |
---|
19 | and r3, %0, #0x3\n\ |
---|
20 | cmp lr, r3\n\ |
---|
21 | bne 3f\n\ |
---|
22 | cmp lr, #0x0\n\ |
---|
23 | beq 2f\n\ |
---|
24 | b 1f\n\ |
---|
25 | 0:\n\ |
---|
26 | ldrb r3, [%1], #1\n\ |
---|
27 | " |
---|
28 | PRELOADSTR ("%1") |
---|
29 | "\n\ |
---|
30 | tst %1, #0x3\n\ |
---|
31 | strb r3, [%0], #1\n\ |
---|
32 | beq 3f\n\ |
---|
33 | 1:\n\ |
---|
34 | sub %2, %2, #1\n\ |
---|
35 | cmn %2, #1\n\ |
---|
36 | bne 0b\n\ |
---|
37 | 2:\n\ |
---|
38 | cmp %2, #0xf\n\ |
---|
39 | bls 1f\n\ |
---|
40 | 0:\n\ |
---|
41 | ldmia %1!, { r3, r4, r5, lr }\n\ |
---|
42 | " |
---|
43 | PRELOADSTR ("%1") |
---|
44 | "\n\ |
---|
45 | \n\ |
---|
46 | sub %2, %2, #16\n\ |
---|
47 | cmp %2, #0xf\n\ |
---|
48 | stmia %0!, { r3, r4, r5, lr }\n\ |
---|
49 | bhi 0b\n\ |
---|
50 | 1:\n\ |
---|
51 | cmp %2, #0x7\n\ |
---|
52 | bls 1f\n\ |
---|
53 | 0:\n\ |
---|
54 | ldmia %1!, { r3, r4 }\n\ |
---|
55 | " |
---|
56 | PRELOADSTR ("%1") |
---|
57 | "\n\ |
---|
58 | \n\ |
---|
59 | sub %2, %2, #8\n\ |
---|
60 | cmp %2, #0x7\n\ |
---|
61 | stmia %0!, { r3, r4 }\n\ |
---|
62 | bhi 0b\n\ |
---|
63 | 1:\n\ |
---|
64 | cmp %2, #0x3\n\ |
---|
65 | bls 3f\n\ |
---|
66 | 0:\n\ |
---|
67 | sub %2, %2, #4\n\ |
---|
68 | ldr r3, [%1], #4\n\ |
---|
69 | " |
---|
70 | PRELOADSTR ("%1") |
---|
71 | "\n\ |
---|
72 | \n\ |
---|
73 | cmp %2, #0x3\n\ |
---|
74 | str r3, [%0], #4\n\ |
---|
75 | bhi 0b\n\ |
---|
76 | " |
---|
77 | #endif /* !__OPTIMIZE_SIZE__ */ |
---|
78 | "\n\ |
---|
79 | 3:\n\ |
---|
80 | " |
---|
81 | PRELOADSTR ("%1") |
---|
82 | "\n\ |
---|
83 | sub %2, %2, #1\n\ |
---|
84 | cmn %2, #1\n\ |
---|
85 | beq 1f\n\ |
---|
86 | 0:\n\ |
---|
87 | sub %2, %2, #1\n\ |
---|
88 | ldrb r3, [%1], #1\n\ |
---|
89 | " |
---|
90 | PRELOADSTR ("%1") |
---|
91 | "\n\ |
---|
92 | cmn %2, #1\n\ |
---|
93 | strb r3, [%0], #1\n\ |
---|
94 | bne 0b\n\ |
---|
95 | 1:" |
---|
96 | : "=&r" (dummy), "=&r" (src0), "=&r" (len) |
---|
97 | : "0" (dst0), "1" (src0), "2" (len) |
---|
98 | : "memory", "lr", "r3", "r4", "r5", "cc"); |
---|
99 | return dst0; |
---|
100 | } |
---|
101 | |
---|
102 | void * |
---|
103 | memmove (void *dst, const void *src, size_t len) |
---|
104 | { |
---|
105 | char *d = dst; |
---|
106 | const char *s = src; |
---|
107 | |
---|
108 | if (s < d && d < s + len) |
---|
109 | { |
---|
110 | /* Destructive overlap...have to copy backwards. */ |
---|
111 | s += len; |
---|
112 | d += len; |
---|
113 | |
---|
114 | while (len--) |
---|
115 | *--d = *--s; |
---|
116 | |
---|
117 | return dst; |
---|
118 | } |
---|
119 | else |
---|
120 | return do_memcpy (dst, src, len); |
---|
121 | } |
---|
122 | #endif |
---|
Note: See
TracBrowser
for help on using the repository browser.