ベクトルレジスタのLMUL>1サポートを具体的に考えていく。
前に考えた、LMULが変更されたときにベクトル・レジスタのリネームを整列する方法を考える。
例外を発生させるところまではできているので、例外の途中にvsetvl
命令が実行されると、フリーリストの最大値とスケールを置き換えるようにする。
vs1r.v v28, (x10); add x10, x10, x11 vs1r.v v29, (x10); add x10, x10, x11 vs1r.v v30, (x10); add x10, x10, x11 vs1r.v v31, (x10); add x10, x10, x11 csrr x12, 0x00b # vscratch vsetvl x0, x0, x12 la x10, vector_stack_data vl1r.v v0 , (x10); add x10, x10, x11 vl1r.v v1 , (x10); add x10, x10, x11 vl1r.v v2 , (x10); add x10, x10, x11 vl1r.v v3 , (x10); add x10, x10, x11
新たにVSCRATCHというシステムレジスタを作った。LMULが変更される例外が発生すると、その命令の機械語をVSCRATCHに格納するようにしておき、vsetvl命令によってそれを読み出して、vtypeレジスタに格納することで、ここで実際にフリーリストの再構成を行う。
一応これでハードウェア側を変更して、動作を確認する。