4

以下代码在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);
    }

据我了解,x87fpatan操作使用st(0)andst(1)寄存器,覆盖寄存器的内容st(1),然后弹出顶部寄存器。

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

编辑:事实上,为什么它需要一个clobber列表,因为编译st(0)st(1)应该通过"t"and"u"约束知道它。是对的吗?

4

1 回答 1

5

这在关于 inline asm 的 GCC 文档中有解释(参见关于 i386 浮点的第 6.41.2 节):

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

由 asm 隐式弹出的输入寄存器必须被显式破坏,除非它被限制为匹配输出操作数。

在这种情况下,该fpatan操作会弹出两个输入并推送输出,因此我们通过破坏st(1)来指示这一点。我们只需要破坏st(1)而不是st(0)因为st(0)受限于输出操作数。

于 2013-04-04T16:50:01.103 回答