Gem5に命令を追加する試行続き。命令の定義をいろいろと調べていて、前回なぜVLEおよびVSEがうまく動かなかったのかを調査していた。 結果としてVSETVLI命令をある程度きちんと実装しておかないとベンチマークとして正しく動作しないようだった。そりゃそうか。
src/arch/riscv/isa/decoder.isa
0x15: decode FUNCT3 { 0x7: decode IMMSIGN { format CSROp { 0x0 : vsetvli({{ if (Rs1 > 16) { Rd = 16; } else { Rd = Rs1; } fprintf(stderr, "vsetvli set rd=%d, rs1=%d\n", Rd, Rs1); }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); } } }
まあ、とりあえずfprintf(stderr,
を追加しているのだがこれで正しくレジスタを更新されているのかチェックしている。
これでテストを実行してみよう。
copy_data_vec: mv a3, a0 # Copy destination .loop: vsetvli t0, a2, e8, m1 # Vectors of 8b vle8.v v0, (a1) # Load bytes add a1, a1, t0 # Bump pointer sub a2, a2, t0 # Decrement count vse8.v v0, (a3) # Store bytes add a3, a3, t0 # Bump pointer bnez a2, .loop # Any more? ret # Return
printf()が入っているので、この状態ではデバッグ情報が大量に出力される。
vsetvli set rd=16, rs1=150 vsetvli set rd=16, rs1=134 vsetvli set rd=16, rs1=118 vsetvli set rd=16, rs1=102 vsetvli set rd=16, rs1=86 vsetvli set rd=16, rs1=70 vsetvli set rd=16, rs1=54 vsetvli set rd=16, rs1=38 vsetvli set rd=16, rs1=22 vsetvli set rd=6, rs1=6