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