From b3746f97450e8972556daae6afb6d33a9e3516c9 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Mon, 31 May 2021 09:25:40 -0600 Subject: [PATCH] AK: Guard inline assembly with ARCH(I386) and provide alternative For non-x86 targets, it's not very nice to define inline functions in AK/Memory.h with asm volatile implementations. Guard this inline assembly with ARCH(I386) and provide portable alternatives. Since we always compile with optimizations, the hand-vectorized memset and memcpy seem to be of dubious value, but we'll keep them here until proven one way or another. This should fix the Lagom build on native M1 macOS that was reported on Discord the other day. --- AK/Memory.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/AK/Memory.h b/AK/Memory.h index 2eda483414..45d148f74d 100644 --- a/AK/Memory.h +++ b/AK/Memory.h @@ -17,16 +17,26 @@ ALWAYS_INLINE void fast_u32_copy(u32* dest, const u32* src, size_t count) { +#if ARCH(I386) asm volatile( "rep movsl\n" : "+S"(src), "+D"(dest), "+c"(count)::"memory"); +#else + __builtin_memcpy(dest, src, count * 4); +#endif } ALWAYS_INLINE void fast_u32_fill(u32* dest, u32 value, size_t count) { +#if ARCH(I386) asm volatile( "rep stosl\n" : "=D"(dest), "=c"(count) : "D"(dest), "c"(count), "a"(value) : "memory"); +#else + for (auto* p = dest; p < (dest + count); ++p) { + *p = value; + } +#endif }