我发现了这个问题:
我曾经创建过以下示例:
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或非零,我总是得到&#34; false&#34;打印出来?
答案 0 :(得分:1)
由于您已标记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。