c++ - 移动__m128的上下 float

标签 c++ x86 simd

如何将__m128的上下浮点数移动到两个__m128并清零其他两半。

enter image description here

最佳答案

由于您未指定,因此我假设的目的是使用SSE内部函数。我还要假设至少有SSE2可用,因为这基本上是这些天x86-64设置的基准……

上面描述的一种完全文字的方式是简单地复制输入的低64位,并通过_mm_move_epi64()将高64位清零

__m128 lo2(__m128 x)
{
    return _mm_castsi128_ps(_mm_move_epi64(_mm_castps_si128(x)));
}

并使用_mm_move_sd()复制输入的高64位,并从零复制低64位

__m128 hi2(__m128 x)
{
    return _mm_castpd_ps(_mm_move_sd(_mm_castps_pd(x), _mm_setzero_pd()));
}

工作示例here

关于c++ - 移动__m128的上下 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59754343/

相关文章:

C++ CRTP(模板模式)问题

c++ - Boost::thread thread() 不接受参数

ide - 在线测试 MASM 程序

c - 为什么(或者为什么不)将 Neon 内在数据类型作为输入/输出函数参数传递?

c - xmm0 的函数参数

c++ - __int128 的位操作

c++ - union 或引用作为结构成员

arrays - 汇编 x86 使用循环将值放入数组中

assembly - 对于无条件跳转指令 0xFF,Mod R/M 字节携带什么含义(如果有)?

c++ - 使用 `__m256i` 中的值高效访问数组 - SIMD