Some bugfixes for CSR reading and setting FS for fflags updates (#43)
authorAndy Wright <acwright@mit.edu>
Sat, 21 May 2016 20:39:21 +0000 (16:39 -0400)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Sat, 21 May 2016 20:39:21 +0000 (13:39 -0700)
* csrrc[i] and csrrs[i] don't write CSRs if rs/zimm == 0

* Dirty fp state when setting new fp exceptions

* Set FS to dirty for all non-zero fflags writes.

riscv/decode.h
riscv/insns/csrrc.h
riscv/insns/csrrci.h
riscv/insns/csrrs.h
riscv/insns/csrrsi.h

index f4d6b6ccddb8737a40cbcf64ec8445e5b3a45c83..6e544319ebcd03585ac2a16188f6355c9ea183b2 100644 (file)
@@ -184,7 +184,10 @@ private:
 #define require_fp require((STATE.mstatus & MSTATUS_FS) != 0)
 #define require_accelerator require((STATE.mstatus & MSTATUS_XS) != 0)
 
-#define set_fp_exceptions ({ STATE.fflags |= softfloat_exceptionFlags; \
+#define set_fp_exceptions ({ if (softfloat_exceptionFlags) { \
+                               dirty_fp_state; \
+                               STATE.fflags |= softfloat_exceptionFlags; \
+                             } \
                              softfloat_exceptionFlags = 0; })
 
 #define sext32(x) ((sreg_t)(int32_t)(x))
index 74a687260cadd7a110810318996f2853ddb1aa7a..eae91fe661cdab82ec3eac33948fc35f3e4ab41a 100644 (file)
@@ -1,4 +1,7 @@
-int csr = validate_csr(insn.csr(), true);
+bool write = insn.rs1() != 0;
+int csr = validate_csr(insn.csr(), write);
 reg_t old = p->get_csr(csr);
-p->set_csr(csr, old & ~RS1);
+if (write) {
+  p->set_csr(csr, old & ~RS1);
+}
 WRITE_RD(sext_xlen(old));
index 993f2d832ba8f6c0b2f42ea0698289ed2d764187..986d6013aa858bfad336e5c5f71dbd586b26e347 100644 (file)
@@ -1,4 +1,7 @@
-int csr = validate_csr(insn.csr(), true);
+bool write = insn.rs1() != 0;
+int csr = validate_csr(insn.csr(), write);
 reg_t old = p->get_csr(csr);
-p->set_csr(csr, old & ~(reg_t)insn.rs1());
+if (write) {
+  p->set_csr(csr, old & ~(reg_t)insn.rs1());
+}
 WRITE_RD(sext_xlen(old));
index 72b49bbe9d7d645e1c15f596c6fc0b79ff9531f1..ec61b420a6b1c3420441f4c58226aefee9131acf 100644 (file)
@@ -1,4 +1,7 @@
-int csr = validate_csr(insn.csr(), insn.rs1() != 0);
+bool write = insn.rs1() != 0;
+int csr = validate_csr(insn.csr(), write);
 reg_t old = p->get_csr(csr);
-p->set_csr(csr, old | RS1);
+if (write) {
+  p->set_csr(csr, old | RS1);
+}
 WRITE_RD(sext_xlen(old));
index 90a44368b3344e67d13e36d1c3e8247cb204ea03..aa44dcca8543ac374400450e4cc4326fc24652bc 100644 (file)
@@ -1,4 +1,7 @@
-int csr = validate_csr(insn.csr(), true);
+bool write = insn.rs1() != 0;
+int csr = validate_csr(insn.csr(), write);
 reg_t old = p->get_csr(csr);
-p->set_csr(csr, old | insn.rs1());
+if (write) {
+  p->set_csr(csr, old | insn.rs1());
+}
 WRITE_RD(sext_xlen(old));