SSE 4.2:_mm_cmpistri的替代方案

SSE 4.2: alternative to _mm_cmpistri

本文关键字:方案 cmpistri mm SSE      更新时间:2023-10-16

我编写了一个程序,运行_mm_cmpistri来获取下一个\n(换行符)字符。虽然这在我的电脑上运行得很好,但由于缺少SSE 4.2支持,它在服务器上失败了。

是否有使用SSE命令<=SSE 4.1?

好的,这是实际的代码。这还没有经过测试,只是给你一个想法。

__m128i lf = _mm_set1_epi8('n');
// unaligned part
__m128i data = _mm_loadu_si128((__m128i *)ptr);
int mask = _mm_movemask_epi8(_mm_cmpeq_epi8(data, lf));
if (mask != 0)
    return ffs(mask);
int index = 16 - ((size_t)ptr & 15);
// aligned part, possibly overlaps unaligned part but that's ok
for (; index < length; index += 16) {
    data = _mm_load_si128((__m128i *)(ptr + index));
    mask = _mm_movemask_epi8(_mm_cmpeq_epi8(data, lf));
    if (mask != 0)
        return index + ffs(mask);
}

对于MSVC,ffs可以用_BitScanForward来定义。

相关文章: