SSE 4.2:_mm_cmpistri的替代方案

时间:2014-04-10 21:09:29

标签: c++ sse

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

使用SSE命令是否有一个很好的选择< = SSE 4.1?

此致

1 个答案:

答案 0 :(得分:2)

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

__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定义。