diff --git a/Kernel/StdLib.cpp b/Kernel/StdLib.cpp index 6fd793635ba..a54086d8755 100644 --- a/Kernel/StdLib.cpp +++ b/Kernel/StdLib.cpp @@ -282,9 +282,7 @@ void* memset(void* dest_ptr, int c, size_t n) // FIXME: Support starting at an unaligned address. if (!(dest & 0x3) && n >= 12) { size_t size_ts = n / sizeof(size_t); - size_t expanded_c = (u8)c; - expanded_c |= expanded_c << 8; - expanded_c |= expanded_c << 16; + size_t expanded_c = explode_byte((u8)c); asm volatile( "rep stosl\n" : "=D"(dest) diff --git a/Userland/Libraries/LibC/string.cpp b/Userland/Libraries/LibC/string.cpp index 86a72b72a9c..596e04c95e9 100644 --- a/Userland/Libraries/LibC/string.cpp +++ b/Userland/Libraries/LibC/string.cpp @@ -142,13 +142,26 @@ void* memcpy(void* dest_ptr, const void* src_ptr, size_t n) void* memset(void* dest_ptr, int c, size_t n) { - void* original_dest = dest_ptr; + size_t dest = (size_t)dest_ptr; + // FIXME: Support starting at an unaligned address. + if (!(dest & 0x3) && n >= 12) { + size_t size_ts = n / sizeof(size_t); + size_t expanded_c = explode_byte((u8)c); + asm volatile( + "rep stosl\n" + : "=D"(dest) + : "D"(dest), "c"(size_ts), "a"(expanded_c) + : "memory"); + n -= size_ts * sizeof(size_t); + if (n == 0) + return dest_ptr; + } asm volatile( "rep stosb\n" - : "=D"(dest_ptr), "=c"(n) - : "0"(dest_ptr), "1"(n), "a"(c) + : "=D"(dest), "=c"(n) + : "0"(dest), "1"(n), "a"(c) : "memory"); - return original_dest; + return dest_ptr; } #else void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)