whoops dont need separate SVSETVL/SVGETVL CSRs
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 29 Sep 2018 02:14:15 +0000 (03:14 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 29 Sep 2018 02:14:15 +0000 (03:14 +0100)
also add SVREALVL which is needed for state context save/restore

riscv/encoding.h
riscv/insns/csrrw.h
riscv/processor.cc

index 02b22a5b2c9081229f2839c33c4508d8ae2c042a..f06e785e55e38f60262c3dac17cb387d3d229bc0 100644 (file)
 #define CSR_MHPMEVENT29 0x33d
 #define CSR_MHPMEVENT30 0x33e
 #define CSR_MHPMEVENT31 0x33f
-#define CSR_SVGETVL 0xcf0
-#define CSR_SVSETVL 0xcf1
-#define CSR_SVGETMVL 0xcf2
-#define CSR_SVSETMVL 0xcf3
+#define CSR_SVVL 0xcf0
+#define CSR_SVREALVL 0xcf1
+#define CSR_SVMVL 0xcf2
 #define CSR_MVENDORID 0xf11
 #define CSR_MARCHID 0xf12
 #define CSR_MIMPID 0xf13
@@ -1244,10 +1243,9 @@ DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1)
 DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2)
 #endif
 #ifdef DECLARE_CSR
-DECLARE_CSR(svsetvl, CSR_SVSETVL)
-DECLARE_CSR(svgetvl, CSR_SVGETVL)
-DECLARE_CSR(svsetmvl, CSR_SVSETMVL)
-DECLARE_CSR(svgetmvl, CSR_SVGETMVL)
+DECLARE_CSR(svvl, CSR_SVVL)
+DECLARE_CSR(svrealvl, CSR_SVREALVL)
+DECLARE_CSR(svmvl, CSR_SVMVL)
 DECLARE_CSR(fflags, CSR_FFLAGS)
 DECLARE_CSR(frm, CSR_FRM)
 DECLARE_CSR(fcsr, CSR_FCSR)
index b7911f566cee3b2965ec1234c9e50491b358a45b..3d83b09ab4a49004601ded2b18c192beb01ce8e8 100644 (file)
@@ -1,12 +1,12 @@
 int csr = validate_csr(insn.csr(), true);
 #ifdef SPIKE_SIMPLEV
 reg_t old;
-if (csr != CSR_SVSETVL)
+if (csr != CSR_SVVL)
 {
     old = p->get_csr(csr);
 }
 p->set_csr(csr, RS1);
-if (csr == CSR_SVSETVL)
+if (csr == CSR_SVVL)
 {
     old = p->get_csr(csr);
 }
index 603aaf68809b085cd0ff651a1a2a2f421286d195..83c6439dd70d188348b4b5d5dd77123e1af00c79 100644 (file)
@@ -336,10 +336,13 @@ void processor_t::set_csr(int which, reg_t val)
   switch (which)
   {
 #ifdef SPIKE_SIMPLEV
-    case CSR_SVSETMVL:
+    case CSR_SVMVL:
       state.mvl = std::min(val, (uint64_t)63); // limited to XLEN width
       break;
-    case CSR_SVSETVL:
+    case CSR_SVREALVL:
+      state.vl = std::min(val, state.mvl); // limited to MVL
+      break;
+    case CSR_SVVL:
       state.vl = std::min(state.mvl, state.XPR[val]);
       state.XPR.write(val, state.vl);
       break;
@@ -568,9 +571,10 @@ reg_t processor_t::get_csr(int which)
   switch (which)
   {
 #ifdef SPIKE_SIMPLEV
-    case CSR_SVGETVL:
+    case CSR_SVVL:
+    case CSR_SVREALVL:
       return state.vl;
-    case CSR_SVGETMVL:
+    case CSR_SVMVL:
       return state.mvl;
 #endif
     case CSR_FFLAGS: