是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?

Posted

技术标签:

【中文标题】是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?【英文标题】:Is there an equivalent of _mm_slli_si128(__m128i a, int num) for floats? 【发布时间】:2016-11-06 00:44:19 【问题描述】:

假设我有一个包含 4 个浮点数的向量:

__m128 vector = |f0|f1|f2|f3| (pseudocode)

我的意图是将这个变量转换成这个:

|0.0|f0|f1|f2|

右移似乎是最简单的选择,但我无法找到这种可用于浮点数的内在函数。

最快的方法是什么?

【问题讨论】:

_mm_shuffle_ps + _mm_and_ps 我已经做到了,并且原理有效。但是,我不确定应该输入哪些值作为参数以保留最后一个浮点数:vb = _mm_and_ps(vb, _mm_set_ps(?, ?, ?, 0))。 另一种方法是使用两个强制转换:_mm_castsi128_ps_mm_castps_si128,这样您仍然可以使用 '_mm_slli_si128' 。这些强制转换不会生成任何指令。唯一的惩罚是从浮点数域到整数域的延迟会略有增加,反之亦然。 【参考方案1】:

这是我的解决方案:

__m128 const mask = _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, -1));

vector = _mm_shuffle_ps(vector, vector, _MM_SHUFFLE(0,3,2,1))
vector = _mm_and_ps(vector, mask);

【讨论】:

以上是关于是否有相当于 _mm_slli_si128(__m128i a, int num) 的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

清除 __m128i 的高字节

在 __m128i 向量上水平检查零?

将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?

将 __m128i 值转换为 std::tuple

SSE 将整数加载到 __m128

通过联合合法访问 __m128 变量的字节吗?