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
.
的符号位掩码
我正在使用以下方法提取 __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
.