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));
答案 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
来消除一些小的错误检查开销。