Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。浮動小数点演算はsoftfloatを使用しており、Rustでもいくつかのcrateが公開されているためこれを活用している。
テストパタンを試行していたのだが、riscv-tests
が通らないので調査していると、どうやらRISC-V向けのコンパイルになっていないようだった。
最初は以下のクレートを活用していたのだが、テストパタンで落ちることが分かった。
https://crates.io/crates/softfloat-sys
当然、このクレートを使っている以下のラッパークレートもRISC-Vのテストで失敗してしまった。
https://crates.io/crates/softfloat-wrapper
どうしようかとしばらく考えたのだが、ここは既存の物を改造して作り直した方がいいんじゃないか、ということで既存の物をベースにして作り直すことにした。
修正点は本当にわずかだ。以下の部分を修正するのみである。
diff --git a/build.rs b/build.rs index 95b658e..ac6f894 100644 --- a/build.rs +++ b/build.rs @@ -337,7 +337,7 @@ fn main() { "f128M_le_quiet.c", "f128M_lt_quiet.c", ]; - let specialized_source_path = softfloat_source.join(Path::new("8086-SSE")); + let specialized_source_path = softfloat_source.join(Path::new("RISCV")); builder .include(softfloat_build.join(Path::new("Linux-x86_64-GCC"))) .include(&specialized_source_path)
そしてsoftfloat-wrapper
もこの改造クレートを使用するように変更した。結局softfloat-sys
もsoftfloat-wrapper
も、既存の物に対して亜流の分岐クレートを作ってしまったのだが良かったのだろうか。このようにクレートの一部に改造を加えたい場合どのようにすればよいのか、良い方法があれば教えてほしい。
という訳で新しく作り直したクレートを使って浮動小数点命令を実行した。加減乗除までチェックし、結果はすべてPassとなった。良さそうだ。
調子に乗って浮動小数点命令のバリエーションを増やした。一気に以下の命令を実装した。
- FADD.D
- FSUB.D
- FMUL.D
- FDIV.D
- FMADD.D
- FMSUB.D
- FNMSUB.D
- FNMADD.D
- FSQRT.D
これらはすべて上記の新しく作ったsoftfloat-wrapper
でサポートしており、命令の定義を増やすだけなので簡単だ。テストパタンもクリアした。
命令のデバッグに関しては、毎ブロックが終了するたびに汎用レジスタの一覧をダンプするようにしている。これで常に実行結果を確認できる仕組みだ。
さらに拡張を続けていきたい。命令のバリエーションを増やしていこうと思う。