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+
2125[[maybe_unused]] LIBC_INLINE static void
22- inline_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;
26+ inline_memset_aarch64_no_fp (Ptr dst, uint8_t value, size_t count) {
27+ generic::Memset<uint128_t >::block (dst, value);
28+ align_to_next_boundary<16 >(dst, count);
29+ return generic::Memset<uint512_t >::loop_and_tail (dst, value, count);
30+ }
31+
32+ #if defined(__ARM_NEON)
33+ [[maybe_unused]] LIBC_INLINE static void
34+ inline_memset_aarch64_with_fp (Ptr dst, uint8_t value, size_t count) {
35+ if (count >= 448 && value == 0 && aarch64::neon::hasZva ()) {
36+ generic::Memset<uint512_t >::block (dst, 0 );
37+ align_to_next_boundary<64 >(dst, count);
38+ return aarch64::neon::BzeroCacheLine::loop_and_tail (dst, 0 , count);
39+ }
40+
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
46+
47+ [[gnu::flatten]] [[maybe_unused]] LIBC_INLINE static void
48+ inline_memset_aarch64_dispatch (Ptr dst, uint8_t value, size_t count) {
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_with_fp (dst, value, count);
74+ #else
75+ return inline_memset_aarch64_no_fp (dst, value, count);
76+ #endif
5877}
5978
6079} // namespace LIBC_NAMESPACE_DECL
0 commit comments