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

时间:2015-04-15 13:39:46

标签: sse simd

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

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

1 个答案:

答案 0 :(得分:8)

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

  • 您不必担心32位和64位模式。
  • 您不必担心注册和注册溢出。
  • 无需担心AT& T和Intel语法。
  • 无需担心致电转化。
  • 编译器可以进一步优化内在函数,它不会对内联汇编有所帮助。
  • 内在函数与GCC,MSVC,ICC和Clang兼容(对于最内在函数)。

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

您可以找到Intrinsics MSVC支持列表here。英特尔has better information on intrinsics也主要同意MSVC的内在函数。

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

此外,因为他们必须为一切创造内在因素而导致混乱。他们必须为mulx而不是Intel's documentation for this is wrong创建内在函数。他们还必须创建adcxadox的内在函数,但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一起工作。