inline float sqrt2(float sqr)
{
float root = 0;
__asm
{
sqrtss xmm0, sqr
movss root, xmm0
}
return root;
}
这是我想用 gcc x86 编译的 MSVC 编译器内联程序集,我知道 gcc 内联程序集是用 asm("asm here"); 调用的但我完全不知道如何在其中包含参数,结果是通过“=r”获得的,我只知道。
这应该会导致类似的结果:
asm("sqrtss xmm0, %1\n\t"
"movss %0, xmm0"
: "=r" (root)
: "r" (sqr));
最佳答案
r
约束适用于通用寄存器。 x
代表 xmm
。咨询manual更多细节。另外,如果您在内联汇编中使用 mov
,您可能会做错。
inline float sqrt2(float sqr)
{
float root = 0;
__asm__("sqrtss %1, %0" : "=x" (root) : "x" (sqr));
return root;
}
请注意,gcc 完全能够从 sqrtf
库函数调用生成 sqrtss
指令。您可以使用 -fno-math-errno 来消除一些小错误检查开销。
关于c++ - MSVC 内联汇编到 GCC(带参数和返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50042567/