RISC-VのFENCE.I命令を調べる

rv32i基本命令をざっと眺めていて、この命令だけなんだろう?と思ったので調査します。

RISC-V specification v2.22.7 Memory Modelセクションに記載があります。

hardware thread間でのメモリ操作命令実行順序を保証するための明示的な命令がFENCE命令、とあります。まぁ、わかります。

specを読み進めると、命令ストリームとデータストリームを同期するために利用する、とあります。

自己書き換えプログラムを考えるとわかりやすいです。自己書き換えプログラムは、実行中のプログラムが、プログラム自身を書き換えるものです。

上記のような自己書き換えプログラムでは、 自身で書き換えた結果の命令 をフェッチしてくる必要があります。 通常、プロセッサは複数ステージのパイプラインで構成されるため、命令を書き換えるstoreが完了する前に、次の命令をフェッチしています。 書き換えた後の命令をフェッチしないといけないところで、命令書き換え前の命令をフェッチしていると、正しくプログラムが動作しないわけです。

そこで、FENCE.I命令で、書き換わった命令メモリの内容を参照することを保証します。 実装する方法はいくつかあり、パイプラインと命令キャッシュをフラッシュする、というのがシンプルな実装になります。 命令フェッチはやり直しになるため、書き換わった命令がフェッチできるわけです。

ということで、真面目にパイプライン構成を作り始めるとケアする必要がある命令ですね。