首页 > 解决方案 > AVX/SSE 将浮点符号掩码转换为 __m128i

问题描述

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

标签: cssesimdintrinsicsavx

解决方案


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

如果您需要它作为整数而不是向量,则只需要 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.


推荐阅读