我编写了一个运行_mm_cmpistri的程序来获取下一个\ n(换行符)字符。虽然这在我的计算机上运行良好,但由于缺少SSE 4.2支持,它在服务器上失败。
使用SSE命令是否有一个很好的选择< = SSE 4.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
定义。