1 #include <string.h>
2 #include <stdint.h>
3
4 #ifdef __GNUC__
5 typedef __attribute__((__may_alias__)) size_t WT;
6 #define WS (sizeof(WT))
7 #endif
8
memmove(void * dest,const void * src,size_t size)9 void *memmove(void *dest, const void *src, size_t size)
10 {
11 char *d = dest;
12 const char *s = src;
13
14 if (d == s) {
15 return d;
16 }
17
18 if ((uintptr_t)s-(uintptr_t)d-size <= -2*size) {
19 return memcpy(d, s, size);
20 }
21
22 if (d < s) {
23 #ifdef __GNUC__
24 if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
25 while ((uintptr_t)d % WS) {
26 if (!size--) {
27 return dest;
28 }
29 *d++ = *s++;
30 }
31
32 for (; size>=WS; size-=WS, d+=WS, s+=WS) {
33 *(WT *)d = *(WT *)s;
34 }
35 }
36 #endif
37 for (; size; size--) {
38 *d++ = *s++;
39 }
40 } else {
41 #ifdef __GNUC__
42 if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
43 while ((uintptr_t)(d+size) % WS) {
44 if (!size--) {
45 return dest;
46 }
47 d[size] = s[size];
48 }
49 while (size>=WS) {
50 size-=WS, *(WT *)(d+size) = *(WT *)(s+size);
51 }
52 }
53 #endif
54 while (size) {
55 size--, d[size] = s[size];
56 }
57 }
58
59 return dest;
60 }
61