/src/simdutf/src/icelake/icelake_ascii_validation.inl.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // file included directly |
2 | | |
3 | 0 | bool validate_ascii(const char *buf, size_t len) { |
4 | 0 | const char *end = buf + len; |
5 | 0 | const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80); |
6 | 0 | __m512i running_or = _mm512_setzero_si512(); |
7 | 0 | for (; end - buf >= 64; buf += 64) { |
8 | 0 | const __m512i utf8 = _mm512_loadu_si512((const __m512i *)buf); |
9 | 0 | running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, |
10 | 0 | 0xf8); // running_or | (utf8 & ascii) |
11 | 0 | } |
12 | 0 | if (buf < end) { |
13 | 0 | const __m512i utf8 = _mm512_maskz_loadu_epi8( |
14 | 0 | (uint64_t(1) << (end - buf)) - 1, (const __m512i *)buf); |
15 | 0 | running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, |
16 | 0 | 0xf8); // running_or | (utf8 & ascii) |
17 | 0 | } |
18 | 0 | return (_mm512_test_epi8_mask(running_or, running_or) == 0); |
19 | 0 | } |