少し前に浮動小数点命令対応時に、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
機能について知らなかったので調べてみた。
なるほど、コンパイル時のオプションとして特定の機能を有効・無効にできるのか。C/C++のdefineマクロみたいなもんかな?今回の場合には、features
によりincludeするPATHを変更しているのか。
#[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";