我想通过gcc / clang的内联汇编来使用x87的FSIN。内部使用
sin()
块的 __asm__
函数与 64 位双参数看起来如何?使用 __builtin_sin()
没有帮助,因为它直接分支到库函数。
GCC 的扩展内联汇编可以使用 FPU 堆栈来传入和传出参数。 GCC 文档有 x86 的“机器约束”列表。特别是:
t80387 浮点堆栈顶部 (%st(0))。
你
80387 浮点堆栈顶部第二个 (%st(1))
fsin
指令
在 FPU 堆栈顶部 (
st(0)
) 获取输入,并在 FPU 堆栈顶部返回结果。我们可以使用 =t
的输出约束将堆栈顶部返回到局部变量,并对输入使用相同的(第 0 或 0
)约束。以下代码应汇编为 32 位和 64 位代码:#include <math.h>
#include <stdio.h>
double x87_sin (double x)
{
double sinval;
asm ("fsin" : "=t" (sinval) : "0" (x));
return sinval;
}
int main(void)
{
double x = 45.0*M_PI/180.0;
printf ("%f\n", x87_sin(x));
return 0;
}