2016-12-24 5 views
1

単純な関数(x86-64で、-O2):gccは読み込み中に呼び出し先保存レジスタを保持するのはなぜですか?

__attribute__((noinline,noclone,pure)) 
uint foo() { 
    register const uint* _reg asm ("r15"); 
    return *_reg; 
} 

この機能のためのアセンブラ出力:

push r15  
mov  eax, [r15]  
pop  r15  
retn 

不要なポップ/は、命令が挿入されているプッシュするのはなぜ?

+5

ここで行っていることは、[GCCのドキュメントに従って明示的にサポートされていません](https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables)です。 –

+0

また、これがインラインasmが悪い理由の1つです。 – rubenvb

答えて

1

良い質問ですが、私は気の利いた考えはしていませんが、おそらくコンパイラはr15を使用すると宣言してから関数エントリに保存し、関数を終了する前にリストアします。コンパイラでは、レジスタを読み取っているだけでは表示されません。

コンパイラは、レジスタを保存する必要があるかどうかを判断するためにレジスタを書き込むかどうかを追跡するロジックを拡張する必要があります。

関連する問題