Annotation of /trunk/mkinitrd-magellan/klibc/usr/klibc/memmove.c
Parent Directory | Revision Log
Revision 815 -
(hide annotations)
(download)
Fri Apr 24 18:32:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 535 byte(s)
Fri Apr 24 18:32:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 535 byte(s)
-updated to klibc-1.5.15
1 | niro | 532 | /* |
2 | * memmove.c | ||
3 | */ | ||
4 | |||
5 | #include <string.h> | ||
6 | |||
7 | void *memmove(void *dst, const void *src, size_t n) | ||
8 | { | ||
9 | const char *p = src; | ||
10 | char *q = dst; | ||
11 | #if defined(__i386__) || defined(__x86_64__) | ||
12 | if (q < p) { | ||
13 | niro | 815 | asm volatile("cld; rep; movsb" |
14 | niro | 532 | : "+c" (n), "+S"(p), "+D"(q)); |
15 | } else { | ||
16 | p += (n - 1); | ||
17 | q += (n - 1); | ||
18 | niro | 815 | asm volatile("std; rep; movsb; cld" |
19 | niro | 532 | : "+c" (n), "+S"(p), "+D"(q)); |
20 | } | ||
21 | #else | ||
22 | if (q < p) { | ||
23 | while (n--) { | ||
24 | *q++ = *p++; | ||
25 | } | ||
26 | } else { | ||
27 | p += n; | ||
28 | q += n; | ||
29 | while (n--) { | ||
30 | *--q = *--p; | ||
31 | } | ||
32 | } | ||
33 | #endif | ||
34 | |||
35 | return dst; | ||
36 | } |