@@ -18,22 +18,22 @@ namespace LIBC_NAMESPACE_DECL {
18
18
namespace string_length_internal {
19
19
// Return a bit-mask with the nth bit set if the nth-byte in block_ptr is zero.
20
20
template <typename Vector, typename Mask>
21
- LIBC_INLINE static Mask compare_and_mask (const Vector *block_ptr);
21
+ Mask CompareAndMask (const Vector *block_ptr);
22
22
23
23
template <typename Vector, typename Mask,
24
- decltype (compare_and_mask <Vector, Mask>)>
24
+ decltype (CompareAndMask <Vector, Mask>)>
25
25
size_t string_length_vector (const char *src) {
26
26
uintptr_t misalign_bytes = reinterpret_cast <uintptr_t >(src) % sizeof (Vector);
27
27
28
28
const Vector *block_ptr =
29
29
reinterpret_cast <const Vector *>(src - misalign_bytes);
30
- auto cmp = compare_and_mask <Vector, Mask>(block_ptr) >> misalign_bytes;
30
+ auto cmp = CompareAndMask <Vector, Mask>(block_ptr) >> misalign_bytes;
31
31
if (cmp)
32
32
return cpp::countr_zero (cmp);
33
33
34
34
while (true ) {
35
35
block_ptr++;
36
- cmp = compare_and_mask <Vector, Mask>(block_ptr);
36
+ cmp = CompareAndMask <Vector, Mask>(block_ptr);
37
37
if (cmp)
38
38
return static_cast <size_t >(reinterpret_cast <uintptr_t >(block_ptr) -
39
39
reinterpret_cast <uintptr_t >(src) +
@@ -42,8 +42,7 @@ size_t string_length_vector(const char *src) {
42
42
}
43
43
44
44
template <>
45
- LIBC_INLINE uint32_t
46
- compare_and_mask<__m128i, uint32_t >(const __m128i *block_ptr) {
45
+ uint32_t CompareAndMask<__m128i, uint32_t >(const __m128i *block_ptr) {
47
46
__m128i v = _mm_load_si128 (block_ptr);
48
47
__m128i z = _mm_setzero_si128 ();
49
48
__m128i c = _mm_cmpeq_epi8 (z, v);
@@ -53,14 +52,13 @@ compare_and_mask<__m128i, uint32_t>(const __m128i *block_ptr) {
53
52
namespace sse2 {
54
53
[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
55
54
return string_length_vector<__m128i, uint32_t ,
56
- compare_and_mask <__m128i, uint32_t >>(src);
55
+ CompareAndMask <__m128i, uint32_t >>(src);
57
56
}
58
57
} // namespace sse2
59
58
60
59
#if defined(__AVX2__)
61
60
template <>
62
- LIBC_INLINE uint32_t
63
- compare_and_mask<__m256i, uint32_t >(const __m256i *block_ptr) {
61
+ uint32_t CompareAndMask<__m256i, uint32_t >(const __m256i *block_ptr) {
64
62
__m256i v = _mm256_load_si256 (block_ptr);
65
63
__m256i z = _mm256_setzero_si256 ();
66
64
__m256i c = _mm256_cmpeq_epi8 (z, v);
@@ -70,23 +68,22 @@ compare_and_mask<__m256i, uint32_t>(const __m256i *block_ptr) {
70
68
namespace avx2 {
71
69
[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
72
70
return string_length_vector<__m256i, uint32_t ,
73
- compare_and_mask <__m256i, uint32_t >>(src);
71
+ CompareAndMask <__m256i, uint32_t >>(src);
74
72
}
75
73
} // namespace avx2
76
74
#endif
77
75
78
76
#if defined(__AVX512F__)
79
77
template <>
80
- LIBC_INLINE __mmask64
81
- compare_and_mask<__m512i, __mmask64>(const __m512i *block_ptr) {
78
+ __mmask64 CompareAndMask<__m512i, __mmask64>(const __m512i *block_ptr) {
82
79
__m512i v = _mm512_load_si512 (block_ptr);
83
80
__m512i z = _mm512_setzero_si512 ();
84
81
return _mm512_cmp_epu8_mask (z, v, _MM_CMPINT_EQ);
85
82
}
86
83
namespace avx512 {
87
84
[[maybe_unused]] LIBC_INLINE size_t string_length (const char *src) {
88
85
return string_length_vector<__m512i, __mmask64,
89
- compare_and_mask <__m512i, __mmask64>>(src);
86
+ CompareAndMask <__m512i, __mmask64>>(src);
90
87
}
91
88
} // namespace avx512
92
89
#endif
0 commit comments