3183f0288caa68b7d2f8e3946ead80aa62845905
[lunaix-os.git] / lunaix-os / libs / klibc / string / mem.c
1 #include <klibc/string.h>
2 #include <lunaix/types.h>
3
4 void*
5 memcpy(void* dest, const void* src, size_t num)
6 {
7     if (!num)
8         return dest;
9     asm volatile("movl %1, %%edi\n"
10                  "rep movsb\n" ::"S"(src),
11                  "r"(dest),
12                  "c"(num)
13                  : "edi", "memory");
14     return dest;
15 }
16
17 void*
18 memmove(void* dest, const void* src, size_t num)
19 {
20     u8_t* dest_ptr = (u8_t*)dest;
21     const u8_t* src_ptr = (const u8_t*)src;
22     if (dest_ptr < src_ptr) {
23         for (size_t i = 0; i < num; i++) {
24             *(dest_ptr + i) = *(src_ptr + i);
25         }
26     } else {
27         for (size_t i = num; i != 0; i--) {
28             *(dest_ptr + i - 1) = *(src_ptr + i - 1);
29         }
30     }
31     return dest;
32 }
33
34 void*
35 memset(void* ptr, int value, size_t num)
36 {
37     asm volatile("movl %1, %%edi\n"
38                  "rep stosb\n" ::"c"(num),
39                  "r"(ptr),
40                  "a"(value)
41                  : "edi", "memory");
42     return ptr;
43 }
44
45 int
46 memcmp(const void* ptr1, const void* ptr2, size_t num)
47 {
48     u8_t* p1 = (u8_t*)ptr1;
49     u8_t* p2 = (u8_t*)ptr2;
50     for (size_t i = 0; i < num; i++) {
51         int diff = *(p1 + i) - *(p2 + i);
52         if (diff != 0) {
53             return diff;
54         }
55     }
56     return 0;
57 }