目前我正在使用Visual C ++内联汇编来使用SSE嵌入一些核心功能;但是我突然意识到在x64模式下不支持内联汇编。
在x64架构中构建软件时,如何使用SSE?
答案 0 :(得分:8)
在C / C ++中使用汇编指令的现代方法是使用内在函数。内联组件比内联组件有几个优点,例如:
我也喜欢内在函数,因为它很容易用它们模拟硬件,例如为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创建内在函数。他们还必须创建adcx
和adox
的内在函数,但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一起工作。