1/* 2 * memcpy.c 3 */ 4 5#include <string.h> 6#include <stdint.h> 7 8void *memcpy(void *dst, const void *src, size_t n) 9{ 10 const char *p = src; 11 char *q = dst; 12#if defined(__i386__) 13 size_t nl = n >> 2; 14 asm volatile ("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb":"+c" (nl), 15 "+S"(p), "+D"(q) 16 :"r"(n & 3)); 17#elif defined(__x86_64__) 18 size_t nq = n >> 3; 19 asm volatile ("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb":"+c" 20 (nq), "+S"(p), "+D"(q) 21 :"r"((uint32_t) (n & 7))); 22#else 23 while (n--) { 24 *q++ = *p++; 25 } 26#endif 27 28 return dst; 29} 30