Serenity Operating System
1#pragma once
2
3#include <AK/Types.h>
4
5#if defined(KERNEL) || defined(BOOTSTRAPPER)
6# include <LibBareMetal/StdLib.h>
7#else
8# include <stdlib.h>
9# include <string.h>
10#endif
11
12#if defined(__serenity__) && !defined(KERNEL) && !defined(BOOTSTRAPPER)
13extern "C" void* mmx_memcpy(void* to, const void* from, size_t);
14#endif
15
16[[gnu::always_inline]] inline void fast_u32_copy(u32* dest, const u32* src, size_t count)
17{
18#if defined(__serenity__) && !defined(KERNEL) && !defined(BOOTSTRAPPER)
19 if (count >= 256) {
20 mmx_memcpy(dest, src, count * sizeof(count));
21 return;
22 }
23#endif
24 asm volatile(
25 "rep movsl\n"
26 : "=S"(src), "=D"(dest), "=c"(count)
27 : "S"(src), "D"(dest), "c"(count)
28 : "memory");
29}
30
31[[gnu::always_inline]] inline void fast_u32_fill(u32* dest, u32 value, size_t count)
32{
33 asm volatile(
34 "rep stosl\n"
35 : "=D"(dest), "=c"(count)
36 : "D"(dest), "c"(count), "a"(value)
37 : "memory");
38}