[libc-commits] [libc] 31fbccc - Revert "[NFC][libc] rearrange aarch64 memset code to better match new implementation"

Guillaume Chatelet via libc-commits libc-commits at lists.llvm.org
Fri Aug 19 08:02:35 PDT 2022


Author: Guillaume Chatelet
Date: 2022-08-19T15:02:16Z
New Revision: 31fbcccb3136b9da99e7bc95007e553403fcd641

URL: https://github.com/llvm/llvm-project/commit/31fbcccb3136b9da99e7bc95007e553403fcd641
DIFF: https://github.com/llvm/llvm-project/commit/31fbcccb3136b9da99e7bc95007e553403fcd641.diff

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

This reverts commit 4d931b6e1e7e6003fa6c68aec9223b06e31c982d.

Added: 
    

Modified: 
    libc/src/string/memory_utils/elements_aarch64.h
    libc/src/string/memory_utils/memset_implementations.h

Removed: 
    


################################################################################
diff  --git a/libc/src/string/memory_utils/elements_aarch64.h b/libc/src/string/memory_utils/elements_aarch64.h
index 0529df70b87a9..394951bae3aaf 100644
--- a/libc/src/string/memory_utils/elements_aarch64.h
+++ b/libc/src/string/memory_utils/elements_aarch64.h
@@ -52,9 +52,8 @@ using _4 = __llvm_libc::scalar::_4;
 using _32 = Chained<_16, _16>;
 using _64 = Chained<_32, _32>;
 
-struct Zva64 {
+struct ZVA {
   static constexpr size_t SIZE = 64;
-
   static void splat_set(char *dst, const unsigned char) {
 #if __SIZEOF_POINTER__ == 4
     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;
   asm("mrs %[zva_val], dczid_el0" : [zva_val] "=r"(zva_val));
-  // DC ZVA is permitted if DZP, bit [4] is zero.
-  // BS, bits [3:0] is log2 of the block size in words.
-  // So the next line checks whether the instruction is permitted and block size
-  // is 16 words (i.e. 64 bytes).
-  return (zva_val & 0b11111) == 0b00100;
+  if ((zva_val & 31) != 4)
+    return false;
+  splat_set<Align<_64, Arg::_1>::Then<Loop<ZVA, _64>>>(dst, 0, count);
+  return true;
 }
 
 } // namespace aarch64_memset

diff  --git a/libc/src/string/memory_utils/memset_implementations.h b/libc/src/string/memory_utils/memset_implementations.h
index 4d893f44e2451..3fffc03e6439b 100644
--- a/libc/src/string/memory_utils/memset_implementations.h
+++ b/libc/src/string/memory_utils/memset_implementations.h
@@ -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);
   if (count <= 32)
     return splat_set<HeadTail<_16>>(dst, value, count);
-  if (count <= (32 + 64)) {
+  if (count <= 96) {
     splat_set<_32>(dst, value);
     if (count <= 64)
       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);
     return;
   }
-  if (count >= 448 && value == 0 && hasZva())
-    return splat_set<Align<_64, Arg::_1>::Then<Loop<Zva64>>>(dst, 0, count);
-  else
+  if (count < 448 || value != 0 || !AArch64ZVA(dst, count))
     return splat_set<Align<_16, Arg::_1>::Then<Loop<_64>>>(dst, value, count);
 #else
   /////////////////////////////////////////////////////////////////////////////


        


More information about the libc-commits mailing list