KDOC 151: Goコンパイラの定数式の埋め込みをみる

この文書のステータス

  • 作成
    • 2024-05-01 貴島
  • レビュー
    • 2024-05-11 貴島

概要

Goが出力するアセンブリと、Cが出力するアセンブリと比較していると、定数式の扱いが違うことに気づいた。Goアセンブリでは定数どうしの式がアセンブラに現れず、結果だけが埋め込まれる。

違い

↓まずCの、RISC-V向けアセンブリ。見慣れた形式。

↓つぎにGoの、RISC-V向けアセンブリ。

まとめ。

  • ↑2言語で書かれた内容はほぼ同じ
  • Go言語の生成したアセンブリのほうが短い
  • 少なくとも↑このコードでは、Goアセンブリに乗算命令 mul がない。明らかに定数だから、先読みして結果だけ埋め込んでしまうということか。例コードだとGoコンパイラの方が最適化しているといえる

↓引数にすると、最適化しようがないので乗算命令が現れる。

関連