执行x87 FPATAN操作的扩展GCC内联汇编中的clobber列表的说明

Vil*_*ray 4 c x86 assembly gcc inline-assembly

以下代码位于MinGW x86inline.h文件中:

/*
** in-line atan2(y,x) function.
** Computes arctan(y/x).
*/
#define atan2(y,x) atan2_x87_inline(y,x)
double atan2_x87_inline(double y,double x);
extern __inline__ double atan2_x87_inline(double y,double x)
    {
    double result;
    __asm__ ("fpatan" : "=t" (result) : "0" (x), "u" (y) : "st(1)");
    return(result);
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,x87 fpatan操作使用st(0)st(1)寄存器,覆盖寄存器的内容st(1),然后弹出顶部寄存器.

那么为什么只st(1)包括在clobber列表中,而不是st(0)呢?

编辑:实际上,它为什么会需要一个撞名单,因为在所有的st(0)st(1)应该知道通过编译器"t""u"约束.是对的吗?

int*_*jay 5

有关内联asmGCC文档中对此进行了解释(请参阅第6.41.2节关于i386浮点):

给定一组在asm中死亡的输入寄存器,有必要知道哪些是由asm隐式弹出的,哪些必须由GCC显式弹出.

由asm隐式弹出的输入寄存器必须明确地被破坏,除非它被约束为匹配输出操作数.

在这种情况下,fpatan操作会弹出两个输入并按下输出,因此我们会使用blobber st(1)来指示这一点.我们只需要破坏st(1)而不是st(0)因为st(0)被约束到输出操作数.