我正在使用以下内容来提取__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
向量元素的符号。
答案 0 :(得分:3)
您可以使用_mm_blendv_ps(a, v_add_neg, a)
。 blendvps
获取向量输入,并使用每个元素的符号位作为该元素的混合条件。
如果你需要movemask作为一个整数,你只需要movemask,不一个向量,例如将它用作查找表的索引,或者分支所有具有某些属性的向量元素,例如。
代码的目的是根据另一个向量对应元素中的符号来改变向量元素的符号。
使用布尔值操作符号位:
// 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
的符号位掩码。