forked from OSchip/llvm-project
Revert "[NFC][libc] rearrange aarch64 memset code to better match new implementation"
This reverts commit 4d931b6e1e
.
This commit is contained in:
parent
dbb95c2a85
commit
31fbcccb31
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue