mingwx86inline.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);
}
据我所知,x87
fpatan
操作使用st(0)
和st(1)
寄存器,覆盖st(1)
寄存器的内容,然后弹出顶部寄存器。那么,为什么只将
st(1)
包含在clobber列表中,而不是st(0)
也包含在clobber列表中呢?编辑:事实上,为什么它需要一个blobber列表,因为编译器应该通过
st(0)
和st(1)
约束知道"t"
和"u"
。对吗? 最佳答案
这在GCC documentation on inline asm中有解释(请参阅关于i386浮点的6.41.2节):
给定一组在asm中消亡的输入寄存器,有必要知道哪些是asm隐式弹出的,哪些是gcc显式弹出的。
asm隐式弹出的输入寄存器必须显式删除,除非它被约束为与输出操作数匹配。
在这种情况下,fpatan
操作弹出两个输入并推送输出,因此我们将st(1)
删除以指示这一点。我们只需要删除st(1)
而不需要删除st(0)
,因为st(0)
被限制为输出操作数。