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)st(1)レジスタを使用し、レジスタの内容を上書きしてからst(1)、一番上のレジスタをポップします。

では、なぜclobber リストに含まれているのではなくst(1)、clobber リストにのみ含まれてst(0)いるのでしょうか?

EDIT : 実際、なぜ clobber リストが必要なのですか? st(0)and制約st(1)を介してコンパイラに認識させる必要が"t"あります。"u"そうですか?

4

1 に答える 1

5

これは、インライン asm に関する GCC ドキュメントで説明されています(i386 浮動小数点については、セクション 6.41.2 を参照してください)。

asm で死ぬ一連の入力レジスタがある場合、どれが asm によって暗黙的にポップされ、どれが GCC によって明示的にポップされる必要があるかを知る必要があります。

asm によって暗黙的にポップされる入力レジスターは、出力オペランドと一致するように制約されていない限り、明示的に上書きする必要があります。

この場合、fpatan操作は両方の入力をポップし、出力をプッシュするため、これを示すために clobberst(1)します。出力オペランドに制約されているためではst(1)なく、単に上書きする必要があります。st(0)st(0)

于 2013-04-04T16:50:01.103 に答える