c - 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
向量元素的符号。
解决方案
你可以使用_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
.
推荐阅读
- java - 多个 Oracle 数据源和网络适配器无法建立连接
- python - 在表格的列之间插入间距
- python - Django:utils.py - 名称“short_url”未定义
- javascript - 如何在 Charts.js 的工具箱中显示图例?
- reactjs - 带有基于类的组件的 Redux Creatslice
- javascript - javascript中的回调方法
- react-native - 如何创建 React Native iOS 项目并在 Docker 中运行?
- spring - 由于配置服务器,执行器无法解析变量?
- vue.js - Kendo Grid 是 footerCell 在 Vuejs 中不起作用
- sql - 允许空值时的最小长度约束