if文

絶対値を返す簡単な関数について見てみる。まずは最適化なし(-O0

cmp, jle, jmp 命令などによって if 文のふるまいが表現されていることがわかる。符号を反転させる部分は以下のような感じ(Swift)

続いて最適化あり(-O2

cmovl は conditonal move if less だそうで、つまり第1オペランドが第2オペランドより小さかったら第1オペランドへロードするというものらしい。だいぶ処理が軽くなっているのがわかる。

末尾呼び出しの最適化

末尾呼び出しでない階乗関数

Cのコードはこんなかんじで。

アセンブリコードを見てみる。

再帰が深い場合、スタックを食いつぶすことがわかる。続いて末尾再帰版。

最適化あり(-O1)で生成したコード。-O2 だとちょっと読むのが厳しいくらい最適化されたコードが生成されてしまったので…。

末尾呼び出しがジャンプ命令に置き換わっているのがわかる。コールスタックを消費しない形式となっている。

Hello, world

Cのコードを掲載するまでもないと思うんですが、まあ一応掲載

-O2 で生成したコード。

あんまり面白くなかった。”hello, work!” という文字列への参照を rdi レジスタにぶち込んで _puts よんでるだけだった。最後に xor eax, eax しているのは main 関数の return 0 を表現しているのだろう…。

参考文献

  • http://kira000.hatenadiary.jp/entry/2014/08/26/052447
  • https://codezine.jp/article/detail/485

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です