NEON 上的 _mm_cmpestri 指令替代方案

max*_*vic 6 c performance string-comparison neon

我正在尝试在 ARM 平台上运行PicoHTTPParser 。有一个函数使用 SSE 指令_mm_cmpestri进行快速字符比较。NEON 有替代方案吗?看来我必须使用类似VCGT.U8 的东西,但它看起来不是很有效。

static const char *findchar_fast(const char *buf, const char *buf_end, const char *ranges, size_t ranges_size, int *found)
{
    *found = 0;
    #if __SSE4_2__
    if (likely(buf_end - buf >= 16)) {
        __m128i ranges16 = _mm_loadu_si128((const __m128i *)ranges);

        size_t left = (buf_end - buf) & ~15;
        do {
            __m128i b16 = _mm_loadu_si128((const __m128i*)buf);
            int r = _mm_cmpestri(ranges16, ranges_size, b16, 16, _SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES | _SIDD_UBYTE_OPS);
            if (unlikely(r != 16)) {
                buf += r;
                *found = 1;
                break;
            }
            buf += 16;
            left -= 16;
        } while (likely(left != 0));
    }
    #else
    /* suppress unused parameter warning */
    (void)buf_end;
    (void)ranges;
    (void)ranges_size;
    #endif
    return buf;
}
Run Code Online (Sandbox Code Playgroud)