FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Binary Translation型エミュレータを作る(softfloatクレートの実装変更)

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-syssoftfloat-wrapperも、既存の物に対して亜流の分岐クレートを作ってしまったのだが良かったのだろうか。このようにクレートの一部に改造を加えたい場合どのようにすればよいのか、良い方法があれば教えてほしい。

という訳で新しく作り直したクレートを使って浮動小数点命令を実行した。加減乗除までチェックし、結果はすべてPassとなった。良さそうだ。

調子に乗って浮動小数点命令のバリエーションを増やした。一気に以下の命令を実装した。

  • FADD.D
  • FSUB.D
  • FMUL.D
  • FDIV.D
  • FMADD.D
  • FMSUB.D
  • FNMSUB.D
  • FNMADD.D
  • FSQRT.D

これらはすべて上記の新しく作ったsoftfloat-wrapperでサポートしており、命令の定義を増やすだけなので簡単だ。テストパタンもクリアした。

命令のデバッグに関しては、毎ブロックが終了するたびに汎用レジスタの一覧をダンプするようにしている。これで常に実行結果を確認できる仕組みだ。

さらに拡張を続けていきたい。命令のバリエーションを増やしていこうと思う。

f:id:msyksphinz:20200923005553p:plain