执行x87 FPATAN操作的扩展GCC内联汇编中的clobber列表的说明

时间:2013-04-04 15:49:46

标签: c gcc assembly x86 inline-assembly

以下代码位于 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"限制。是吗?

1 个答案:

答案 0 :(得分:5)

这在GCC documentation on inline asm中有解释(参见6.41.2关于i386浮点的内容):

  

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

     

由asm隐式弹出的输入寄存器必须明确地被破坏,除非它被约束为匹配输出操作数。

在这种情况下,fpatan操作会弹出两个输入并按下输出,因此我们会使用st(1)来表示这一点。我们只需要st(1)而不是st(0),因为st(0)被约束为输出操作数。