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命令に構文依存性を持つ可能性がある。