diff options
author | Chih-Min Chao <chihmin.chao@sifive.com> | 2019-06-06 03:20:44 -0700 |
---|---|---|
committer | Chih-Min Chao <chihmin.chao@sifive.com> | 2019-06-18 08:54:10 -0700 |
commit | 235aa58bfb439c9782defe8bdd21f792e40aac31 (patch) | |
tree | 3eec7c13834d660f47593c86e77e7f1281869165 | |
parent | 371e3fe5ef4017bececabe56e4958eb22ac0f08f (diff) | |
download | spike-235aa58bfb439c9782defe8bdd21f792e40aac31.zip spike-235aa58bfb439c9782defe8bdd21f792e40aac31.tar.gz spike-235aa58bfb439c9782defe8bdd21f792e40aac31.tar.bz2 |
rvv: add control instructions and system register access
Signed-off-by: Bruce Hoult <bruce@hoult.org>
Signed-off-by: Dave Wen <dave.wen@sifive.com>
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
-rw-r--r-- | riscv/decode.h | 1 | ||||
-rw-r--r-- | riscv/insns/vsetvl.h | 1 | ||||
-rw-r--r-- | riscv/insns/vsetvli.h | 1 | ||||
-rw-r--r-- | riscv/processor.cc | 31 | ||||
-rw-r--r-- | riscv/riscv.mk.in | 8 |
5 files changed, 42 insertions, 0 deletions
diff --git a/riscv/decode.h b/riscv/decode.h index 7ea1532..6cbf934 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -138,6 +138,7 @@ private: // helpful macros, etc #define MMU (*p->get_mmu()) #define STATE (*p->get_state()) +#define P (*p) #define READ_REG(reg) STATE.XPR[reg] #define READ_FREG(reg) STATE.FPR[reg] #define RS1 READ_REG(insn.rs1()) diff --git a/riscv/insns/vsetvl.h b/riscv/insns/vsetvl.h new file mode 100644 index 0000000..773b984 --- /dev/null +++ b/riscv/insns/vsetvl.h @@ -0,0 +1 @@ +WRITE_RD(P.VU.set_vl(insn.rs1(), RS1, RS2)); diff --git a/riscv/insns/vsetvli.h b/riscv/insns/vsetvli.h new file mode 100644 index 0000000..fc5d1ba --- /dev/null +++ b/riscv/insns/vsetvli.h @@ -0,0 +1 @@ +WRITE_RD(P.VU.set_vl(insn.rs1(), RS1, insn.v_zimm11())); diff --git a/riscv/processor.cc b/riscv/processor.cc index 5b8369d..2a28579 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -647,6 +647,27 @@ void processor_t::set_csr(int which, reg_t val) case CSR_DSCRATCH: state.dscratch = val; break; + case CSR_VSTART: + VU.vstart = val; + break; + case CSR_VXSAT: + VU.vxsat = val; + break; + case CSR_VXRM: + VU.vxrm = val; + break; + case CSR_VL: + VU.vl = val; + break; + case CSR_VTYPE: + VU.vtype = val; + // check vill bit + if (BITS(VU.vtype, get_xlen(), get_xlen() - 1) == 1){ + VU.vill = true; + }else{ + VU.vill = false; + } + break; } } @@ -814,6 +835,16 @@ reg_t processor_t::get_csr(int which) return state.dpc & pc_alignment_mask(); case CSR_DSCRATCH: return state.dscratch; + case CSR_VSTART: + return VU.vstart; + case CSR_VXSAT: + return VU.vxsat; + case CSR_VXRM: + return VU.vxrm; + case CSR_VL: + return VU.vl; + case CSR_VTYPE: + return VU.vtype; } throw trap_illegal_instruction(0); } diff --git a/riscv/riscv.mk.in b/riscv/riscv.mk.in index 9e2f914..4d538c8 100644 --- a/riscv/riscv.mk.in +++ b/riscv/riscv.mk.in @@ -291,6 +291,13 @@ riscv_insn_ext_q = \ fsqrt_q \ fsub_q \ +riscv_insn_ext_v_ctrl = \ + vsetvli \ + vsetvl \ + +riscv_insn_ext_v = \ + $(riscv_insn_ext_v_ctrl) \ + riscv_insn_priv = \ csrrc \ csrrci \ @@ -315,6 +322,7 @@ riscv_insn_list = \ $(riscv_insn_ext_f) \ $(riscv_insn_ext_d) \ $(riscv_insn_ext_q) \ + $(riscv_insn_ext_v) \ $(riscv_insn_priv) \ riscv_gen_srcs = \ |