如何使用gcc向量(如正常值)执行布尔运算?

如何使用gcc向量(如正常值)执行布尔运算?,gcc,boolean,simd,Gcc,Boolean,Simd,对于正常值,1用于表示真,而0用于表示假: float a = 1.0f; float b = 2.0f; float c = (a > b); // this will be 0.0f 但对于向量,1111…111(32二进制1)用于表示真,而0用于表示假。对于浮点,32个二进制1是-nan(不是带减号的数字): 我的问题是: 是否可以以“矢量化”的方式将c“转换”为{1.0f,1.0f,0.0f,0.0f} 事实上,我想对像素的RGB进行“钳制”(max(min(value,max

对于正常值,
1
用于表示真,而
0
用于表示假:

float a = 1.0f;
float b = 2.0f;
float c = (a > b);  // this will be 0.0f
但对于向量,
1111…111
(32二进制1)用于表示真,而
0
用于表示假。对于浮点,32个二进制1是-nan(不是带减号的数字):

我的问题是: 是否可以以“矢量化”的方式将c“转换”为
{1.0f,1.0f,0.0f,0.0f}

事实上,我想对像素的RGB进行“钳制”(
max(min(value,max),minimal)
)。如果无法实现上述目标,有没有其他好的方法以矢量化的方式进行钳制


PS:我更喜欢-内部函数的方式。

TBH,使用SSE内部函数编写的代码比依赖GCC扩展更具可移植性……我的库现在已经只与GCC兼容了。所以不要考虑便携性。
typedef float v4 __attribute__((vector_size(sizeof(float)*4)));
v4 a = {1, 2, 3, 4};
v4 b = {0 ,1, 4, 5};
v4 c = (a > b); // this becomes { -nan, -nan, 0.0f, 0.0f }