画像: UCB-BAR: RISC-V Instruction Set Architecture より。
RISC-Vにおいて、アトミック命令としてAMO命令群が存在している。これは、
- メモリリード
- データ操作
- メモリライト、レジスタアクセス
をアトミックに実行する。例えば、AMOSWAP命令は
amoswap.w v0, v1, (a0)
- アドレスa0からメモリデータをリードする。
- v0にメモリデータを書き込む
- v1の値をメモリアドレスa0に書き込む
という操作となる。一方でAMO[ops]命令(例えばAMOAND命令)は、
- アドレスa0からメモリデータをリードする。
- v0にメモリデータを書き込む
- メモリデータとv0演算し、演算結果をメモリアドレスa0に書き込む
となる。これらのパタンでいくつか落ちていたので、ISSの修正を行った。
修正を行い、とりあえず現状はリグレッションテストでFAILしているのは以下のパタンのみになった。445本中435本がPASSだ。
The following tests FAILED: 8 - rv32mi-p-timer (Failed) 9 - rv32si-p-csr (Failed) 47 - rv32ui-pm-lrsc (Failed) 126 - rv64mi-p-dirty (Failed) 130 - rv64mi-p-mcsr (Failed) 134 - rv64mi-p-timer (Failed) 136 - rv64si-p-csr (Failed) 230 - rv64ui-pm-lrsc (Failed) 436 - median (Failed) 443 - spmv (Failed)
残っているのは、権限のあたりで実装が足りないところが多い。マシンモードのレジスタであっても、スーパバイザモード中に変更できる例外的な状態があったりだとか、 タイマ系も権限があるといっても、別の権限で実行中でも動作できたりなど、特殊な状態での動作をサポートする必要がある。 そのあたりを詰めて行こう。