我很难过。
当我在Visual C ++ 2008中运行此代码时:
__m128i a, b;
a.m128i_u64[0] = 1;
b.m128i_u64[0] = 0;
a.m128i_u64[1] = 0;
b.m128i_u64[1] = 0;
printf("%d\n", _mm_testc_si128(a, b));
打印1
。这与我的预期相反,因为只有当a
和b
相同时,它才应为1。
这怎么可能?我的CPU或Visual C ++ 2008中是否有错误?
答案 0 :(得分:5)
我知道很多SSE4.1内在函数在VS2008中被破坏了。他们为VS2010修好了它们。在VS2010(没有SP)中,一些AVX内在函数被破坏了。他们修复了VS2010 SP1中的内容。
我从未使用_mm_testc_si128
内在函数,因此我不知道这是否是VS2008中的另一个内在函数。但我已经看到很多插入/提取内在因素被破坏的情况。
编辑:我刚刚在VS2010 SP1中对此进行了测试,它也给出了1。
现在我看documentation,看起来应该“返回1”。
返回值
如果b中设置的所有位都设置为a,则1;否则为0。
所以我不认为这是一个错误。