/* | |
* memmove.c | |
*/ | |
#include <string.h> | |
void *memmove(void *dst, const void *src, size_t n) | |
{ | |
const char *p = src; | |
char *q = dst; | |
#if defined(__i386__) || defined(__x86_64__) | |
if (q < p) { | |
asm volatile("cld; rep; movsb" | |
: "+c" (n), "+S"(p), "+D"(q)); | |
} else { | |
p += (n - 1); | |
q += (n - 1); | |
asm volatile("std; rep; movsb; cld" | |
: "+c" (n), "+S"(p), "+D"(q)); | |
} | |
#else | |
if (q < p) { | |
while (n--) { | |
*q++ = *p++; | |
} | |
} else { | |
p += n; | |
q += n; | |
while (n--) { | |
*--q = *--p; | |
} | |
} | |
#endif | |
return dst; | |
} |