解释执行x87 FPATAN操作的扩展GCC内联程序集中的clobber列表

解释执行x87 FPATAN操作的扩展GCC内联程序集中的clobber列表,c,gcc,assembly,x86,inline-assembly,C,Gcc,Assembly,X86,Inline Assembly,以下代码位于MinGW文件中: 据我所知,x87fpatan操作使用st(0)和st(1)寄存器,覆盖st(1)寄存器的内容,然后弹出顶部寄存器 那么,为什么只有st(1)包含在clobber列表中,而不是st(0) EDIT:事实上,既然编译器应该通过“t”和“u”约束知道st(0)和st(1),那么它为什么需要一个clobber列表呢。是这样吗?这在中进行了解释(参见第6.41.2节关于i386浮点): 给定一组在asm中死亡的输入寄存器,有必要知道哪些由asm隐式弹出,哪些必须由GCC显式

以下代码位于MinGW文件中:

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

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

EDIT:事实上,既然编译器应该通过
“t”
“u”
约束知道
st(0)
st(1)
,那么它为什么需要一个clobber列表呢。是这样吗?

这在中进行了解释(参见第6.41.2节关于i386浮点):

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

asm隐式弹出的输入寄存器必须显式关闭,除非它被约束为与输出操作数匹配

在这种情况下,
fpatan
操作弹出两个输入并推送输出,因此我们点击
st(1)
,以指示这一点。我们只需要关闭
st(1)
而不需要关闭
st(0)
,因为
st(0)
被约束到一个输出操作数

/*
** 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);
    }