blob: 3c28276f3f274056a581bd974e37ce3d14c2c9c0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// file included directly
bool validate_ascii(const char *buf, size_t len) {
const char *end = buf + len;
const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80);
__m512i running_or = _mm512_setzero_si512();
for (; end - buf >= 64; buf += 64) {
const __m512i utf8 = _mm512_loadu_si512((const __m512i *)buf);
running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii,
0xf8); // running_or | (utf8 & ascii)
}
if (buf < end) {
const __m512i utf8 = _mm512_maskz_loadu_epi8(
(uint64_t(1) << (end - buf)) - 1, (const __m512i *)buf);
running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii,
0xf8); // running_or | (utf8 & ascii)
}
return (_mm512_test_epi8_mask(running_or, running_or) == 0);
}
|