我刚刚注意到 SSE2 指令集中有一个_mm_cvtsd_si64
和一个_mm_cvtsd_si64x
内在函数。根据英特尔内在函数指南,两者的作用完全相同。那么差异在哪里,或者,如果没有,为什么会有两个相同的内在函数?
这只是一个例子,还有更多带有 si64 和 si64x 版本的内在函数似乎做同样的事情。
我刚刚注意到 SSE2 指令集中有一个_mm_cvtsd_si64
和一个_mm_cvtsd_si64x
内在函数。根据英特尔内在函数指南,两者的作用完全相同。那么差异在哪里,或者,如果没有,为什么会有两个相同的内在函数?
这只是一个例子,还有更多带有 si64 和 si64x 版本的内在函数似乎做同样的事情。
这可能是历史性的,可以追溯到 MMX/SSE 的早期,并且可能在不同的内在函数集之间存在一些差异。
请注意,即使现在一些内在函数也有64
和64x
版本,因为它们采用不同的参数类型,即使它们做同样的事情,例如
__m128i _mm_set1_epi64x (__int64 a)
和
__m128i _mm_set1_epi64 (__m64 a)
两者不一样。__m64 是 MMX 寄存器,在 x86_64 上不推荐使用 MMX。MMX 寄存器与 x87 共享寄存器文件,并且操作系统不会在 x86_64 上的上下文切换之间保留这些寄存器文件。当然,MMX 仍然可以在 32 位进程中使用。__int64 是 Microsoft 的 64 位有符号整数 ALU 寄存器的 typedef(在 32 位模式下模拟)。由于这些原因,在 64 位程序上首选 64x 格式。