FPGA開発日記

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

Binary Translation型エミュレータを作る(softfloat-wrapper最新版への対応)

少し前に浮動小数点命令対応時に、Rustのクレートであるsoftfloat-wrapperがRISC-V向けコンパイルに対応していなかったのだが、作者の方が対応してくれたようで、RISC-Vコンパイルに対応してくれたようだ。さっそくアップデートしてみる。Cargo.tomlを以下のように変更してみた。

[dependencies]
mmap = "*"
libc = "*"
num = "*"
memmap = "*"
softfloat-wrapper = { version = "0.1.3", default-features = false, features = ["riscv"] }
spike-dasm-wrapper = "*"
clap = "3.0.0-beta.1"
iced-x86 = "1.8.0"

このようにfeaturesに対して["riscv"]を設定することでRISC-V向けにsoftfloatをコンパイルしてくれるようになり、RISC-V向けシミュレータに使えるようになる。これにより亜流のsoftfloatを使用する必要がなくなった。ありがたい。

$ cargo run -- --elf-file riscv/riscv-tools/riscv-tests/build/isa/rv64ud-p-fclass
$ cargo run -- --elf-file riscv/riscv-tools/riscv-tests/build/isa/rv64uf-p-fclass
00007F17B18B0000 48B84000008000000000 movabs    $0x8000_0040,%rax
00007F17B18B000A 48898508020000       mov       %rax,0x208(%rbp)
00007F17B18B0000 E9B0FF0800           jmp       0x0000_7F17_B193_FFB5
<Convert_Virtual_Address. virtual_addr=0000000080001000 : vm_mode = 0, priv_mode = 3>
store32 : converted address: 0000000080001000 --> 0000000080001000
Result: MEM[0x1000] = 00000001

問題無いようだ。

Rustのfeature機能とは何なのか?

feature機能について知らなかったので調べてみた。

qiita.com

なるほど、コンパイル時のオプションとして特定の機能を有効・無効にできるのか。C/C++のdefineマクロみたいなもんかな?今回の場合には、featuresによりincludeするPATHを変更しているのか。

salsa.debian.org

#[cfg(feature = "8086")]
const SPECIALIZED_PATH: &str = "8086";
#[cfg(feature = "8086-sse")]
const SPECIALIZED_PATH: &str = "8086-SSE";
#[cfg(feature = "arm-vfpv2")]
const SPECIALIZED_PATH: &str = "ARM-VFPv2";
#[cfg(feature = "arm-vfpv2-defaultnan")]
const SPECIALIZED_PATH: &str = "ARM-VFPv2-defaultNaN";
#[cfg(feature = "riscv")]
const SPECIALIZED_PATH: &str = "RISCV";