c++ - 上证4.2 : alternative to _mm_cmpistri

标签 c++ sse

我编写了一个运行 _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 定义。

关于c++ - 上证4.2 : alternative to _mm_cmpistri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999065/

相关文章:

c++ - 如何调试错误代码77 : cudaErrorIllegalAddress when cuda-memcheck finds no issues?

c++ - void function(...) 和 void 类型的 std::is_same?

c++ - 使用矢量化 C++ 的矩阵乘法

c - SSE2:将二维数组中的有符号整数与 double 相乘并在 C 中对结果求和

c++ - 使用 SSE 指令的 openMP 程序中线程 > 4 的段错误

c++ - VARIANT 结构 (COM) 似乎没有成员

c++ - Qt QNetworkReply 总是空的

java - org/apache/commons/math3/linear/MatrixUtils 中的 JNIEnv->getMethodID for createRealMatrix(double [][] data)

c++ - AVX2是最有效的基于 mask 包装的方法吗?

c++ - 两个 SSE2 打包 double 的最优无分支条件选择