GitHubで発見したRISC-Vのベクトル命令テストケースを試してみることにした。 結構こいつはきちんと基本的なテストケースを作ってくれるっぽい。
git clone https://github.com/ksco/riscv-vector-tests.git
基本的には上記ディレクトリでmakeを叩くだけでいいのだが、riscv-vector向けのgccとSpikeが用意されている必要がある。 また、今使っているSpikeとの実装の互換性があっていなかったようなので、ちょっと改造することにした。 (実際には、自分の使っているSpikeのバージョンが古かったようで、最新のSpikeにアップグレードすればこの改造は不要っぽい)。
diff --git a/pspike/pspike.cc b/pspike/pspike.cc index c9bffd2..b3aef2f 100644 --- a/pspike/pspike.cc +++ b/pspike/pspike.cc @@ -7,9 +7,9 @@ // Copied from spike main. // TODO: This should really be provided in libriscv -static std::vector<std::pair<reg_t, abstract_mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout) +static std::vector<std::pair<reg_t, mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout) { - std::vector<std::pair<reg_t, abstract_mem_t*>> mems; + std::vector<std::pair<reg_t, mem_t*>> mems; mems.reserve(layout.size()); for (const auto &cfg : layout) { mems.push_back(std::make_pair(cfg.get_base(), new mem_t(cfg.get_size()))); @@ -85,8 +85,8 @@ int main(int argc, char** argv) { .support_haltgroups = true, .support_impebreak = true }; - std::vector<std::pair<reg_t, abstract_mem_t*>> mems = make_mems(cfg.mem_layout()); - std::vector<const device_factory_t*> plugin_devices; + std::vector<std::pair<reg_t, mem_t*>> mems = make_mems(cfg.mem_layout()); + std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices; sim_t sim(&cfg, false, mems, plugin_devices,
make
で生成すると、いろんなテストパタンが生成されていることを確認した。
out/v256x64machine/bin/stage2/vadd.vv-0
を objdumpした結果
8000019a: 52fd li t0,-1 8000019c: 0c02f357 vsetvli t1,t0,e8,m1,ta,ma 800001a0: 02050187 vle8.v v3,(a0) 800001a4: 4281 li t0,0 800001a6: 0c52f357 vsetvli t1,t0,e8,mf8,ta,ma 800001aa: 023100d7 vadd.vv v1,v3,v2 800001ae: 00020517 auipc a0,0x20 800001b2: e5250513 addi a0,a0,-430 # 80020000 <begin_signature> 800001b6: 52fd li t0,-1 800001b8: 0c02f357 vsetvli t1,t0,e8,m1,ta,ma 800001bc: 020500a7 vse8.v v1,(a0)
こいつは基本的なテストパタンとしてかなり使えそうな気がする。