123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <Kernel/StdLib.h>
- extern "C" {
- void* memcpy(void* dest_ptr, const void* src_ptr, size_t n)
- {
- #if ARCH(I386) || ARCH(X86_64)
- size_t dest = (size_t)dest_ptr;
- size_t src = (size_t)src_ptr;
- // FIXME: Support starting at an unaligned address.
- if (!(dest & 0x3) && !(src & 0x3) && n >= 12) {
- size_t size_ts = n / sizeof(size_t);
- # if ARCH(I386)
- asm volatile(
- "rep movsl\n"
- : "=S"(src), "=D"(dest)
- : "S"(src), "D"(dest), "c"(size_ts)
- : "memory");
- # else
- asm volatile(
- "rep movsq\n"
- : "=S"(src), "=D"(dest)
- : "S"(src), "D"(dest), "c"(size_ts)
- : "memory");
- # endif
- n -= size_ts * sizeof(size_t);
- if (n == 0)
- return dest_ptr;
- }
- asm volatile(
- "rep movsb\n" ::"S"(src), "D"(dest), "c"(n)
- : "memory");
- #else
- u8* pd = (u8*)dest_ptr;
- u8 const* ps = (u8 const*)src_ptr;
- for (; n--;)
- *pd++ = *ps++;
- #endif
- return dest_ptr;
- }
- void* memmove(void* dest, const void* src, size_t n)
- {
- if (dest < src)
- return memcpy(dest, src, n);
- u8* pd = (u8*)dest;
- const u8* ps = (const u8*)src;
- for (pd += n, ps += n; n--;)
- *--pd = *--ps;
- return dest;
- }
- void* memset(void* dest_ptr, int c, size_t n)
- {
- #if ARCH(I386) || ARCH(X86_64)
- 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);
- # if ARCH(I386)
- asm volatile(
- "rep stosl\n"
- : "=D"(dest)
- : "D"(dest), "c"(size_ts), "a"(expanded_c)
- : "memory");
- # else
- asm volatile(
- "rep stosq\n"
- : "=D"(dest)
- : "D"(dest), "c"(size_ts), "a"(expanded_c)
- : "memory");
- # endif
- n -= size_ts * sizeof(size_t);
- if (n == 0)
- return dest_ptr;
- }
- asm volatile(
- "rep stosb\n"
- : "=D"(dest), "=c"(n)
- : "0"(dest), "1"(n), "a"(c)
- : "memory");
- #else
- u8* pd = (u8*)dest_ptr;
- for (; n--;)
- *pd++ = c;
- #endif
- return dest_ptr;
- }
- size_t strlen(const char* str)
- {
- size_t len = 0;
- while (*(str++))
- ++len;
- return len;
- }
- }
|