Add an avx512bw longestCommonPrefix
This commit is contained in:
@@ -1673,6 +1673,33 @@ int firstNeqStride(const uint8_t *ap, const uint8_t *bp) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) && !defined(__SANITIZE_THREAD__)
|
||||
__attribute__((target("avx512bw"))) int
|
||||
longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
|
||||
int i = 0;
|
||||
int end = cl & ~63;
|
||||
while (i < end) {
|
||||
const uint64_t eq =
|
||||
_mm512_cmpeq_epi8_mask(_mm512_loadu_epi8(ap), _mm512_loadu_epi8(bp));
|
||||
if (eq != uint64_t(-1)) {
|
||||
return i + std::countr_one(eq);
|
||||
}
|
||||
i += 64;
|
||||
ap += 64;
|
||||
bp += 64;
|
||||
}
|
||||
if (i < cl) {
|
||||
const uint64_t mask = (uint64_t(1) << (cl - i)) - 1;
|
||||
const uint64_t eq = _mm512_cmpeq_epi8_mask(
|
||||
_mm512_maskz_loadu_epi8(mask, ap), _mm512_maskz_loadu_epi8(mask, bp));
|
||||
return i + std::countr_one(eq & mask);
|
||||
}
|
||||
assert(i == cl);
|
||||
return i;
|
||||
}
|
||||
__attribute__((target("default")))
|
||||
#endif
|
||||
|
||||
int longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
|
||||
assume(cl >= 0);
|
||||
int i = 0;
|
||||
|
Reference in New Issue
Block a user