diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 1a77d56..1293251 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -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;