Browse Source

Some bugfixes for CSR reading and setting FS for fflags updates (#43)

* 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.
pull/39/head
Andy Wright 10 years ago
committed by Andrew Waterman
parent
commit
8981e57162
  1. 5
      riscv/decode.h
  2. 7
      riscv/insns/csrrc.h
  3. 7
      riscv/insns/csrrci.h
  4. 7
      riscv/insns/csrrs.h
  5. 7
      riscv/insns/csrrsi.h

5
riscv/decode.h

@ -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))

7
riscv/insns/csrrc.h

@ -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));

7
riscv/insns/csrrci.h

@ -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));

7
riscv/insns/csrrs.h

@ -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));

7
riscv/insns/csrrsi.h

@ -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));

Loading…
Cancel
Save