SSE比较内在化 - 如何从比较中获得1或0?

时间:2012-11-06 18:22:38

标签: c if-statement comparison sse intrinsics

我正在尝试用SSE内在函数编写if语句的等价物。

我正在使用__m128 _mm_cmplt_ps(__m128 a, __m128 b)进行比较a< b,如果比较分别为真或假,则返回0xffffffff0x0。我想将这些值转换为1和0.为了做到这一点,实现逻辑“和”__m128 _mm_and_ps(__m128 c , __m128 d)是否正确,其中c是转换的结果,{{1例如,d

感谢您的关注。

1 个答案:

答案 0 :(得分:15)

您要比较获得10,然后乘以另一个数字。基本上就是这样:

c = (a < b) * d;

与此相同:

c = 0;
if (a < b)
    c = d;

这也称为条件移动。

如果这是您想要的,那么您不需要01。只是和比较的结果直接与您将乘以的数字相比。

__m128 c = _mm_cmplt_ps(a,b);
c = _mm_and_ps(c,d);

这是有效的,因为比较会返回所有0或全部1。因此,对结果进行AND运算将使其归零,或者完全保留它。

这是故意设计的。不需要乘法。