modify csrrwi and csrrw back to original, change old val inside set_csr
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 13 Nov 2018 15:57:59 +0000 (15:57 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 13 Nov 2018 15:57:59 +0000 (15:57 +0000)
riscv/insns/csrrw.h
riscv/insns/csrrwi.h
riscv/processor.cc

index f7876bc8532b19e82cb4d5e389700a37ef5d8104..b5aac4a1f59d8d9a90c21d8905949cf490dfe73d 100644 (file)
@@ -1,18 +1,4 @@
 int csr = validate_csr(insn.csr(), true);
-#ifdef SPIKE_SIMPLEV
-reg_t old = 0; // stop compiler bitchin
-if (csr != CSR_USVVL && csr != CSR_USVMVL)
-{
-    old = p->get_csr(csr);
-}
-p->set_csr(csr, RS1);
-if (csr == CSR_USVVL || csr == CSR_USVMVL)
-{
-    old = p->get_csr(csr);
-}
-#else
-reg_t old = p->get_csr(csr);
-p->set_csr(csr, RS1);
-#endif
+reg_t old = p->set_csr(csr, RS1);
 WRITE_RD(sext_xlen(sv_reg_t(old)));
 serialize();
index 1fe1945eea87ec88c4d6640d7772f07aa56c0cb6..0daf68b23049d554e50d239878f3afde62bb1440 100644 (file)
@@ -1,21 +1,6 @@
 fprintf(stderr, "csrrwi %lx\n", insn.csr());
 int csr = validate_csr(insn.csr(), true);
 fprintf(stderr, "validated %x\n", csr);
-#ifdef SPIKE_SIMPLEV
-reg_t old = 0; // stop compiler bitchin
-if (csr != CSR_USVVL && csr != CSR_USVMVL)
-{
-    old = p->get_csr(csr);
-    p->set_csr(csr, insn.insn_t::rs1());
-}
-else
-if (csr == CSR_USVVL || csr == CSR_USVMVL)
-{
-    p->set_csr(csr, insn.insn_t::rs1()+1); // must add one here
-    old = p->get_csr(csr);
-}
-#else
 reg_t old = p->set_csr(csr, insn.insn_t::rs1());
-#endif
 WRITE_RD(sext_xlen(sv_reg_t(old)));
 serialize();
index bfc5259120c971672a771254afc0c508a72ed34c..b3ea542dbf17cf82fc7f22df39675dad3715dbb7 100644 (file)
@@ -497,7 +497,8 @@ reg_t processor_t::set_csr(int which, reg_t val, bool csrrwi)
   {
 #ifdef SPIKE_SIMPLEV
     case CSR_USVMVL:
-      state.sv().mvl = std::min(val, (uint64_t)64); // limited to XLEN width
+      state.sv().mvl = std::min(val+1, (uint64_t)64); // limited to XLEN width
+      old_val = state.sv().mvl - 1;
       // TODO XXX throw exception if val == 0
       fprintf(stderr, "set MVL %lx\n", state.sv().mvl);
       break;
@@ -532,7 +533,8 @@ reg_t processor_t::set_csr(int which, reg_t val, bool csrrwi)
       break;
     }
     case CSR_USVVL:
-      state.sv().vl = std::min(state.sv().mvl, val);
+      state.sv().vl = std::min(state.sv().mvl, val + 1);
+      old_val = state.sv().mvl - 1;
       // TODO XXX throw exception if val == 0
       fprintf(stderr, "set VL %lx\n", state.sv().vl);
       break;