diff --git a/src/util/match.hpp b/src/util/match.hpp index 74da50d8..ba72e2e9 100644 --- a/src/util/match.hpp +++ b/src/util/match.hpp @@ -56,6 +56,19 @@ const u8 *firstMatch<16>(const u8 *buf, typename SuperVector<16>::movemask_type } } +template <> +really_really_inline +const u8 *firstMatch<32>(const u8 *buf, typename SuperVector<32>::movemask_type z) { + DEBUG_PRINTF("z 0x%08x\n", z); + if (unlikely(z != 0xffffffff)) { + u32 pos = ctz32(~z); + assert(pos < 32); + DEBUG_PRINTF("match @ pos %u\n", pos); + return buf + pos; + } else { + return NULL; // no match + } +} template <> really_really_inline const u8 *firstMatch<64>(const u8 *buf, typename SuperVector<64>::movemask_type z) { @@ -86,6 +99,19 @@ const u8 *lastMatch<16>(const u8 *buf, typename SuperVector<16>::movemask_type z } } +template<> +really_really_inline +const u8 *lastMatch<32>(const u8 *buf, typename SuperVector<32>::movemask_type z) { + if (unlikely(z != 0xffffffff)) { + u32 pos = clz32(~z); + DEBUG_PRINTF("buf=%p, pos=%u\n", buf, pos); + assert(pos < 32); + return buf + (31 - pos); + } else { + return NULL; // no match + } +} + template <> really_really_inline const u8 *lastMatch<64>(const u8 *buf, typename SuperVector<64>::movemask_type z) {