rewrite the device subsystem interfaces (#48)
[lunaix-os.git] / lunaix-os / arch / x86 / klib / fast_str.c
index 27041785c30dc8b94e722a4b18bf934c8dccc466..d11ca1d66f95ef748ccd79409ec3934fdee12791 100644 (file)
@@ -26,6 +26,37 @@ memset(void* ptr, int value, unsigned long num)
     return ptr;
 }
 
+unsigned long
+strlen(const char* str)
+{
+    unsigned long _c;
+    asm volatile("movq %1, %%rdi\n"
+                 "movq $-1, %%rcx\n"
+                 "repne scasb\n"
+                 "neg %%rcx\n"
+                 "movq %%rcx, %0\n"
+                 : "=r" (_c)
+                 : "r"(str), "a"(0)
+                 : "rdi", "rcx", "memory");
+
+    return _c - 2;
+}
+
+unsigned long
+strnlen(const char* str, unsigned long max_len)
+{
+    unsigned long _c;
+    asm volatile("movq %1, %%rdi\n"
+                 "movq %2, %%rcx\n"
+                 "repne scasb\n"
+                 "movq %%rcx, %0\n"
+                 : "=r" (_c)
+                 : "r"(str), "r"(max_len), "a"(0)
+                 : "rdi", "rcx", "memory");
+
+    return max_len - _c - 1;
+}
+
 #else
 void*
 memcpy(void* dest, const void* src, unsigned long num)