PatchworkOS
Loading...
Searching...
No Matches
memmove.c
Go to the documentation of this file.
1#include <stdint.h>
2#include <string.h>
3
4void* memmove(void* s1, const void* s2, size_t n)
5{
6 uint8_t* d = s1;
7 const uint8_t* s = s2;
8
9 if (d > s && d < (s + n))
10 {
11 d += n;
12 s += n;
13
14 while ((((uintptr_t)d & 7) != ((uintptr_t)s & 7)) && n)
15 {
16 *(--d) = *(--s);
17 n--;
18 }
19
20 while (n >= 64)
21 {
22 d -= 64;
23 s -= 64;
24 *(uint64_t*)(d + 56) = *(const uint64_t*)(s + 56);
25 *(uint64_t*)(d + 48) = *(const uint64_t*)(s + 48);
26 *(uint64_t*)(d + 40) = *(const uint64_t*)(s + 40);
27 *(uint64_t*)(d + 32) = *(const uint64_t*)(s + 32);
28 *(uint64_t*)(d + 24) = *(const uint64_t*)(s + 24);
29 *(uint64_t*)(d + 16) = *(const uint64_t*)(s + 16);
30 *(uint64_t*)(d + 8) = *(const uint64_t*)(s + 8);
31 *(uint64_t*)(d + 0) = *(const uint64_t*)(s + 0);
32 n -= 64;
33 }
34
35 while (n >= 8)
36 {
37 d -= 8;
38 s -= 8;
39 *(uint64_t*)d = *(const uint64_t*)s;
40 n -= 8;
41 }
42
43 while (n--)
44 {
45 *(--d) = *(--s);
46 }
47 }
48 else
49 {
50 while (((uintptr_t)d & 7) && n)
51 {
52 *d++ = *s++;
53 n--;
54 }
55
56 while (n >= 64)
57 {
58 *(uint64_t*)(d + 0) = *(const uint64_t*)(s + 0);
59 *(uint64_t*)(d + 8) = *(const uint64_t*)(s + 8);
60 *(uint64_t*)(d + 16) = *(const uint64_t*)(s + 16);
61 *(uint64_t*)(d + 24) = *(const uint64_t*)(s + 24);
62 *(uint64_t*)(d + 32) = *(const uint64_t*)(s + 32);
63 *(uint64_t*)(d + 40) = *(const uint64_t*)(s + 40);
64 *(uint64_t*)(d + 48) = *(const uint64_t*)(s + 48);
65 *(uint64_t*)(d + 56) = *(const uint64_t*)(s + 56);
66 d += 64;
67 s += 64;
68 n -= 64;
69 }
70
71 while (n >= 8)
72 {
73 *(uint64_t*)d = *(const uint64_t*)s;
74 d += 8;
75 s += 8;
76 n -= 8;
77 }
78
79 while (n--)
80 {
81 *d++ = *s++;
82 }
83 }
84
85 return s1;
86}
void * memmove(void *s1, const void *s2, size_t n)
Definition memmove.c:4
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:43