C++ 到GCC的MSVC内联程序集(带参数和返回)
这是我想用gcc x86编译的MSVC编译器内联程序集,我知道gcc内联程序集是用asm调用的(“asm here”);但我完全不知道如何在其中包含参数,结果是由“=r”得到的,我只知道 结果应该是这样的:C++ 到GCC的MSVC内联程序集(带参数和返回),c++,gcc,assembly,inline,C++,Gcc,Assembly,Inline,这是我想用gcc x86编译的MSVC编译器内联程序集,我知道gcc内联程序集是用asm调用的(“asm here”);但我完全不知道如何在其中包含参数,结果是由“=r”得到的,我只知道 结果应该是这样的: inline float sqrt2(float sqr) { float root = 0; __asm { sqrtss xmm0, sqr movss root, xmm0 } return root; } r约束适用于通用
inline float sqrt2(float sqr)
{
float root = 0;
__asm
{
sqrtss xmm0, sqr
movss root, xmm0
}
return root;
}
r
约束适用于通用寄存器x
用于xmm
。有关更多详细信息,请参阅。此外,如果您在内联asm中使用mov
,则很可能是做错了
asm("sqrtss xmm0, %1\n\t"
"movss %0, xmm0"
: "=r" (root)
: "r" (sqr));
注意,gcc完全能够从
sqrtf
库函数调用生成sqrtss
指令。您可以使用-fno math errno
来消除一些小的错误检查开销。您真的需要这个吗?stdlib版本应该由编译器自动转换成这个版本。这是我有过的最简单的例子。当然,我可以把它改成标准的sqrt,但是这种方法更快。我有更多的程序集需要转换,所以我想学习这一点,在尝试用汇编代码胜过编译器之前,您可能想阅读以下示例:@kermitesea我几乎愿意在几乎所有情况下都赌-O2。在这种情况下,我强烈建议在使用汇编之前先进行评测。非常感谢您提供的大量信息。一定要检查手册(ty:)注意,如果您想在GCC clang中使用作为AVX和AVX2一部分的本机FMA函数,您需要执行-mfma
标志。然后编译器将很乐意用适当的指令替换std::fma
inline float sqrt2(float sqr)
{
float root = 0;
__asm__("sqrtss %1, %0" : "=x" (root) : "x" (sqr));
return root;
}