diff options
Diffstat (limited to 'AK/Memory.h')
-rw-r--r-- | AK/Memory.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/AK/Memory.h b/AK/Memory.h new file mode 100644 index 0000000000..27b5d2c54b --- /dev/null +++ b/AK/Memory.h @@ -0,0 +1,38 @@ +#pragma once + +#include <AK/Types.h> + +#if defined(KERNEL) || defined(BOOTSTRAPPER) +# include <LibBareMetal/StdLib.h> +#else +# include <stdlib.h> +# include <string.h> +#endif + +#if defined(__serenity__) && !defined(KERNEL) && !defined(BOOTSTRAPPER) +extern "C" void* mmx_memcpy(void* to, const void* from, size_t); +#endif + +[[gnu::always_inline]] inline void fast_u32_copy(u32* dest, const u32* src, size_t count) +{ +#if defined(__serenity__) && !defined(KERNEL) && !defined(BOOTSTRAPPER) + if (count >= 256) { + mmx_memcpy(dest, src, count * sizeof(count)); + return; + } +#endif + asm volatile( + "rep movsl\n" + : "=S"(src), "=D"(dest), "=c"(count) + : "S"(src), "D"(dest), "c"(count) + : "memory"); +} + +[[gnu::always_inline]] inline void fast_u32_fill(u32* dest, u32 value, size_t count) +{ + asm volatile( + "rep stosl\n" + : "=D"(dest), "=c"(count) + : "D"(dest), "c"(count), "a"(value) + : "memory"); +} |