如何在 C++ 的 x64 架构中使用 SSE 指令?

how to use SSE instruction in the x64 architecture in c++?

目前我正在使用 Visual C++ 内联汇编来嵌入一些使用 SSE 的核心功能;但是我突然意识到 x64 模式不支持内联汇编。

在 x64 架构中构建软件时如何使用 SSE?

在 C/C++ 中使用汇编指令的现代方法是使用内在函数。与内联汇编相比,内部函数有几个优点,例如:

  • 您不必担心 32 位和 64 位模式。
  • 您无需担心寄存器和寄存器溢出问题。
  • 无需担心 AT&T 和 Intel 语法。
  • 无需担心调用转化。
  • 编译器可以进一步优化内联函数,而内联汇编不会这样做。
  • 内在函数与 GCC、MSVC、ICC 和 Clang 兼容(对于大多数内在函数)。

我也喜欢内部函数,因为它很容易用它们模拟硬件,例如为 AVX512 做准备。

您还可以找到 MSVC 支持的 Intrinsics 列表 here. Intel has better information on intrinsics,其中大部分与 MSVC 的内在函数一致。

但有时您仍然需要或想要内联汇编。在我看来,Microsoft 不允许在 64 位模式下进行内联汇编真的很愚蠢。这意味着他们必须为其他编译器仍然可以使用内联汇编做的几件事定义内在函数。一个例子是 CPUID。 Visual Studio 有 an intrinsic for CPUID but GCC still uses inline assembly. Another example is adc. For a long time MSVC had no intrinsic for adc but now it appears they do.

此外,因为他们必须为所有内容创建内在函数,所以会造成混淆。他们必须为 mulx 创建一个内在函数,但是 . They also have to create intrinics for adcx and adox as well but their documentation disagrees with Intel's 和生成的程序集显示没有内在函数产生 adox。因此,程序员再次等待 adox 的内部函数。如果他们只是允许内联汇编就没有问题了。

但回到 SSE。除了少数例外,e.g. _mm_set_epi64x in 32-bit mode on MSVC(我不知道这是否已修复)SSE/AVX/AVX2 内部函数在 MSVC、GCC、ICC 和 Clang 中按预期工作。