次のコードは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)
とst(1)
レジスタを使用し、レジスタの内容を上書きしてからst(1)
、一番上のレジスタをポップします。
では、なぜclobber リストに含まれているのではなくst(1)
、clobber リストにのみ含まれてst(0)
いるのでしょうか?
EDIT : 実際、なぜ clobber リストが必要なのですか? st(0)
and制約st(1)
を介してコンパイラに認識させる必要が"t"
あります。"u"
そうですか?