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