RISC-VのISSのメンテナンスを継続している。前回から殆ど調整していなかったが、RISC-VのテストパタンをパスできるようにISSを調整していこう。
ISSの実装を進めていった結果、Failになっているパタンは以下となった。
The following tests FAILED: 1 - rv32mi-p-csr (Failed) 3 - rv32mi-p-ma_addr (Failed) 4 - rv32mi-p-ma_fetch (Failed) 6 - rv32mi-p-sbreak (Failed) 7 - rv32mi-p-scall (Failed) 8 - rv32mi-p-timer (Failed) 9 - rv32si-p-csr (Failed) 11 - rv32si-p-ma_addr (Failed) 12 - rv32si-p-ma_fetch (Failed) 13 - rv32si-p-sbreak (Failed) 15 - rv32si-p-shamt (Failed) 47 - rv32ui-pm-lrsc (Failed) 125 - rv64mi-p-csr (Failed) 126 - rv64mi-p-dirty (Failed) 128 - rv64mi-p-ma_addr (Failed) 129 - rv64mi-p-ma_fetch (Failed) 130 - rv64mi-p-mcsr (Failed) 132 - rv64mi-p-sbreak (Failed) 133 - rv64mi-p-scall (Failed) 134 - rv64mi-p-timer (Failed) 136 - rv64si-p-csr (Failed) 138 - rv64si-p-ma_addr (Failed) 139 - rv64si-p-ma_fetch (Failed) 140 - rv64si-p-sbreak (Failed) 230 - rv64ui-pm-lrsc (Failed) 233 - rv64ui-p-mulhsu (Failed) 315 - rv64ui-pt-mulhsu (Failed) 401 - rv64ui-v-mulhsu (Failed)
システムレジスタアクセス系のパタンが残ってきた。mulhsuは、可変長演算系のライブラリを利用しているが、それでもちゃんと実装できていないところがあり残ってしまっている。
1. ミスアラインの対応
RISC-Vでは、ミスアラインが発生すると例外が以下のように発生する。ExceptionCodeは、命令フェッチだと0、ロードだと4、ストアだと6に設定されている。
if (except != MemNoExcept) { m_env->GenerateException (Except_StoreAddrMisalign); return; }
2. breakの対応
RISC-Vではebreak命令を発生させることによりデバッガに動作を以降させることができる。ebreak命令は、例外を発生させるだけで良い。
void InstEnv::RISCV_INST_EBREAK (Word_t inst_hex) { + m_env->GenerateException (Except_Breakpoint); + return; }
これらの実装により、RISC-Vのテストパタンの結果はだいぶPassが増えてきた。
The following tests FAILED: 1 - rv32mi-p-csr (Failed) 7 - rv32mi-p-scall (Failed) 8 - rv32mi-p-timer (Failed) 9 - rv32si-p-csr (Failed) 15 - rv32si-p-shamt (Failed) 47 - rv32ui-pm-lrsc (Failed) 125 - rv64mi-p-csr (Failed) 126 - rv64mi-p-dirty (Failed) 130 - rv64mi-p-mcsr (Failed) 133 - rv64mi-p-scall (Failed) 134 - rv64mi-p-timer (Failed) 136 - rv64si-p-csr (Failed) 230 - rv64ui-pm-lrsc (Failed) 233 - rv64ui-p-mulhsu (Failed) 315 - rv64ui-pt-mulhsu (Failed) 401 - rv64ui-v-mulhsu (Failed)
もう少しだ!