|  |  | @@ -30,7 +30,7 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
		
		
			
				
					
					|  |  |  |  *******************************************************************************/ |  |  |  |  *******************************************************************************/ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "../fp_functions.h" |  |  |  | #include <vm/fp_functions.h> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | #include <iss/arch/tgc_c.h> |  |  |  | #include <iss/arch/tgc_c.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/arch/riscv_hart_m_p.h> |  |  |  | #include <iss/arch/riscv_hart_m_p.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <iss/debugger/gdb_session.h> |  |  |  | #include <iss/debugger/gdb_session.h> | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -390,7 +390,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "lui"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "lui"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -412,7 +411,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#08x}", fmt::arg("mnemonic", "auipc"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#08x}", fmt::arg("mnemonic", "auipc"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -434,7 +432,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#0x}", fmt::arg("mnemonic", "jal"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#0x}", fmt::arg("mnemonic", "jal"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -464,7 +461,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm:#0x}", fmt::arg("mnemonic", "jalr"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm:#0x}", fmt::arg("mnemonic", "jalr"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -495,7 +491,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "beq"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "beq"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -524,7 +519,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bne"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bne"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -553,7 +547,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "blt"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "blt"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -582,7 +575,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bge"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bge"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -611,7 +603,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bltu"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bltu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -640,7 +631,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bgeu"), |  |  |  |                         "{mnemonic:10} {rs1}, {rs2}, {imm:#0x}", fmt::arg("mnemonic", "bgeu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -669,15 +659,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lb"), |  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lb"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            int8_t res = (int8_t)super::template read_mem<uint8_t>(traits::MEM, *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm)); |  |  |  |                     uint8_t read_res = super::template read_mem<uint8_t>(traits::MEM, *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_LB; |  |  |  |                     if(this->core.trap_state) goto TRAP_LB; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     int8_t res = (int8_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = res; |  |  |  |                         *(X+rd % traits::RFS) = res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -694,7 +684,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lh"), |  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lh"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -702,8 +691,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); |  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            int16_t res = (int16_t)super::template read_mem<uint16_t>(traits::MEM, load_address); |  |  |  |                     uint16_t read_res = super::template read_mem<uint16_t>(traits::MEM, load_address); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_LH; |  |  |  |                     if(this->core.trap_state) goto TRAP_LH; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     int16_t res = (int16_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = res; |  |  |  |                         *(X+rd % traits::RFS) = res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -720,7 +710,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lw"), |  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lw"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -728,8 +717,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); |  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            int32_t res = (int32_t)super::template read_mem<uint32_t>(traits::MEM, load_address); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::MEM, load_address); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_LW; |  |  |  |                     if(this->core.trap_state) goto TRAP_LW; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     int32_t res = (int32_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = (uint32_t)res; |  |  |  |                         *(X+rd % traits::RFS) = (uint32_t)res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -746,15 +736,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lbu"), |  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lbu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint8_t res = (uint8_t)super::template read_mem<uint8_t>(traits::MEM, *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm)); |  |  |  |                     uint8_t read_res = super::template read_mem<uint8_t>(traits::MEM, *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_LBU; |  |  |  |                     if(this->core.trap_state) goto TRAP_LBU; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint8_t res = (uint8_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = res; |  |  |  |                         *(X+rd % traits::RFS) = res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -771,7 +761,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lhu"), |  |  |  |                         "{mnemonic:10} {rd}, {imm}({rs1})", fmt::arg("mnemonic", "lhu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -779,8 +768,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); |  |  |  |                     uint32_t load_address = *(X+rs1 % traits::RFS) + (int16_t)sext<12>(imm); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint16_t res = (uint16_t)super::template read_mem<uint16_t>(traits::MEM, load_address); |  |  |  |                     uint16_t read_res = super::template read_mem<uint16_t>(traits::MEM, load_address); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_LHU; |  |  |  |                     if(this->core.trap_state) goto TRAP_LHU; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint16_t res = (uint16_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = res; |  |  |  |                         *(X+rd % traits::RFS) = res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -797,7 +787,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sb"), |  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sb"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -819,7 +808,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sh"), |  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sh"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -842,7 +830,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sw"), |  |  |  |                         "{mnemonic:10} {rs2}, {imm}({rs1})", fmt::arg("mnemonic", "sw"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("imm", imm), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -865,7 +852,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "addi"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "addi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -888,7 +874,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "slti"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "slti"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -911,7 +896,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "sltiu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "sltiu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -934,7 +918,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "xori"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "xori"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -957,7 +940,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "ori"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "ori"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -980,7 +962,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "andi"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {imm}", fmt::arg("mnemonic", "andi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1003,7 +984,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "slli"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "slli"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1031,7 +1011,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "srli"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "srli"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1059,7 +1038,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "srai"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {shamt}", fmt::arg("mnemonic", "srai"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("shamt", shamt)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1087,7 +1065,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "add"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "add"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1110,7 +1087,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sub"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sub"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1133,7 +1109,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sll"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sll"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1156,7 +1131,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "slt"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "slt"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1179,7 +1153,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sltu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sltu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1202,7 +1175,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "xor"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "xor"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1225,7 +1197,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "srl"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "srl"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1248,7 +1219,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sra"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "sra"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1271,7 +1241,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "or"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "or"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1294,7 +1263,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "and"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "and"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1319,7 +1287,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {pred}, {succ} ({fm} , {rs1}, {rd})", fmt::arg("mnemonic", "fence"), |  |  |  |                         "{mnemonic:10} {pred}, {succ} ({fm} , {rs1}, {rd})", fmt::arg("mnemonic", "fence"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("pred", pred), fmt::arg("succ", succ), fmt::arg("fm", fm), fmt::arg("rs1", name(rs1)), fmt::arg("rd", name(rd))); |  |  |  |                         fmt::arg("pred", pred), fmt::arg("succ", succ), fmt::arg("fm", fm), fmt::arg("rs1", name(rs1)), fmt::arg("rd", name(rd))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1334,7 +1301,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "ecall"); |  |  |  |                     this->core.disass_output(pc.val, "ecall"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1348,7 +1314,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "ebreak"); |  |  |  |                     this->core.disass_output(pc.val, "ebreak"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1362,7 +1327,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "uret"); |  |  |  |                     this->core.disass_output(pc.val, "uret"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1376,7 +1340,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "sret"); |  |  |  |                     this->core.disass_output(pc.val, "sret"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1390,7 +1353,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "mret"); |  |  |  |                     this->core.disass_output(pc.val, "mret"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1404,7 +1366,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "wfi"); |  |  |  |                     this->core.disass_output(pc.val, "wfi"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1418,7 +1379,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "dret"); |  |  |  |                     this->core.disass_output(pc.val, "dret"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers  |  |  |  |                 // used registers  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* PRIV = reinterpret_cast<uint8_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PRIV]); |  |  |  |                 auto* PRIV = reinterpret_cast<uint8_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PRIV]); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1449,7 +1409,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrw"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrw"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1458,8 +1417,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); |  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		                uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                         uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRW; |  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRW; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrs1); |  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrs1); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRW; |  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRW; | 
			
		
	
		
		
			
				
					
					|  |  |  |                         *(X+rd % traits::RFS) = xrd; |  |  |  |                         *(X+rd % traits::RFS) = xrd; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1481,15 +1441,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrs"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrs"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRS; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRS; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); |  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(rs1 != 0) { |  |  |  |                     if(rs1 != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd | xrs1); |  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd | xrs1); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1511,15 +1471,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrc"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {rs1}", fmt::arg("mnemonic", "csrrc"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRC; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRC; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); |  |  |  |                     uint32_t xrs1 = *(X+rs1 % traits::RFS); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(rs1 != 0) { |  |  |  |                     if(rs1 != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd & ~ xrs1); |  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd & ~ xrs1); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1541,15 +1501,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrwi"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrwi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRWI; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRWI; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     super::template write_mem<uint32_t>(traits::CSR, csr, (uint32_t)zimm); |  |  |  |                     super::template write_mem<uint32_t>(traits::CSR, csr, (uint32_t)zimm); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRWI; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRWI; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if((rd % traits::RFS) != 0) { |  |  |  |                     if((rd % traits::RFS) != 0) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1568,15 +1528,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrsi"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrsi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRSI; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRSI; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(zimm != 0) { |  |  |  |                     if(zimm != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd | (uint32_t)zimm); |  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd | (uint32_t)zimm); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRSI; |  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRSI; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1597,15 +1557,15 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrci"), |  |  |  |                         "{mnemonic:10} {rd}, {csr}, {zimm:#0x}", fmt::arg("mnemonic", "csrrci"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("csr", csr), fmt::arg("zimm", zimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            uint32_t xrd = super::template read_mem<uint32_t>(traits::CSR, csr); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::CSR, csr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRCI; |  |  |  |                     if(this->core.trap_state) goto TRAP_CSRRCI; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     uint32_t xrd = read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(zimm != 0) { |  |  |  |                     if(zimm != 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd & ~ ((uint32_t)zimm)); |  |  |  |                         super::template write_mem<uint32_t>(traits::CSR, csr, xrd & ~ ((uint32_t)zimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRCI; |  |  |  |                         if(this->core.trap_state) goto TRAP_CSRRCI; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1626,7 +1586,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {rd}, {imm}", fmt::arg("mnemonic", "fence_i"), |  |  |  |                         "{mnemonic:10} {rs1}, {rd}, {imm}", fmt::arg("mnemonic", "fence_i"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 4; |  |  |  |                 *NEXT_PC = *PC + 4; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1647,7 +1606,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mul"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mul"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1671,7 +1629,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulh"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulh"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1695,7 +1652,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulhsu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulhsu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1719,7 +1675,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulhu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "mulhu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1743,7 +1698,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "div"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "div"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1777,7 +1731,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "divu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "divu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1805,7 +1758,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "rem"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "rem"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1839,7 +1791,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "remu"), |  |  |  |                         "{mnemonic:10} {rd}, {rs1}, {rs2}", fmt::arg("mnemonic", "remu"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs1", name(rs1)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1866,7 +1817,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "caddi4spn"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "caddi4spn"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1892,7 +1842,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {uimm:#05x}({rs1})", fmt::arg("mnemonic", "clw"), |  |  |  |                         "{mnemonic:10} {rd}, {uimm:#05x}({rs1})", fmt::arg("mnemonic", "clw"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("uimm", uimm), fmt::arg("rs1", name(8+rs1))); |  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("uimm", uimm), fmt::arg("rs1", name(8+rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1900,8 +1849,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // execute instruction |  |  |  |                 // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     uint32_t load_address = *(X+rs1 + 8) + uimm; |  |  |  |                     uint32_t load_address = *(X+rs1 + 8) + uimm; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		            *(X+rd + 8) = (int32_t)super::template read_mem<uint32_t>(traits::MEM, load_address); |  |  |  |                     uint32_t read_res = super::template read_mem<uint32_t>(traits::MEM, load_address); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                     if(this->core.trap_state) goto TRAP_CLW; |  |  |  |                     if(this->core.trap_state) goto TRAP_CLW; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     *(X+rd + 8) = (int32_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 TRAP_CLW:break; |  |  |  |                 TRAP_CLW:break; | 
			
		
	
		
		
			
				
					
					|  |  |  |             }// @suppress("No break at end of case") |  |  |  |             }// @suppress("No break at end of case") | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1915,7 +1865,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs2}, {uimm:#05x}({rs1})", fmt::arg("mnemonic", "csw"), |  |  |  |                         "{mnemonic:10} {rs2}, {uimm:#05x}({rs1})", fmt::arg("mnemonic", "csw"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs2", name(8+rs2)), fmt::arg("uimm", uimm), fmt::arg("rs1", name(8+rs1))); |  |  |  |                         fmt::arg("rs2", name(8+rs2)), fmt::arg("uimm", uimm), fmt::arg("rs1", name(8+rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1937,7 +1886,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "caddi"), |  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "caddi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1953,7 +1901,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "cnop"); |  |  |  |                     this->core.disass_output(pc.val, "cnop"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1970,7 +1917,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {imm:#05x}", fmt::arg("mnemonic", "cjal"), |  |  |  |                         "{mnemonic:10} {imm:#05x}", fmt::arg("mnemonic", "cjal"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1992,7 +1938,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "cli"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "cli"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2014,7 +1959,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "clui"), |  |  |  |                         "{mnemonic:10} {rd}, {imm:#05x}", fmt::arg("mnemonic", "clui"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2038,7 +1982,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {nzimm:#05x}", fmt::arg("mnemonic", "caddi16sp"), |  |  |  |                         "{mnemonic:10} {nzimm:#05x}", fmt::arg("mnemonic", "caddi16sp"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("nzimm", nzimm)); |  |  |  |                         fmt::arg("nzimm", nzimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2059,7 +2002,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "__reserved_clui"); |  |  |  |                     this->core.disass_output(pc.val, "__reserved_clui"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2078,7 +2020,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {shamt}", fmt::arg("mnemonic", "csrli"), |  |  |  |                         "{mnemonic:10} {rs1}, {shamt}", fmt::arg("mnemonic", "csrli"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("shamt", shamt)); |  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("shamt", shamt)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2099,7 +2040,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {shamt}", fmt::arg("mnemonic", "csrai"), |  |  |  |                         "{mnemonic:10} {rs1}, {shamt}", fmt::arg("mnemonic", "csrai"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("shamt", shamt)); |  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("shamt", shamt)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2128,7 +2068,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "candi"), |  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "candi"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2149,7 +2088,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "csub"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "csub"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); |  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2170,7 +2108,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cxor"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cxor"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); |  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2191,7 +2128,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cor"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cor"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); |  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2212,7 +2148,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cand"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cand"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); |  |  |  |                         fmt::arg("rd", name(8+rd)), fmt::arg("rs2", name(8+rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2232,7 +2167,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {imm:#05x}", fmt::arg("mnemonic", "cj"), |  |  |  |                         "{mnemonic:10} {imm:#05x}", fmt::arg("mnemonic", "cj"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2252,7 +2186,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "cbeqz"), |  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "cbeqz"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2275,7 +2208,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "cbnez"), |  |  |  |                         "{mnemonic:10} {rs1}, {imm:#05x}", fmt::arg("mnemonic", "cbnez"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); |  |  |  |                         fmt::arg("rs1", name(8+rs1)), fmt::arg("imm", imm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2298,7 +2230,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}, {nzuimm}", fmt::arg("mnemonic", "cslli"), |  |  |  |                         "{mnemonic:10} {rs1}, {nzuimm}", fmt::arg("mnemonic", "cslli"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("nzuimm", nzuimm)); |  |  |  |                         fmt::arg("rs1", name(rs1)), fmt::arg("nzuimm", nzuimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2320,7 +2251,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, sp, {uimm:#05x}", fmt::arg("mnemonic", "clwsp"), |  |  |  |                         "{mnemonic:10} {rd}, sp, {uimm:#05x}", fmt::arg("mnemonic", "clwsp"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("uimm", uimm)); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("uimm", uimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2329,8 +2259,9 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 { |  |  |  |                 { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 if(rd) { |  |  |  |                                 if(rd) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                     uint32_t offs = *(X+2) + uimm; |  |  |  |                                     uint32_t offs = *(X+2) + uimm; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		                    	    *(X+rd % traits::RFS) = (int32_t)super::template read_mem<uint32_t>(traits::MEM, offs); |  |  |  |                                     uint32_t read_res = super::template read_mem<uint32_t>(traits::MEM, offs); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                                     if(this->core.trap_state) goto TRAP_CLWSP; |  |  |  |                                     if(this->core.trap_state) goto TRAP_CLWSP; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                     *(X+rd % traits::RFS) = (int32_t)read_res; | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 } |  |  |  |                                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 else { |  |  |  |                                 else { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                     raise(0, 2); |  |  |  |                                     raise(0, 2); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2347,7 +2278,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cmv"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cmv"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2368,7 +2298,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}", fmt::arg("mnemonic", "cjr"), |  |  |  |                         "{mnemonic:10} {rs1}", fmt::arg("mnemonic", "cjr"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2389,7 +2318,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "__reserved_cmv"); |  |  |  |                     this->core.disass_output(pc.val, "__reserved_cmv"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2408,7 +2336,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cadd"), |  |  |  |                         "{mnemonic:10} {rd}, {rs2}", fmt::arg("mnemonic", "cadd"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs2", name(rs2))); |  |  |  |                         fmt::arg("rd", name(rd)), fmt::arg("rs2", name(rs2))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2429,7 +2356,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs1}", fmt::arg("mnemonic", "cjalr"), |  |  |  |                         "{mnemonic:10} {rs1}", fmt::arg("mnemonic", "cjalr"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs1", name(rs1))); |  |  |  |                         fmt::arg("rs1", name(rs1))); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2447,7 +2373,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "cebreak"); |  |  |  |                     this->core.disass_output(pc.val, "cebreak"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2466,7 +2391,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                         "{mnemonic:10} {rs2}, {uimm:#05x}(sp)", fmt::arg("mnemonic", "cswsp"), |  |  |  |                         "{mnemonic:10} {rs2}, {uimm:#05x}(sp)", fmt::arg("mnemonic", "cswsp"), | 
			
		
	
		
		
			
				
					
					|  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("uimm", uimm)); |  |  |  |                         fmt::arg("rs2", name(rs2)), fmt::arg("uimm", uimm)); | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, mnemonic); |  |  |  |                     this->core.disass_output(pc.val, mnemonic); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers |  |  |  |                 // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value |  |  |  |                 auto* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2483,7 +2407,6 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(this->disass_enabled){ |  |  |  |                 if(this->disass_enabled){ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     /* generate console output when executing the command */ |  |  |  |                     /* generate console output when executing the command */ | 
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.disass_output(pc.val, "dii"); |  |  |  |                     this->core.disass_output(pc.val, "dii"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		             |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 // used registers// calculate next pc value |  |  |  |                 // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |                 *NEXT_PC = *PC + 2; |  |  |  |                 *NEXT_PC = *PC + 2; | 
			
		
	
	
		
		
			
				
					
					|  |  |   |