Serenity Operating System
at hosted 38 lines 976 B view raw
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}