SniperでRISC-Vのベクトル命令をサポートするために、RISC-Vデコーダについて解析する。
SniperのRISC-Vデコーダは、RV8をベースとしている。RV8のデコーダに情報を追加していく。
https://github.com/michaeljclark/rv8
- 命令の追加 (
meta/opcodes
)
# RVV (actually its rvv but temporary assigned to F) vsetvli rd rs1 oimm12 31..31=0 14..12=7 6..2=21 1..0=3 i rv64v vle8.v vd rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=0 6..2=1 1..0=3 i+v rv64v vse8.v vs3 rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=0 6..2=9 1..0=3 s+v rv64v vle16.v vd rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=5 6..2=1 1..0=3 i+v rv64v vse16.v vs3 rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=5 6..2=9 1..0=3 s+v rv64v vle32.v vd rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=6 6..2=1 1..0=3 i+v rv64v vse32.v vs3 rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=6 6..2=9 1..0=3 s+v rv64v vle64.v vd rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=7 6..2=1 1..0=3 i+v rv64v vse64.v vs3 rs1 31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=7 6..2=9 1..0=3 s+v rv64v vlse8.v vd rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=0 6..2=1 1..0=3 i+vs rv64v vsse8.v vs3 rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=0 6..2=9 1..0=3 s+vs rv64v vlse16.v vd rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=5 6..2=1 1..0=3 i+vs rv64v vsse16.v vs3 rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=5 6..2=9 1..0=3 s+vs rv64v vlse32.v vd rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=6 6..2=1 1..0=3 i+vs rv64v vsse32.v vs3 rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=6 6..2=9 1..0=3 s+vs rv64v vlse64.v vd rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=7 6..2=1 1..0=3 i+vs rv64v vsse64.v vs3 rs1 rs2 31..29=0 28..28=0 27..26=0 25..25=1 14..12=7 6..2=9 1..0=3 s+vs rv64v
命令とオペランドは良しとして、codec
が謎すぎる。i+v
/ i+vs
というのは、命令オペランドの組を示している。これは meta/codec
で示されている。
- codec (
meta/codecs
)
i+v vd,rs1 vd rs1 s+v vs3,rs1 vs3 rs1 i+vs vd,rs1,rs2 vd rs1 rs2 s+vs vs3,rs1,rs2 vs3 rs1 rs2
- レジスタ (
meta/registers
)
v0 v0 vreg caller "Vector Registers" v1 v1 vreg caller "Vector Registers" v2 v2 vreg caller "Vector Registers" v3 v3 vreg caller "Vector Registers" v4 v4 vreg caller "Vector Registers" ... v29 v29 vreg caller "Vector Registers" v30 v30 vreg caller "Vector Registers" v31 v31 vreg caller "Vector Registers"
- フォーマット (
meta/formats
)
# Vector vd,rs1 vs3,rs1 vd,rs1,rs2 vs3,rs1,rs2
これにより、RV8上に命令の定義とデコーダが生成される。これをSniperで読み込むことでSniperでのベクトル動作がサポートされる。
Running cycle 4567 ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== FIRST LOAD: (:0x112) ------------------------------- ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== LOAD: (:0x112) ------------------------------- ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== LOAD: (:0x112) ------------------------------- ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== LOAD: (:0x112) ------------------------------- ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== LOAD: (:0x112) ------------------------------- ** simulate: LOAD (:0x 112) -- vle8.v v8, a1 =============================== LOAD: (:0x112) -------------------------------