通过内联汇编使用 FSIN

问题描述 投票:0回答:1

我想通过gcc / clang的内联汇编来使用x87的FSIN。内部使用

sin()
块的
__asm__
函数与 64 位双参数看起来如何?使用
__builtin_sin()
没有帮助,因为它直接分支到库函数。

gcc clang inline-assembly x87
1个回答
0
投票

GCC 的扩展内联汇编可以使用 FPU 堆栈来传入和传出参数。 GCC 文档有 x86 的“机器约束”列表。特别是:

t

80387 浮点堆栈顶部 (%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;
}

© www.soinside.com 2019 - 2024. All rights reserved.