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.
This commit is contained in:
Andrew Kaster 2021-05-31 09:25:40 -06:00 committed by Linus Groh
parent a10ad24c76
commit b3746f9745

View file

@ -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
}