176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * memcpy.c 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid *memcpy(void *dst, const void *src, size_t n) 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *p = src; 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *q = dst; 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(__i386__) 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t nl = n >> 2; 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile ("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb":"+c" (nl), 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "+S"(p), "+D"(q) 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman :"r"(n & 3)); 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#elif defined(__x86_64__) 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t nq = n >> 3; 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile ("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb":"+c" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (nq), "+S"(p), "+D"(q) 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman :"r"((uint32_t) (n & 7))); 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (n--) { 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *q++ = *p++; 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return dst; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 30