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

据我所知,x87fpatan操作使用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)被限制为输出操作数。

10-06 10:23
查看更多