X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/6123a1b5c5c97d90224ffa0dc6706dd7af2ebb9e..6942ebae59c3904674dce6b67cd07c43a3bbe00d:/lunaix-os/arch/x86/klib/fast_str.c diff --git a/lunaix-os/arch/x86/klib/fast_str.c b/lunaix-os/arch/x86/klib/fast_str.c index 2704178..d11ca1d 100644 --- a/lunaix-os/arch/x86/klib/fast_str.c +++ b/lunaix-os/arch/x86/klib/fast_str.c @@ -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)