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

时间:2018-04-26 12:13:10

标签: c sse simd intrinsics avx

我正在使用以下内容来提取__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向量元素的符号。

1 个答案:

答案 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);

翻转av设置符号位的元素符号。

请注意,它会将-0.0视为否定,而不是零,-NaN也会被视为正常否定。如果您不想这样做,请使用_mm_cmplt_ps和左移或AND比较掩码来获取xorps的符号位掩码。