GCCが減算のために「sub」ではなく「lea」を出力するのはなぜですか?
-
12-12-2019 - |
質問
私はいくつかのCプログラムを逆アセンブルすることによって生成されたいくつかのアセンブリを見ていますが、私は頻繁に繰り返される単一の最適化に混乱しています。
GCCコンパイラに最適化がない場合は、次のものを使用します subl
減算のための命令が、私は最適化がオンになっているとき(-O3
正確には)コンパイラはaを使用します leal
減算の代わりに命令、以下の例:
最適化なし:
83 e8 01 subl $0x1, %eax
最適化を使用して
8d 6f ff leal -0x1(%edi), %ebp
これらの命令は両方とも3バイトの長さなので、ここでは最適化が見られません。誰かが私を助けて、コンパイラの選択を説明しようとすることができますか?
任意の助けがいただければ幸いです。
解決
これを生成する元のCコードを見ずに伝えるのは難しいです。
しかし、私が推測しなければならなかった場合、それは理由です leal
ソース-レジスタを破壊することなく、減算をout-of-placeにすることができます。
これは余分記録移動を救うことができる。
最初の例:
83 e8 01 subl $0x1, %eax
オーバーライト %eax
これにより、元の値が破棄されます。
第二の例 :
8d 6f ff leal -0x1(%edi), %ebp
店舗 %edi - 1
に %ebp
. %edi
将来の使用のために保存されます。
他のヒント
また、それを覚えておいてください lea
フラグには影響しませんが、 sub
そうだしたがって、その後の命令が減算によって更新されるフラグに依存しない場合は、次のようになります ない フラグの更新もより効率的になります。
所属していません StackOverflow