MSVC内联汇编到GCC(带参数和返回)

时间:2018-04-26 12:06:26

标签: c++ gcc assembly inline

inline float sqrt2(float sqr)
{
    float root = 0;

    __asm
    {
    sqrtss xmm0, sqr
    movss root, xmm0
    }

    return root;
}

这里是MSVC compilator内联汇编,我想用gcc x86编译,我知道gcc内联汇编是用asm调用的(" asm here");但我完全不知道如何在其中包含参数,结果是通过" = r"我只知道。

这应该会产生类似的结果:

asm("sqrtss xmm0, %1\n\t"
        "movss %0, xmm0"
        : "=r" (root)
        : "r" (sqr));

1 个答案:

答案 0 :(得分:2)

r约束用于通用寄存器。 x适用于xmm。有关详细信息,请参阅manual。此外,如果您在内联asm中使用mov,则可能是错误的。

inline float sqrt2(float sqr)
{
    float root = 0;

    __asm__("sqrtss %1, %0" : "=x" (root) : "x" (sqr));

    return root;
}

请注意,gcc完全能够从sqrtss库函数调用生成sqrtf指令。您可以使用-fno-math-errno来消除一些小的错误检查开销。