AVX/SSE 将浮点符号掩码转换为 __m128i

AVX/SSE convert floating point sign mask to __m128i

我正在使用以下方法提取 __mm128 的符号位:

const int sign_mask = _mm_movemask_ps(a);

我现在想使用以下方法混合两个向量:

v_add = _mm_blendv_ps(a, v_add_neg, _mm_castsi128_ps(v_mask));

v_mask 需要来自 sign_mask 但我找不到执行此操作的内在函数。

代码的目的是根据另一个向量的相应元素中的符号更改 a 向量元素的符号。

您可以使用 _mm_blendv_ps(a, v_add_neg, a)blendvps 采用 向量 输入,并使用每个元素的符号位作为该元素的混合条件。

如果您需要整数,则只需要 movemask,而不是向量,例如将其用作查找 table 的索引,或者在具有某些 属性 的所有矢量元素上分支,例如。

The code's purpose is to change the signs of a vector's elements based on the signs in another vector's corresponding elements.

使用布尔值操作符号位:

 // pick your favourite way to express a 0x80000000 FP constant: just the sign bit set.
__m128  sign_v = _mm_and_ps(v, _mm_set1_ps(-0.0));
__m128  a_times_sign_v = _mm_xor_ps(a, sign_v);

翻转 a 中元素的符号,其中 v 设置了符号位。

注意它把-0.0当作负数,而不是零,-NaN也被当作正常的负数。如果您不希望这样,请使用 _mm_cmplt_ps 和左移或 AND 该比较掩码来获取 xorps.

的符号位掩码