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

Ada*_*Lee 3 sse simd

目前我正在使用Visual C++内联汇编来使用SSE嵌入一些核心功能; 但是我认为在x64模式下不支持内联汇编.

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

Z b*_*son 8

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

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

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

您可以在此处找到Intrinsics MSVC支持列表.英特尔也有更好的内在函数信息,这些信息主要与MSVC的内在函数一致.

但有时您仍然需要或想要内联汇编.在我看来,微软不允许在64位模式下进行内联汇编是非常愚蠢的.这意味着他们必须为其他编译器仍然可以使用内联汇编的几件事定义内在函数.一个例子是CPUID.Visual Studio具有CPUID 的内在函数,但GCC仍使用内联汇编.另一个例子是adc.很长一段时间,MSVC没有内在的,adc但现在看来他们确实如此.

此外,因为它们必须为所有内容创建内在函数而导致混淆.他们必须创建一个内在的,mulx但英特尔的文档是错误的.他们也有创造intrinics adcx和adox很好,但他们的文档与英特尔的异议和生成的汇编显示,没有内在的产生adox.所以程序员再一次等待内在的adox.如果他们刚刚允许内联汇编那么就没有问题了.

但回到SSE.除了少数例外,例如_mm_set_epi64x在MSVC上的32位模式(我不知道是否已经修复)SSE/AVX/AVX2内在函数与MSVC,GCC,ICC和Clang一样正常工作.