• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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