@@ -268,7 +268,7 @@ template <typename ARCH> class vm_impl : public iss::interp::vm_base<ARCH> {
268268 }
269269 else {
270270 uint64_t box = ~((uint64_t)0);
271- return (uint64_t)(((uint128_t)box<<32)|val);
271+ return (uint64_t)(((uint128_t)( box) <<32)|val);
272272 }
273273 }
274274
@@ -287,7 +287,7 @@ template <typename ARCH> class vm_impl : public iss::interp::vm_base<ARCH> {
287287 }
288288 else {
289289 uint64_t box = ~((uint64_t)0);
290- return (uint64_t)(((uint128_t)box<<64)|val);
290+ return (uint64_t)(((uint128_t)( box) <<64)|val);
291291 }
292292 }
293293
@@ -3780,7 +3780,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
37803780 *NEXT_PC = *PC + 2;
37813781 // execute instruction
37823782 {
3783- *(X+rs1 + 8) = *(X+rs1 + 8) >> shamt;
3783+ if(shamt) {
3784+ *(X+rs1 + 8) = *(X+rs1 + 8) >> shamt;
3785+ }
37843786 }
37853787 break;
37863788 }// @suppress("No break at end of case")
@@ -3977,13 +3979,13 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
39773979 break;
39783980 }// @suppress("No break at end of case")
39793981 case arch::traits<ARCH>::opcode_e::C__SLLI: {
3980- uint8_t nzuimm = ((bit_sub<2,5>(instr)));
3982+ uint8_t shamt = ((bit_sub<2,5>(instr)));
39813983 uint8_t rs1 = ((bit_sub<7,5>(instr)));
39823984 if(this->disass_enabled){
39833985 /* generate console output when executing the command */
39843986 auto mnemonic = fmt::format(
3985- "{mnemonic:10} {rs1}, {nzuimm }", fmt::arg("mnemonic", "c.slli"),
3986- fmt::arg("rs1", name(rs1)), fmt::arg("nzuimm ", nzuimm ));
3987+ "{mnemonic:10} {rs1}, {shamt }", fmt::arg("mnemonic", "c.slli"),
3988+ fmt::arg("rs1", name(rs1)), fmt::arg("shamt ", shamt ));
39873989 this->core.disass_output(pc.val, mnemonic);
39883990 }
39893991 // used registers
@@ -3997,7 +3999,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
39973999 }
39984000 else {
39994001 if(rs1 != 0) {
4000- *(X+rs1) = *(X+rs1) << nzuimm ;
4002+ *(X+rs1) = *(X+rs1) << shamt ;
40014003 }
40024004 }
40034005 }
@@ -4692,7 +4694,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
46924694 *NEXT_PC = *PC + 4;
46934695 // execute instruction
46944696 {
4695- *(F+rd) = NaNBox32(((uint32_t)bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2)))<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1))));
4697+ *(F+rd) = NaNBox32(((uint32_t)( bit_sub<31, 31-31+1>(unbox_s(traits::FLEN, *(F+rs2) )))<<31)|bit_sub<0, 30-0+1>(unbox_s(traits::FLEN, *(F+rs1))));
46964698 }
46974699 break;
46984700 }// @suppress("No break at end of case")
@@ -4713,7 +4715,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
47134715 *NEXT_PC = *PC + 4;
47144716 // execute instruction
47154717 {
4716- *(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))));
4718+ *(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))));
47174719 }
47184720 break;
47194721 }// @suppress("No break at end of case")
@@ -5295,8 +5297,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
52955297 *NEXT_PC = *PC + 4;
52965298 // execute instruction
52975299 {
5298- uint64_t res = NaNBox64(fmadd_d(unbox_d(traits::FLEN, *(F+rs1)), unbox_d(traits::FLEN, *(F+rs2)), unbox_d(traits::FLEN, *(F+rs3)), 1, get_rm(rm)));
5299- *(F+rd) = res;
5300+ *(F+rd) = NaNBox64(fmadd_d(unbox_d(traits::FLEN, *(F+rs1)), unbox_d(traits::FLEN, *(F+rs2)), unbox_d(traits::FLEN, *(F+rs3)), 1, get_rm(rm)));
53005301 uint32_t flags = fget_flags();
53015302 *FCSR = (*FCSR & ~traits::FFLAG_MASK) | (flags & traits::FFLAG_MASK);
53025303 }
@@ -5516,12 +5517,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
55165517 this->core.disass_output(pc.val, mnemonic);
55175518 }
55185519 // used registers
5519- auto* F = reinterpret_cast<uint64_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::F0]);
5520+ auto* F = reinterpret_cast<uint64_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::F0]);
5521+ auto* FCSR = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::FCSR]);
55205522 // calculate next pc value
55215523 *NEXT_PC = *PC + 4;
55225524 // execute instruction
55235525 {
55245526 *(F+rd) = NaNBox64(f32tof64(unbox_s(traits::FLEN, *(F+rs1)), get_rm(rm)));
5527+ uint32_t flags = fget_flags();
5528+ *FCSR = (*FCSR & ~traits::FFLAG_MASK) | (flags & traits::FFLAG_MASK);
55255529 }
55265530 break;
55275531 }// @suppress("No break at end of case")
@@ -5542,7 +5546,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
55425546 *NEXT_PC = *PC + 4;
55435547 // execute instruction
55445548 {
5545- *(F+rd) = NaNBox64(((uint64_t)bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2)))<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1))));
5549+ *(F+rd) = NaNBox64(((uint64_t)( bit_sub<63, 63-63+1>(unbox_d(traits::FLEN, *(F+rs2) )))<<63)|bit_sub<0, 62-0+1>(unbox_d(traits::FLEN, *(F+rs1))));
55465550 }
55475551 break;
55485552 }// @suppress("No break at end of case")
@@ -5563,7 +5567,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
55635567 *NEXT_PC = *PC + 4;
55645568 // execute instruction
55655569 {
5566- *(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))));
5570+ *(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))));
55675571 }
55685572 break;
55695573 }// @suppress("No break at end of case")
@@ -5829,7 +5833,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
58295833 *NEXT_PC = *PC + 4;
58305834 // execute instruction
58315835 {
5832- super::template write_mem<uint32_t>(traits::FENCE, traits::fencevma, ((uint16_t)(uint8_t)rs1<<8)|(uint8_t)asid);
5836+ super::template write_mem<uint32_t>(traits::FENCE, traits::fencevma, ((uint16_t)(( uint8_t)rs1) <<8)|(uint8_t)asid);
58335837 if(this->core.reg.trap_state>=0x80000000UL) throw memory_access_exception();
58345838 }
58355839 break;
@@ -5880,7 +5884,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
58805884 uint8_t orig_ratio = (uint8_t)(get_sew_pow() - get_lmul_pow());
58815885 uint32_t orig_vstart = *vstart;
58825886 *vstart = 0;
5883- *vtype = (uint32_t)((ma <<7)|(ta <<6)|(sew<<3)|lmul);
5887+ *vtype = (uint32_t)(((ma) <<7)|((ta) <<6)|(( sew) <<3)|lmul);
58845888 if(! valid_sew_lmul()) {
58855889 handle_illegal_vtype();
58865890 *vstart = orig_vstart;
@@ -5939,7 +5943,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
59395943 raise(0, traits::RV_CAUSE_ILLEGAL_INSTRUCTION);
59405944 }
59415945 else {
5942- *vtype = (uint32_t)((ma <<7)|(ta <<6)|(sew<<3)|lmul);
5946+ *vtype = (uint32_t)(((ma) <<7)|((ta) <<6)|(( sew) <<3)|lmul);
59435947 if(! valid_sew_lmul()) {
59445948 handle_illegal_vtype();
59455949 }
@@ -12574,7 +12578,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
1257412578 if(illegal_vd_unmasked()) {
1257512579 raise(0, traits::RV_CAUSE_ILLEGAL_INSTRUCTION);
1257612580 }
12577- uint32_t _vtype = (bit_sub<uint32_t>(*vtype, 7, (uint64_t)(traits::XLEN) - (uint64_t)(1)-7+1)<<7)|((uint32_t)1 <<6)|((uint32_t)0 <<3)|bit_sub<0, 2-0+1>(*vtype);
12581+ uint32_t _vtype = (( bit_sub<uint32_t>(*vtype, 7, (uint64_t)(traits::XLEN) - (uint64_t)(1)-7+1)) <<7)|((uint32_t)(1) <<6)|((uint32_t)(0) <<3)|bit_sub<0, 2-0+1>(*vtype);
1257812582 *vstart = (uint32_t)vsseg(this->get_arch(), (uint8_t*)V, evl, *vstart, _vtype, 1, vs3, *(X+rs1), 0, 1);
1257912583 }
1258012584 }
@@ -12608,7 +12612,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
1260812612 if(illegal_vd_unmasked()) {
1260912613 raise(0, traits::RV_CAUSE_ILLEGAL_INSTRUCTION);
1261012614 }
12611- uint32_t _vtype = (bit_sub<uint32_t>(*vtype, 7, (uint64_t)(traits::XLEN) - (uint64_t)(1)-7+1)<<7)|((uint32_t)1 <<6)|((uint32_t)0 <<3)|bit_sub<0, 2-0+1>(*vtype);
12615+ uint32_t _vtype = (( bit_sub<uint32_t>(*vtype, 7, (uint64_t)(traits::XLEN) - (uint64_t)(1)-7+1)) <<7)|((uint32_t)(1) <<6)|((uint32_t)(0) <<3)|bit_sub<0, 2-0+1>(*vtype);
1261212616 *vstart = (uint32_t)vlseg(this->get_arch(), (uint8_t*)V, evl, *vstart, _vtype, 1, vd, *(X+rs1), 0, 1);
1261312617 }
1261412618 }
0 commit comments