[英]Check whether __m128i is zero?
I found this question: 我发现了这个问题:
Is an __m128i variable zero? __m128i变量为零吗?
Which I used to create the below example: 我用来创建以下示例:
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;
}
}
but whether I set the two 64-bit int components to 0 or a non-zero, I always get "false" print out? 但是,无论我将两个64位int组件设置为0还是非零,我总是得到“ false”的打印输出?
Since you have tagged AVX I assume that you have SSE4.1 in which case the instruction you want is ptest
which you can get from _mm_testz_si128
or _mm_test_all_zeros()
. 由于已标记了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
If you don't have SSE4.1 then use _mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF
. 如果没有SSE4.1,请使用_mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF
。 This requires pcmpeqd
, pmovmskb
, and test
. 这需要pcmpeqd
, pmovmskb
和test
。
However, ptest
sets the zero flag (ZF) so it only needs one instruction. 但是, ptest
设置了零标志(ZF),因此只需要一条指令。 See checking-if-two-sse-registers-are-not-both-zero-without-destroying-them for more details. 有关更多详细信息,请参见检查两个sse寄存器是否都不为零而不破坏它们 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.