我发现了这个问题:
我用它来创建以下示例:
int main(){
__m128i intrinreg;
intrinreg.m128i_i64[0] = 0;
intrinreg.m128i_i64[1] = 6;
__m128i zero = _mm_setzero_si128();
if (0 == _mm_movemask_epi8(_mm_cmpeq_epi32(intrinreg, zero)))
{
std::cout << "true" << std::endl;
}
else{
std::cout << "false" << std::endl;
}
}
但是无论我将两个 64 位 int 组件设置为 0 还是非零,我总是会得到“false”打印结果?
最佳答案
既然你已经标记了 AVX,我假设你有 SSE4.1,在这种情况下,你想要的指令是 ptest
,你可以从 _mm_testz_si128
或 _mm_test_all_zeros 获取()
.
bool test1, test2;
__m128i r1 = _mm_setzero_si128();
__m128i r2 = _mm_set1_epi64x(42);
test1 = _mm_testz_si128(r1,r1);
test2 = _mm_testz_si128(r2,r2);
printf("%d %d\n", test1, test2); //prints 1 0
如果您没有 SSE4.1,请使用 _mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF
。这需要 pcmpeqd
、pmovmskb
和 test
。
但是,ptest
设置零标志 (ZF),因此它只需要一条指令。请参阅checking-if-two-sse-registers-are-not-both-zero-without-destroying-them了解更多详情。
关于c++ - 检查 __m128i 是否为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696708/