Revert "[NFC][libc] rearrange aarch64 memset code to better match new implementation"

This reverts commit 4d931b6e1e.
This commit is contained in:
Guillaume Chatelet 2022-08-19 15:02:16 +00:00
parent dbb95c2a85
commit 31fbcccb31
2 changed files with 8 additions and 12 deletions

View File

@ -52,9 +52,8 @@ using _4 = __llvm_libc::scalar::_4;
using _32 = Chained<_16, _16>; using _32 = Chained<_16, _16>;
using _64 = Chained<_32, _32>; using _64 = Chained<_32, _32>;
struct Zva64 { struct ZVA {
static constexpr size_t SIZE = 64; static constexpr size_t SIZE = 64;
static void splat_set(char *dst, const unsigned char) { static void splat_set(char *dst, const unsigned char) {
#if __SIZEOF_POINTER__ == 4 #if __SIZEOF_POINTER__ == 4
asm("dc zva, %w[dst]" : : [dst] "r"(dst) : "memory"); asm("dc zva, %w[dst]" : : [dst] "r"(dst) : "memory");
@ -64,14 +63,13 @@ struct Zva64 {
} }
}; };
inline static bool hasZva() { inline static bool AArch64ZVA(char *dst, size_t count) {
uint64_t zva_val; uint64_t zva_val;
asm("mrs %[zva_val], dczid_el0" : [zva_val] "=r"(zva_val)); asm("mrs %[zva_val], dczid_el0" : [zva_val] "=r"(zva_val));
// DC ZVA is permitted if DZP, bit [4] is zero. if ((zva_val & 31) != 4)
// BS, bits [3:0] is log2 of the block size in words. return false;
// So the next line checks whether the instruction is permitted and block size splat_set<Align<_64, Arg::_1>::Then<Loop<ZVA, _64>>>(dst, 0, count);
// is 16 words (i.e. 64 bytes). return true;
return (zva_val & 0b11111) == 0b00100;
} }
} // namespace aarch64_memset } // namespace aarch64_memset

View File

@ -92,7 +92,7 @@ inline static void inline_memset(char *dst, unsigned char value, size_t count) {
return splat_set<HeadTail<_8>>(dst, value, count); return splat_set<HeadTail<_8>>(dst, value, count);
if (count <= 32) if (count <= 32)
return splat_set<HeadTail<_16>>(dst, value, count); return splat_set<HeadTail<_16>>(dst, value, count);
if (count <= (32 + 64)) { if (count <= 96) {
splat_set<_32>(dst, value); splat_set<_32>(dst, value);
if (count <= 64) if (count <= 64)
return splat_set<Tail<_32>>(dst, value, count); return splat_set<Tail<_32>>(dst, value, count);
@ -100,9 +100,7 @@ inline static void inline_memset(char *dst, unsigned char value, size_t count) {
splat_set<Tail<_32>>(dst, value, count); splat_set<Tail<_32>>(dst, value, count);
return; return;
} }
if (count >= 448 && value == 0 && hasZva()) if (count < 448 || value != 0 || !AArch64ZVA(dst, count))
return splat_set<Align<_64, Arg::_1>::Then<Loop<Zva64>>>(dst, 0, count);
else
return splat_set<Align<_16, Arg::_1>::Then<Loop<_64>>>(dst, value, count); return splat_set<Align<_16, Arg::_1>::Then<Loop<_64>>>(dst, value, count);
#else #else
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////