diff --git a/src/iss/arch/riscv_hart_common.h b/src/iss/arch/riscv_hart_common.h index d336136..56f6780 100644 --- a/src/iss/arch/riscv_hart_common.h +++ b/src/iss/arch/riscv_hart_common.h @@ -487,16 +487,20 @@ template struct riscv_hart_common : public BAS csr_rd_cb[mcycle] = MK_CSR_RD_CB(read_cycle); csr_wr_cb[mcycle] = MK_CSR_WR_CB(write_cycle); - if(traits::XLEN == 32) + if(traits::XLEN == 32) { csr_rd_cb[mcycleh] = MK_CSR_RD_CB(read_cycle); - if(traits::XLEN == 32) csr_wr_cb[mcycleh] = MK_CSR_WR_CB(write_cycle); + } csr_rd_cb[minstret] = MK_CSR_RD_CB(read_instret); csr_wr_cb[minstret] = MK_CSR_WR_CB(write_instret); - if(traits::XLEN == 32) + if(traits::XLEN == 32) { csr_rd_cb[minstreth] = MK_CSR_RD_CB(read_instret); - if(traits::XLEN == 32) csr_wr_cb[minstreth] = MK_CSR_WR_CB(write_instret); + } + if(traits::XLEN == 32) { + csr_rd_cb[mstatush] = MK_CSR_RD_CB(read_null); + csr_wr_cb[mstatush] = MK_CSR_WR_CB(write_null); + } csr_rd_cb[mhartid] = MK_CSR_RD_CB(read_hartid); }; diff --git a/src/iss/arch/riscv_hart_m_p.h b/src/iss/arch/riscv_hart_m_p.h index bb7fb09..6b9e540 100644 --- a/src/iss/arch/riscv_hart_m_p.h +++ b/src/iss/arch/riscv_hart_m_p.h @@ -409,6 +409,8 @@ template uint64_t riscv_hart_m_p::e case traits::RV_CAUSE_ILLEGAL_INSTRUCTION: #ifdef MTVAL_ILLEGAL_INFORMATIVE this->csr[mtval] = (!this->has_compressed() || (tval & 0x3) == 3) ? tval : tval & 0xffff; +#else + this->csr[mtval] = 0; #endif break; case traits::RV_CAUSE_BREAKPOINT: diff --git a/src/iss/arch/riscv_hart_msu_vp.h b/src/iss/arch/riscv_hart_msu_vp.h index 58948ac..0765a7f 100644 --- a/src/iss/arch/riscv_hart_msu_vp.h +++ b/src/iss/arch/riscv_hart_msu_vp.h @@ -631,6 +631,8 @@ template uint64_t riscv_hart_msu_vp case traits::RV_CAUSE_ILLEGAL_INSTRUCTION: #ifdef MTVAL_ILLEGAL_INFORMATIVE this->csr[utval | (new_priv << 8)] = (!this->has_compressed() || (tval & 0x3) == 3) ? tval : tval & 0xffff; +#else + this->csr[utval | (new_priv << 8)] = 0; #endif break; case traits::RV_CAUSE_BREAKPOINT: diff --git a/src/iss/arch/riscv_hart_mu_p.h b/src/iss/arch/riscv_hart_mu_p.h index 9c83dca..2340b78 100644 --- a/src/iss/arch/riscv_hart_mu_p.h +++ b/src/iss/arch/riscv_hart_mu_p.h @@ -506,6 +506,8 @@ template uint64_t riscv_hart_mu_p:: case traits::RV_CAUSE_ILLEGAL_INSTRUCTION: #ifdef MTVAL_ILLEGAL_INFORMATIVE this->csr[utval | (new_priv << 8)] = (!this->has_compressed() || (tval & 0x3) == 3) ? tval : tval & 0xffff; +#else + this->csr[utval | (new_priv << 8)] = 0; #endif break; case traits::RV_CAUSE_BREAKPOINT: diff --git a/src/vm/interp/vm_rv32gc.cpp b/src/vm/interp/vm_rv32gc.cpp index f8bdf17..fcafda5 100644 --- a/src/vm/interp/vm_rv32gc.cpp +++ b/src/vm/interp/vm_rv32gc.cpp @@ -3742,7 +3742,7 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co *NEXT_PC = *PC + 4; // execute instruction { - *(F+rd) = NaNBox32(((uint32_t)(~bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1)<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1)))); + *(F+rd) = NaNBox32((((uint32_t)(~bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1))<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1)))); } break; }// @suppress("No break at end of case") @@ -4546,11 +4546,14 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co } // used registers auto* F = reinterpret_cast(this->regs_base_ptr+arch::traits::reg_byte_offsets[arch::traits::F0]); + auto* FCSR = reinterpret_cast(this->regs_base_ptr+arch::traits::reg_byte_offsets[arch::traits::FCSR]); // calculate next pc value *NEXT_PC = *PC + 4; // execute instruction { *(F+rd) = NaNBox64(f32tof64(unbox_s(traits::FLEN, *(F+rs1)), get_rm(rm))); + uint32_t flags = fget_flags(); + *FCSR = (*FCSR & ~traits::FFLAG_MASK) | (flags & traits::FFLAG_MASK); } break; }// @suppress("No break at end of case") @@ -4592,7 +4595,7 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co *NEXT_PC = *PC + 4; // execute instruction { - *(F+rd) = NaNBox64(((uint64_t)(~bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1)<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1)))); + *(F+rd) = NaNBox64((((uint64_t)(~bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1))<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1)))); } break; }// @suppress("No break at end of case") diff --git a/src/vm/interp/vm_rv64gc.cpp b/src/vm/interp/vm_rv64gc.cpp index ad66735..d6aa745 100644 --- a/src/vm/interp/vm_rv64gc.cpp +++ b/src/vm/interp/vm_rv64gc.cpp @@ -5003,7 +5003,7 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co *NEXT_PC = *PC + 4; // execute instruction { - *(F+rd) = NaNBox32(((uint32_t)(~bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1)<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1)))); + *(F+rd) = NaNBox32((((uint32_t)(~bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1))<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1)))); } break; }// @suppress("No break at end of case") @@ -5835,11 +5835,14 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co } // used registers auto* F = reinterpret_cast(this->regs_base_ptr+arch::traits::reg_byte_offsets[arch::traits::F0]); + auto* FCSR = reinterpret_cast(this->regs_base_ptr+arch::traits::reg_byte_offsets[arch::traits::FCSR]); // calculate next pc value *NEXT_PC = *PC + 4; // execute instruction { *(F+rd) = NaNBox64(f32tof64(unbox_s(traits::FLEN, *(F+rs1)), get_rm(rm))); + uint32_t flags = fget_flags(); + *FCSR = (*FCSR & ~traits::FFLAG_MASK) | (flags & traits::FFLAG_MASK); } break; }// @suppress("No break at end of case") @@ -5881,7 +5884,7 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co *NEXT_PC = *PC + 4; // execute instruction { - *(F+rd) = NaNBox64(((uint64_t)(~bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1)<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1)))); + *(F+rd) = NaNBox64((((uint64_t)(~bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2))))& ((1ULL << 1)-1))<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1)))); } break; }// @suppress("No break at end of case")