【发布时间】:2013-09-08 02:02:12
【问题描述】:
我刚刚注意到 SSE2 指令集中有一个 _mm_cvtsd_si64 和一个 _mm_cvtsd_si64x 内在函数。根据英特尔内在函数指南,两者的作用完全相同。那么区别在哪里,或者,如果没有,为什么会有两个相同的内在函数?
这只是一个例子,还有更多带有 si64 和 si64x 版本的内在函数似乎做同样的事情。
【问题讨论】:
标签: intel sse intrinsics
我刚刚注意到 SSE2 指令集中有一个 _mm_cvtsd_si64 和一个 _mm_cvtsd_si64x 内在函数。根据英特尔内在函数指南,两者的作用完全相同。那么区别在哪里,或者,如果没有,为什么会有两个相同的内在函数?
这只是一个例子,还有更多带有 si64 和 si64x 版本的内在函数似乎做同样的事情。
【问题讨论】:
标签: intel sse intrinsics
这可能是历史性的,可以追溯到 MMX/SSE 的早期,并且可能在不同的内在函数集之间存在一些差异。
请注意,即使现在一些内部函数也有 64 和 64x 版本,因为它们采用不同的参数类型,即使它们做同样的事情,例如
__m128i _mm_set1_epi64x (__int64 a)
和
__m128i _mm_set1_epi64 (__m64 a)
【讨论】:
_mm256_permute2f128_si256 和_mm256_permute2x128_si256,我可以看到它们之间的唯一区别是第一个使用int imm,第二个使用const int imm。第二个需要 AVX2,但它们都调用完全相同的指令。我不明白2x128 版本的意义。
两者不一样。 __m64 是 MMX 寄存器,在 x86_64 上不推荐使用 MMX。 MMX 寄存器与 x87 共享寄存器文件,操作系统不会在 x86_64 上的上下文切换之间保留这些寄存器文件。当然,MMX 仍然可以在 32 位进程中使用。 __int64 是 Microsoft 的 64 位有符号整数 ALU 寄存器的 typedef(在 32 位模式下模拟)。由于这些原因,在 64 位程序上首选 64x 格式。
【讨论】: