@@ -18,22 +18,22 @@ namespace LIBC_NAMESPACE_DECL {
1818namespace string_length_internal {
1919// Return a bit-mask with the nth bit set if the nth-byte in block_ptr is zero.
2020template <typename Vector, typename Mask>
21- Mask CompareAndMask (const Vector *block_ptr);
21+ LIBC_INLINE static Mask compare_and_mask (const Vector *block_ptr);
2222
2323template <typename Vector, typename Mask,
24- decltype (CompareAndMask <Vector, Mask>)>
24+ decltype (compare_and_mask <Vector, Mask>)>
2525size_t string_length_vector (const char *src) {
2626 uintptr_t misalign_bytes = reinterpret_cast <uintptr_t >(src) % sizeof (Vector);
2727
2828 const Vector *block_ptr =
2929 reinterpret_cast <const Vector *>(src - misalign_bytes);
30- auto cmp = CompareAndMask <Vector, Mask>(block_ptr) >> misalign_bytes;
30+ auto cmp = compare_and_mask <Vector, Mask>(block_ptr) >> misalign_bytes;
3131 if (cmp)
3232 return cpp::countr_zero (cmp);
3333
3434 while (true ) {
3535 block_ptr++;
36- cmp = CompareAndMask <Vector, Mask>(block_ptr);
36+ cmp = compare_and_mask <Vector, Mask>(block_ptr);
3737 if (cmp)
3838 return static_cast <size_t >(reinterpret_cast <uintptr_t >(block_ptr) -
3939 reinterpret_cast <uintptr_t >(src) +
@@ -42,7 +42,8 @@ size_t string_length_vector(const char *src) {
4242}
4343
4444template <>
45- uint32_t CompareAndMask<__m128i, uint32_t >(const __m128i *block_ptr) {
45+ LIBC_INLINE uint32_t
46+ compare_and_mask<__m128i, uint32_t >(const __m128i *block_ptr) {
4647 __m128i v = _mm_load_si128 (block_ptr);
4748 __m128i z = _mm_setzero_si128 ();
4849 __m128i c = _mm_cmpeq_epi8 (z, v);
@@ -52,13 +53,14 @@ uint32_t CompareAndMask<__m128i, uint32_t>(const __m128i *block_ptr) {
5253namespace sse2 {
5354[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
5455 return string_length_vector<__m128i, uint32_t ,
55- CompareAndMask <__m128i, uint32_t >>(src);
56+ compare_and_mask <__m128i, uint32_t >>(src);
5657}
5758} // namespace sse2
5859
5960#if defined(__AVX2__)
6061template <>
61- uint32_t CompareAndMask<__m256i, uint32_t >(const __m256i *block_ptr) {
62+ LIBC_INLINE uint32_t
63+ compare_and_mask<__m256i, uint32_t >(const __m256i *block_ptr) {
6264 __m256i v = _mm256_load_si256 (block_ptr);
6365 __m256i z = _mm256_setzero_si256 ();
6466 __m256i c = _mm256_cmpeq_epi8 (z, v);
@@ -68,22 +70,23 @@ uint32_t CompareAndMask<__m256i, uint32_t>(const __m256i *block_ptr) {
6870namespace avx2 {
6971[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
7072 return string_length_vector<__m256i, uint32_t ,
71- CompareAndMask <__m256i, uint32_t >>(src);
73+ compare_and_mask <__m256i, uint32_t >>(src);
7274}
7375} // namespace avx2
7476#endif
7577
7678#if defined(__AVX512F__)
7779template <>
78- __mmask64 CompareAndMask<__m512i, __mmask64>(const __m512i *block_ptr) {
80+ LIBC_INLINE __mmask64
81+ compare_and_mask<__m512i, __mmask64>(const __m512i *block_ptr) {
7982 __m512i v = _mm512_load_si512 (block_ptr);
8083 __m512i z = _mm512_setzero_si512 ();
8184 return _mm512_cmp_epu8_mask (z, v, _MM_CMPINT_EQ);
8285}
8386namespace avx512 {
8487[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
8588 return string_length_vector<__m512i, __mmask64,
86- CompareAndMask <__m512i, __mmask64>>(src);
89+ compare_and_mask <__m512i, __mmask64>>(src);
8790}
8891} // namespace avx512
8992#endif
0 commit comments