• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * memcpy.c
3  */
4 
5 #include <string.h>
6 #include <stdint.h>
7 
memcpy(void * dst,const void * src,size_t n)8 void *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