以下代码位于 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);
}
据我所知,x87 fpatan
操作使用st(0)
和st(1)
寄存器,覆盖st(1)
寄存器的内容,然后弹出顶部寄存器。 / p>
那么为什么只有st(1)
包含在clobber列表中,而不是st(0)
呢?
编辑:事实上,为什么它需要一个clobber列表,因为编译器应通过st(0)
知道st(1)
和"t"
"u"
限制。是吗?
答案 0 :(得分:5)
这在GCC documentation on inline asm中有解释(参见6.41.2关于i386浮点的内容):
给定一组输入寄存器死在asm中,有必要知道哪些是由asm隐式弹出的,哪些必须由GCC显式弹出。
由asm隐式弹出的输入寄存器必须明确地被破坏,除非它被约束为匹配输出操作数。
在这种情况下,fpatan
操作会弹出两个输入并按下输出,因此我们会使用st(1)
来表示这一点。我们只需要st(1)
而不是st(0)
,因为st(0)
被约束为输出操作数。