如何将单精度浮点数的XMM寄存器转换为整数?

时间:2013-09-17 23:23:29

标签: c++ c sse intrinsics

我在XMM寄存器中有一堆打包的浮点数(使用SSE内在函数):

__m128 xmm = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f);

我想一次性将所有这些转换为整数。我发现了一个内在的,它做我想要的(_mm_cvtps_pi16()),但它产生4x16位而不是完整的 int 。名为_mm_cvtps_pi32()的内在函数会产生 int ,但仅适用于xmm中的两个较低值。我可以使用它,提取值,移动东西并再次使用它,但有更简单的方法吗?为什么不会有一个直接的32位打包浮点数 - > 32位整数指令?当然两者都适合XMM寄存器的相同空间?

编辑:好的,我现在看到_mm_cvtps_pi32()返回__m64而不是__m128,这意味着它在MMX风格的MM ...寄存器上运行。这可以解释为什么它只返回两个整数,但现在我想知道:

  • 编译x64时会遇到问题吗?据说,那里不支持__m64 ......
  • 为什么他们在SSE推出时没有延长这条指令?

谢谢!

2 个答案:

答案 0 :(得分:4)

根据this文档:__m128d _mm_cvtps_epi32(__m128d a)生成cvtps2dq指令,可以执行您想要的操作。

答案 1 :(得分:1)

使用文档(_mm_cvtps_epi32):

Magic documentation.