/* * 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; }