MIPSのISSを実装し直している。今回は、RISC-VのISSと共有できる形で実装を考え直し、C++で書き直している。 MIPSのISSの実装で問題になるのが、遅延スロットの問題である。私のISSの実装は、基本的に、
- 命令をシミュレートする。その際、レジスタの読み込みやメモリアクセスなどの情報をトレースログに書き込んでいく。
- トレースログからログを出力する。
遅延スロットは、命令を実行している最中に他の命令が実行されることに他ならない。例えば、beq命令の定義は以下だ。
I: target_offset <-- sign_extend(offset || 0^2) condition <-- (GPR[rs] == GPR[rt]) I+1: if condition then PC <-- PC + target_offset endif
このI+1のときに、遅延スロットの命令が実行されているという訳だ。従って、遅延スロットでPCを読み込んだり、PCを操作する命令の実行は禁止という訳だ。 従って、ISSの実装としては以下のようになり、
I: BEQ命令の比較の実行 I+1: I+1命令の実行 BEQ命令のPCの更新
となり、命令の実行とトレースの情報がIとI+1で混ざることになってしまう。これを回避するために、トレースログを2つに分け、遅延スロットのログを別に管理することで、ログが混ざらないようにしている。