1818
1919namespace LIBC_NAMESPACE_DECL {
2020
21+ using uint128_t = generic_v128;
22+ using uint256_t = generic_v256;
23+ using uint512_t = generic_v512;
24+
25+ #if defined(__ARM_NEON)
26+ [[maybe_unused]] LIBC_INLINE static void
27+ inline_memset_aarch64_neon (Ptr dst, uint8_t value, size_t count) {
28+ if (count >= 448 && value == 0 && aarch64::neon::hasZva ()) {
29+ generic::Memset<uint512_t >::block (dst, 0 );
30+ align_to_next_boundary<64 >(dst, count);
31+ return aarch64::neon::BzeroCacheLine::loop_and_tail (dst, 0 , count);
32+ }
33+
34+ generic::Memset<uint128_t >::block (dst, value);
35+ align_to_next_boundary<16 >(dst, count);
36+ return generic::Memset<uint512_t >::loop_and_tail (dst, value, count);
37+ }
38+ #else
39+ [[maybe_unused]] LIBC_INLINE static void
40+ inline_memset_aarch64_no_neon (Ptr dst, uint8_t value, size_t count) {
41+ generic::Memset<uint128_t >::block (dst, value);
42+ align_to_next_boundary<16 >(dst, count);
43+ return generic::Memset<uint512_t >::loop_and_tail (dst, value, count);
44+ }
45+ #endif // __ARM_NEON
46+
2147[[maybe_unused]] LIBC_INLINE static void
2248inline_memset_aarch64 (Ptr dst, uint8_t value, size_t count) {
23- static_assert (aarch64::kNeon , " aarch64 supports vector types" );
24- using uint128_t = generic_v128;
25- using uint256_t = generic_v256;
26- using uint512_t = generic_v512;
2749 if (count == 0 )
2850 return ;
2951 if (count <= 3 ) {
@@ -46,15 +68,12 @@ inline_memset_aarch64(Ptr dst, uint8_t value, size_t count) {
4668 generic::Memset<uint256_t >::tail (dst, value, count);
4769 return ;
4870 }
49- if (count >= 448 && value == 0 && aarch64::neon::hasZva ()) {
50- generic::Memset<uint512_t >::block (dst, 0 );
51- align_to_next_boundary<64 >(dst, count);
52- return aarch64::neon::BzeroCacheLine::loop_and_tail (dst, 0 , count);
53- } else {
54- generic::Memset<uint128_t >::block (dst, value);
55- align_to_next_boundary<16 >(dst, count);
56- return generic::Memset<uint512_t >::loop_and_tail (dst, value, count);
57- }
71+
72+ #if defined(__ARM_NEON)
73+ return inline_memset_aarch64_neon (dst, value, count);
74+ #else
75+ return inline_memset_aarch64_no_neon (dst, value, count);
76+ #endif
5877}
5978
6079} // namespace LIBC_NAMESPACE_DECL
0 commit comments