前回の続き。マイクロコードを変更して再実験を行う。今回の再実験で考え直さなければならないのは以下の通りだった。
- LMULを命令情報として追加して、最後の命令であればROBに命令終了通知を出す。
- vsetvl命令がLMUL_CHANGE例外を出すとき、VSEWとかVLMULの値は過去のものを保持するが、vlの書き込みは行う。
- 例外実行中のvsetvl命令では、
vsetvli x0, x0
を使用するので、vlの値をキープするように変更する。
これにより、一応簡単なLMUL=8のテストケースは動作するようになった。 しかしまだ甘すぎるので、さっそく検証を動かしていこうと思う。
- 基本の考え直し。
- LMULが大きくなる方向の変化
- 例外を発生させて、物理レジスタを退避させて整列させる。
- 起点レジスタ(LMUL=8の場合は8の倍数となるレジスタ)の値はリネームマップに書かれている。それ以外の従属するレジスタ(8の倍数以外のレジスタ)は、リネームマップに記載されない。リネームマップ内で、常にLMUL=8をベースにして再計算される。この状況はWhole Register Storeへの取り扱いの時に必要となる。
- ちなみに、Whole Register Loadへの取り扱いはLMUL=1に戻さないとどうにもならない。
- LMULが小さくなる方向(ただしマイナスを除く)
- 例外を発生させなくてもよいと思っていたが、元の起点レジスタ以外のベクトルレジスタのリネームマップテーブルが正しく更新されていないため、矛盾が生じる。
- 元の起点レジスタ以外のレジスタのリネームマップが正しくないので、誤ったレジスタ名を読んでしまう。
- したがって、LMULが小さくなる方向であっても、レジスタを再整列させる必要がある。
- ただし、vs1r命令を用いて1つずつ元に戻すことはできない。vs1r命令の粒度では、物理レジスタのリネーム・マップを管理していないからである。(LMULの大きさで管理している)
- そこで、pushするときは古いLMULの大きさでpushし、popするときは、新しいLMULの大きさでpopするという芸当を使わなければならない。