RISC-VにおけるRVWMOのメモリモデルについて、仕様書を読み直すことにした。 ChatGPTの力を借りながら、要点をまとめていく。
Syntactic Dependencies
RVWMOメモリモデルの定義は、構文依存性の概念に部分的に基づいており、以下のように定義されている:
- レジスタ 汎用レジスタ全体、CSRの一部、またはCSR全体を指す。CSRを通じて追跡される依存関係の粒度は、各CSRに固有であり、セクション16.2で定義されている。
構文依存性は、命令のソースレジスタ、命令の宛先レジスタ、および命令がソースレジスタから宛先レジスタへ依存関係を伝播する方法に関して定義される。
ソースレジスタ : 一般に、レジスタ
r(x0以外)は、以下のいずれかが当てはまる場合に命令iのソースレジスタであると考える:iのオペコードにおいて、rs1、rs2、rs3がrとして設定されているiがCSR命令で、オペコードにおいてcsrがrに設定されている。iがCSRRWまたはCSRRWIでrdがx0に設定されている場合を除く。rがCSRで、セクション16.3で定義されているようにiの暗黙のソースレジスタであるrがCSRで、iの他のソースレジスタとエイリアスを形成している- メモリ命令はまた、アドレスソースレジスタとデータソースレジスタをさらに指定する。
宛先レジスタ : 一般に、レジスタr(x0以外)は、以下のいずれかが当てはまる場合に命令iの宛先レジスタであると考える:
iのオペコードにおいて、rdがrに設定されているiがCSR命令で、オペコードにおいてcsrがrに設定されている。iがCSRRSまたはCSRRCでrs1がx0に設定されている場合、またはiがCSRRSIまたはCSRRCIでuimm[4:0]がゼロに設定されている場合を除く。rがCSRで、セクション16.3で定義されているようにiの暗黙の宛先レジスタであるrがCSRで、iの他の宛先レジスタとエイリアスを形成している。- ほとんどの非メモリ命令は、それぞれのソースレジスタからそれぞれの宛先レジスタへ依存関係を持つ。しかし、このルールには例外があり、セクション16.3を参照すること。
ソースレジスタと宛先レジスタによる命令の構文依存性
命令jは、iの宛先レジスタsとjのソースレジスタrを介して、命令iに構文依存性を持つ場合、以下のいずれかに相当する:
sとrが同じであり、iとjの間にプログラム順序でレジスタrを宛先レジスタとする命令がない。iとjの間にプログラム順序で命令mがあり、以下のすべてが当てはまる:jは宛先レジスタqとソースレジスタrを介してmに構文依存性を持つmは宛先レジスタsとソースレジスタpを介してiに構文依存性を持つmはpからqへの依存関係を持つ (なんかいろいろ言っているがつまりiとjとkでレジスタ依存関係がある)
メモリアクセスにおける構文依存性の定義:
また、以下の定義では、aおよびbを2つのメモリ操作、iおよびjをそれぞれaおよびbを生成する命令とする。
- 構文アドレス依存性 : rがjのアドレスソースレジスタであり、jがソースレジスタrを介してiに構文依存性を持つ場合、bとaは構文アドレス依存性を持つという。
- 構文データ依存性 : bがストア操作であり、rがjのデータソースレジスタであり、jがソースレジスタrを介してiに構文依存性を持つ場合、bがaに構文データ依存性を持つという。
- 構文制御依存性 : iとjの間にプログラム順序で命令mがあり、mが分岐または間接ジャンプであり、mがiに構文依存性を持つ場合、bがaに構文制御依存性を持つという。
一般的に、非AMOロード命令はデータソースレジスタを持たず、条件なしの非AMOストア命令は宛先レジスタを持たない。 ただし、成功したSC命令は宛先レジスタとしてrdに指定されたレジスタを持つとみなされ、したがって命令はプログラム順序でそれに先行する成功したSC命令に構文依存性を持つ可能性がある。