簡體   English   中英

執行x87 FPATAN操作的擴展GCC內聯匯編中的clobber列表的說明

[英]Explanation for clobber list in extended GCC inline assembly executing the x87 FPATAN operation

以下代碼位於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)寄存器,然后彈出頂部寄存器。

那么為什么只有st(1)包含在clobber列表中,而不是st(0)呢?

編輯 :事實上,為什么它需要一個clobber列表,因為編譯器應該通過"t""u"約束知道st(0)st(1) 是對的嗎?

有關內聯asmGCC文檔中對此進行了解釋(請參閱第6.41.2節關於i386浮點):

給定一組在asm中死亡的輸入寄存器,有必要知道哪些是由asm隱式彈出的,哪些必須由GCC顯式彈出。

由asm隱式彈出的輸入寄存器必須明確地被破壞,除非它被約束為匹配輸出操作數。

在這種情況下, fpatan操作會彈出兩個輸入並按下輸出,因此我們使用stbber st(1)來指示這一點。 我們只需要stbber st(1)而不是st(0)因為st(0)被約束到輸出操作數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM