1

Linuxアセンブリファイルからの命令の数を(手動で)減らしたい。これは基本的に、抽象構文ツリーで事前定義された縮小を検索することによって行われます。

例えば:

pushl <reg1>
popl  <reg1>

意味がないため削除されます。

または:

pushl <something1>
popl  <something2>

となります:

movl <something1>, <something2>

固定数の命令を含む他の最適化を探しています。ダイナミックレンジの命令を検索したくありません。

より少ない指示で置き換えることができる他の同様のパターンを提案できますか?

後で編集:リチャード・ペニントンのおかげで、私が欲しいのはのぞき穴の最適化であることがわかりました。

だから私は質問を次のように言い換えます:Linuxアセンブリコードでのぞき穴最適化の提案。

4

3 に答える 3

3

コンパイラはすでにそのような最適化を行っています。さらに、次の理由から、このような最適化を行うことはそれほど単純な決定ではありません。

push reg1
pop reg1

reg1 の値をメモリ位置 [sp-nn] に残します (ここで、nn = reg1 のサイズ (バイト単位))。したがって、sp はそれを過ぎていますが、その後のコードは [sp-nn] に reg1 の値が含まれていると想定できます。

同じことが他の最適化にも当てはまります。

push some1
pop some2

そして、それは通常、同等のmovl some1, some2命令がない場合にのみ発行されます。

高レベルのコンパイラで生成されたコードを最適化しようとしている場合、コンパイラは通常、これらのケースのほとんどを考慮します。ネイティブに記述されたアセンブリ コードを最適化しようとしている場合、アセンブリ プログラマはさらに優れたコードを記述する必要があります。

アセンブリコードを最適化するのではなく、コンパイラを最適化することをお勧めします。これにより、コードの意図を処理したり、使用法を登録したりするためのより良いフレームワークが提供されます。

于 2009-11-28T15:56:41.943 に答える
1

あなたがやろうとしていることについてより多くの情報を得るには、「のぞき穴の最適化」を探してみてください。

于 2009-11-28T16:05:25.200 に答える
0
pushl <something1>
popl  <something2>

交換された

mov <something1>, <something2>

実際に私のプログラムのサイズを増やしました。変!

他に考えられるピープホールの最適化をいくつか教えていただけますか?

于 2009-12-11T10:21:27.553 に答える