fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / arch / x86 / klib / fast_str.c
1 #include <klibc/string.h>
2
3 #ifdef CONFIG_ARCH_X86_64
4 void*
5 memcpy(void* dest, const void* src, unsigned long num)
6 {
7     if (!num)
8         return dest;
9         
10     asm volatile("movq %1, %%rdi\n"
11                  "rep movsb\n" ::"S"(src),
12                  "r"(dest),
13                  "c"(num)
14                  : "rdi", "memory");
15     return dest;
16 }
17
18 void*
19 memset(void* ptr, int value, unsigned long num)
20 {
21     asm volatile("movq %1, %%rdi\n"
22                  "rep stosb\n" ::"c"(num),
23                  "r"(ptr),
24                  "a"(value)
25                  : "rdi", "memory");
26     return ptr;
27 }
28
29 unsigned long
30 strlen(const char* str)
31 {
32     unsigned long _c;
33     asm volatile("movq %1, %%rdi\n"
34                  "movq $-1, %%rcx\n"
35                  "repne scasb\n"
36                  "neg %%rcx\n"
37                  "movq %%rcx, %0\n"
38                  : "=r" (_c)
39                  : "r"(str), "a"(0)
40                  : "rdi", "rcx", "memory");
41
42     return _c - 2;
43 }
44
45 unsigned long
46 strnlen(const char* str, unsigned long max_len)
47 {
48     unsigned long _c;
49     asm volatile("movq %1, %%rdi\n"
50                  "movq %2, %%rcx\n"
51                  "repne scasb\n"
52                  "movq %%rcx, %0\n"
53                  : "=r" (_c)
54                  : "r"(str), "r"(max_len), "a"(0)
55                  : "rdi", "rcx", "memory");
56
57     return max_len - _c - 1;
58 }
59
60 #else
61 void*
62 memcpy(void* dest, const void* src, unsigned long num)
63 {
64     if (!num)
65         return dest;
66         
67     asm volatile("movl %1, %%edi\n"
68                  "rep movsb\n" ::"S"(src),
69                  "r"(dest),
70                  "c"(num)
71                  : "edi", "memory");
72     return dest;
73 }
74
75 void*
76 memset(void* ptr, int value, unsigned long num)
77 {
78     asm volatile("movl %1, %%edi\n"
79                  "rep stosb\n" ::"c"(num),
80                  "r"(ptr),
81                  "a"(value)
82                  : "edi", "memory");
83     return ptr;
84 }
85
86 #endif
87