C++ 到GCC的MSVC内联程序集(带参数和返回)

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约束适用于通用

这是我想用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
约束适用于通用寄存器
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;
}