自作RISC-VシミュレータにBit-Manipulationの機能を実装した。すべてのテストセットがPasssすることを確認した。
Bit-Manipulationの機能は、仕様書November 30, 2019を参考にした。
テストを含めてツールセットの準備はすべてこのriscv-bitmanipリポジトリを使用している。Spikeシミュレータもあらかじめ実装されているので、自作RISC-Vシミュレータに対する実装もある程度簡単にできた。
ツールチェインの用意はBit-Manipulationが実装されたRISC-V GCCを使い、テストケースは同様にriscv-bitmanip内に格納されているtestsテストケースを使用した。
このテストケースは、ハッシュ関数比較方式になっておりデバッグは非常に容易ではない。そこでSpikeの実行結果との比較スクリプトを作って動作比較を行った。
./swimmer_riscv --binfile ${HOME}/work/riscv/riscv-bitmanip/tests/tests --use-pk=${RISCV}/riscv64-unknown-elf/bin/pk
test_zbb 0x90f45e4e OK test_zbs 0xe4fa9ed0 OK test_zbp 0xbf7dc8c4 OK test_zbe 0xad938c6a OK test_zbc 0xcdef75a4 OK test_zbr 0x31fc780f OK test_zbm 0x355a32a3 OK test_zbt 0xcef7df02 OK test_zbf 0x3fa35b76 OK test_stdc 0x5a983d30 OK ALL TESTS PASSED.
このテストケース、とても面倒で、エラーがどの命令で発生したのか良く分からない。例えばエラーで失敗すると以下のようなメッセージが表示されるだけである。
./swimmer_riscv --binfile ${HOME}/work/riscv/riscv-bitmanip/tests/tests --use-pk=${RISCV}/riscv64-unknown-elf/bin/pk
まじデバッグできん!
test_zbb 0xf24baae6 ERROR
Spikeとの比較スクリプトを使って、どうにかすべてのテストがPassできるようになった。