blob: 1e3d1be17d1ef0ccaa2078c882d03ec35c52c728 [file] [log] [blame]
/*
* 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__)
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" : "+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;
}