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

Iam*_*mIC 0 c sse simd intrinsics avx

我使用以下内容来提取 的符号位__mm128

const int sign_mask = _mm_movemask_ps(a);
Run Code Online (Sandbox Code Playgroud)

我现在想使用以下内容来混合两个向量:

v_add = _mm_blendv_ps(a, v_add_neg, _mm_castsi128_ps(v_mask));
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*des 5

你可以使用_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);
Run Code Online (Sandbox Code Playgroud)

翻转已设置符号位的元素的a符号v

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