PatchworkOS
Loading...
Searching...
No Matches
memcpy.c
Go to the documentation of this file.
1#include <stdint.h>
2#include <string.h>
3
4void* memcpy(void* _RESTRICT s1, const void* _RESTRICT s2, size_t n)
5{
6 uint8_t* d = s1;
7 const uint8_t* s = s2;
8
9 while (((uintptr_t)d & 7) && n)
10 {
11 *d++ = *s++;
12 n--;
13 }
14
15 while (n >= 64)
16 {
17 *(uint64_t*)(d + 0) = *(const uint64_t*)(s + 0);
18 *(uint64_t*)(d + 8) = *(const uint64_t*)(s + 8);
19 *(uint64_t*)(d + 16) = *(const uint64_t*)(s + 16);
20 *(uint64_t*)(d + 24) = *(const uint64_t*)(s + 24);
21 *(uint64_t*)(d + 32) = *(const uint64_t*)(s + 32);
22 *(uint64_t*)(d + 40) = *(const uint64_t*)(s + 40);
23 *(uint64_t*)(d + 48) = *(const uint64_t*)(s + 48);
24 *(uint64_t*)(d + 56) = *(const uint64_t*)(s + 56);
25 d += 64;
26 s += 64;
27 n -= 64;
28 }
29
30 while (n >= 8)
31 {
32 *(uint64_t*)d = *(const uint64_t*)s;
33 d += 8;
34 s += 8;
35 n -= 8;
36 }
37
38 while (n--)
39 {
40 *d++ = *s++;
41 }
42
43 return s1;
44}
#define _RESTRICT
Definition config.h:17
void * memcpy(void *_RESTRICT s1, const void *_RESTRICT s2, size_t n)
Definition memcpy.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