X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/28c176b668c841a3b7fb093faccf0efa39257603..3d33d9c0d1894c447324d8327200c212ddad3716:/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)