X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/32b9a6d76790c73d3d2d36d9081a2581cc65d184..28c176b668c841a3b7fb093faccf0efa39257603:/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 new file mode 100644 index 0000000..2704178 --- /dev/null +++ b/lunaix-os/arch/x86/klib/fast_str.c @@ -0,0 +1,56 @@ +#include + +#ifdef CONFIG_ARCH_X86_64 +void* +memcpy(void* dest, const void* src, unsigned long num) +{ + if (!num) + return dest; + + asm volatile("movq %1, %%rdi\n" + "rep movsb\n" ::"S"(src), + "r"(dest), + "c"(num) + : "rdi", "memory"); + return dest; +} + +void* +memset(void* ptr, int value, unsigned long num) +{ + asm volatile("movq %1, %%rdi\n" + "rep stosb\n" ::"c"(num), + "r"(ptr), + "a"(value) + : "rdi", "memory"); + return ptr; +} + +#else +void* +memcpy(void* dest, const void* src, unsigned long num) +{ + if (!num) + return dest; + + asm volatile("movl %1, %%edi\n" + "rep movsb\n" ::"S"(src), + "r"(dest), + "c"(num) + : "edi", "memory"); + return dest; +} + +void* +memset(void* ptr, int value, unsigned long num) +{ + asm volatile("movl %1, %%edi\n" + "rep stosb\n" ::"c"(num), + "r"(ptr), + "a"(value) + : "edi", "memory"); + return ptr; +} + +#endif +