1717namespace  LIBC_NAMESPACE_DECL  {
1818
1919[[maybe_unused]] LIBC_INLINE MemcmpReturnType
20- inline_memcmp_generic_gt16 (CPtr p1, CPtr p2, size_t  count) {
21-   if  (LIBC_UNLIKELY (count >= 384 )) {
22-     if  (auto  value = generic::Memcmp<uint8x16_t >::block (p1, p2))
23-       return  value;
24-     align_to_next_boundary<16 , Arg::P1>(p1, p2, count);
25-   }
26-   return  generic::Memcmp<uint8x16_t >::loop_and_tail (p1, p2, count);
20+ inline_memcmp_aarch64_no_fp (CPtr p1, CPtr p2, size_t  count) {
21+   if  (count == 0 )
22+     return  MemcmpReturnType::zero ();
23+   if  (count == 1 )
24+     return  generic::Memcmp<uint8_t >::block (p1, p2);
25+   if  (count == 2 )
26+     return  generic::Memcmp<uint16_t >::block (p1, p2);
27+   if  (count == 3 )
28+     return  generic::MemcmpSequence<uint16_t , uint8_t >::block (p1, p2);
29+   if  (count <= 8 )
30+     return  generic::Memcmp<uint32_t >::head_tail (p1, p2, count);
31+   if  (count <= 16 )
32+     return  generic::Memcmp<uint64_t >::head_tail (p1, p2, count);
33+ 
34+   return  generic::Memcmp<uint64_t >::loop_and_tail_align_above (384 , p1, p2,
35+                                                               count);
2736}
2837
38+ #if  defined(__ARM_NEON)
2939[[maybe_unused]] LIBC_INLINE MemcmpReturnType
30- inline_memcmp_aarch64_neon_gt16 (CPtr p1, CPtr p2, size_t  count) {
40+ inline_memcmp_aarch64_with_fp (CPtr p1, CPtr p2, size_t  count) {
41+   if  (count == 0 )
42+     return  MemcmpReturnType::zero ();
43+   if  (count == 1 )
44+     return  generic::Memcmp<uint8_t >::block (p1, p2);
45+   if  (count == 2 )
46+     return  generic::Memcmp<uint16_t >::block (p1, p2);
47+   if  (count == 3 )
48+     return  generic::MemcmpSequence<uint16_t , uint8_t >::block (p1, p2);
49+   if  (count <= 8 )
50+     return  generic::Memcmp<uint32_t >::head_tail (p1, p2, count);
51+   if  (count <= 16 )
52+     return  generic::Memcmp<uint64_t >::head_tail (p1, p2, count);
53+ 
3154  if  (LIBC_UNLIKELY (count >= 128 )) { //  [128, ∞]
3255    if  (auto  value = generic::Memcmp<uint8x16_t >::block (p1, p2))
3356      return  value;
@@ -46,25 +69,15 @@ inline_memcmp_aarch64_neon_gt16(CPtr p1, CPtr p2, size_t count) {
4669  return  generic::Memcmp<uint8x16_t >::loop_and_tail (p1 + 32 , p2 + 32 ,
4770                                                    count - 32 );
4871}
72+ #endif 
4973
50- LIBC_INLINE MemcmpReturnType inline_memcmp_aarch64 (CPtr p1, CPtr p2,
51-                                                    size_t  count) {
52-   if  (count == 0 )
53-     return  MemcmpReturnType::zero ();
54-   if  (count == 1 )
55-     return  generic::Memcmp<uint8_t >::block (p1, p2);
56-   if  (count == 2 )
57-     return  generic::Memcmp<uint16_t >::block (p1, p2);
58-   if  (count == 3 )
59-     return  generic::MemcmpSequence<uint16_t , uint8_t >::block (p1, p2);
60-   if  (count <= 8 )
61-     return  generic::Memcmp<uint32_t >::head_tail (p1, p2, count);
62-   if  (count <= 16 )
63-     return  generic::Memcmp<uint64_t >::head_tail (p1, p2, count);
64-   if  constexpr  (aarch64::kNeon )
65-     return  inline_memcmp_aarch64_neon_gt16 (p1, p2, count);
66-   else 
67-     return  inline_memcmp_generic_gt16 (p1, p2, count);
74+ [[gnu::flatten]] LIBC_INLINE MemcmpReturnType
75+ inline_memcmp_aarch64_dispatch (CPtr p1, CPtr p2, size_t  count) {
76+ #if  defined(__ARM_NEON)
77+   return  inline_memcmp_aarch64_with_fp (p1, p2, count);
78+ #else 
79+   return  inline_memcmp_aarch64_no_fp (p1, p2, count);
80+ #endif 
6881}
6982} //  namespace LIBC_NAMESPACE_DECL
7083
0 commit comments