|  |  | @@ -379,9 +379,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd != 0) *(X+rd) = (int32_t)imm;  |  |  |  |         if(rd != 0) *(X+rd) = (int32_t)imm;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -411,9 +412,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd != 0) *(X+rd) = *PC + (int32_t)imm;  |  |  |  |         if(rd != 0) *(X+rd) = *PC + (int32_t)imm;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -443,9 +445,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -479,9 +482,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -516,9 +520,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+rs1) == *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if(*(X+rs1) == *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -549,9 +554,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+rs1) != *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if(*(X+rs1) != *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -582,9 +588,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if((int32_t)*(X+rs1) < (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if((int32_t)*(X+rs1) < (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -615,9 +622,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if((int32_t)*(X+rs1) >= (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if((int32_t)*(X+rs1) >= (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -648,9 +656,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+rs1) < *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if(*(X+rs1) < *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -681,9 +690,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+rs1) >= *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |  |  |  |         if(*(X+rs1) >= *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -714,9 +724,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -750,9 +761,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -790,9 +802,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -830,9 +843,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -866,9 +880,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -906,9 +921,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         writeSpace1(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm), (int8_t)*(X+rs2)); |  |  |  |         writeSpace1(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm), (int8_t)*(X+rs2)); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -939,9 +955,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -976,9 +993,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1013,9 +1031,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) + (int16_t)sext<12>(imm);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) + (int16_t)sext<12>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1046,9 +1065,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) < (int16_t)sext<12>(imm)?  1 :  0;  |  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) < (int16_t)sext<12>(imm)?  1 :  0;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1079,9 +1099,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) < (int16_t)sext<12>(imm)?  1 :  0;  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) < (int16_t)sext<12>(imm)?  1 :  0;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1112,9 +1133,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ (int16_t)sext<12>(imm);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ (int16_t)sext<12>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1145,9 +1167,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) | (int16_t)sext<12>(imm);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) | (int16_t)sext<12>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1178,9 +1201,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) & (int16_t)sext<12>(imm);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) & (int16_t)sext<12>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1211,9 +1235,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(shamt >  31) { |  |  |  |         if(shamt >  31) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1249,9 +1274,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(shamt >  31) { |  |  |  |         if(shamt >  31) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1287,9 +1313,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(shamt >  31) { |  |  |  |         if(shamt >  31) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1325,9 +1352,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) + *(X+rs2);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) + *(X+rs2);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1358,9 +1386,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) - *(X+rs2);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) - *(X+rs2);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1391,9 +1420,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) << (*(X+rs2) & (traits::XLEN - 1));  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) << (*(X+rs2) & (traits::XLEN - 1));  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1424,9 +1454,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) < (int32_t)*(X+rs2)?  1 :  0;  |  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) < (int32_t)*(X+rs2)?  1 :  0;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1457,9 +1488,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = (uint32_t)*(X+rs1) < (uint32_t)*(X+rs2)?  1 :  0;  |  |  |  |         if(rd !=  0) *(X+rd) = (uint32_t)*(X+rs1) < (uint32_t)*(X+rs2)?  1 :  0;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1490,9 +1522,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ *(X+rs2);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ *(X+rs2);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1523,9 +1556,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1556,9 +1590,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  |  |  |  |         if(rd !=  0) *(X+rd) = (int32_t)*(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1589,9 +1624,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) | *(X+rs2);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) | *(X+rs2);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1622,9 +1658,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) & *(X+rs2);  |  |  |  |         if(rd !=  0) *(X+rd) = *(X+rs1) & *(X+rs2);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1656,9 +1693,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         writeSpace1(traits::FENCE, traits::fence, pred << 4 | succ); |  |  |  |         writeSpace1(traits::FENCE, traits::fence, pred << 4 | succ); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1689,9 +1726,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         writeSpace2(traits::FENCE, traits::fencei, imm); |  |  |  |         writeSpace2(traits::FENCE, traits::fencei, imm); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1716,9 +1753,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         raise(0,  11); |  |  |  |         raise(0,  11); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1743,9 +1780,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         raise(0,  3); |  |  |  |         raise(0,  3); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1770,9 +1807,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         leave(0); |  |  |  |         leave(0); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1797,9 +1834,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         leave(1); |  |  |  |         leave(1); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1824,9 +1861,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         leave(3); |  |  |  |         leave(3); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1851,9 +1888,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         wait(1); |  |  |  |         wait(1); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1883,9 +1920,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 4; |  |  |  |         *NEXT_PC = *PC + 4; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1919,9 +1956,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1962,9 +2000,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2000,9 +2039,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2038,9 +2078,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2074,9 +2115,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2111,9 +2153,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2148,9 +2191,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2186,9 +2230,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2224,9 +2269,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2262,9 +2308,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2300,9 +2347,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2342,9 +2390,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2380,9 +2429,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2422,9 +2472,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2459,9 +2510,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2495,9 +2547,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2532,9 +2585,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2568,9 +2622,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         *(X+rs1) = *(X+rs1) + (int8_t)sext<6>(imm); |  |  |  |         *(X+rs1) = *(X+rs1) + (int8_t)sext<6>(imm); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2596,9 +2651,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2628,9 +2683,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2663,9 +2719,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2697,9 +2754,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2732,9 +2790,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(nzimm) *(X+2) = *(X+2) + (int16_t)sext<10>(nzimm);  |  |  |  |         if(nzimm) *(X+2) = *(X+2) + (int16_t)sext<10>(nzimm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2765,9 +2824,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2800,9 +2860,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(shamt) { |  |  |  |         if(shamt) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2839,9 +2900,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2874,9 +2936,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2909,9 +2972,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2944,9 +3008,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -2979,9 +3044,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3013,9 +3079,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         pc_assign(*NEXT_PC) = *PC + (int16_t)sext<12>(imm); |  |  |  |         pc_assign(*NEXT_PC) = *PC + (int16_t)sext<12>(imm); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3045,9 +3111,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+(rs1 + 8)) == 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);  |  |  |  |         if(*(X+(rs1 + 8)) == 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3077,9 +3144,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(*(X+(rs1 + 8)) != 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);  |  |  |  |         if(*(X+(rs1 + 8)) != 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3109,9 +3177,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(nzuimm) *(X+rs1) = *(X+rs1) << nzuimm;  |  |  |  |         if(nzuimm) *(X+rs1) = *(X+rs1) << nzuimm;  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3141,9 +3210,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rd) { |  |  |  |         if(rd) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3177,9 +3247,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         *(X+rd) = *(X+rs2); |  |  |  |         *(X+rd) = *(X+rs2); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3208,9 +3279,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(rs1) pc_assign(*NEXT_PC) = *(X+rs1);  |  |  |  |         if(rs1) pc_assign(*NEXT_PC) = *(X+rs1);  | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3241,9 +3313,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         *(X+rd) = *(X+rd) + *(X+rs2); |  |  |  |         *(X+rd) = *(X+rd) + *(X+rs2); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3272,9 +3345,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3302,9 +3376,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         raise(0,  3); |  |  |  |         raise(0,  3); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3334,9 +3408,10 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         uint32_t* 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 + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3364,9 +3439,9 @@ private: | 
			
		
	
		
		
			
				
					
					|  |  |  |              |  |  |  |              | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         // prepare execution |  |  |  |         // prepare execution | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); |  |  |  |         uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); |  |  |  |         uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // used registers// calculate next pc value | 
			
		
	
		
		
			
				
					
					|  |  |  |         *NEXT_PC = *PC + 2; |  |  |  |         *NEXT_PC = *PC + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |         // execute instruction |  |  |  |         // execute instruction | 
			
		
	
		
		
			
				
					
					|  |  |  |         raise(0,  2); |  |  |  |         raise(0,  2); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3435,6 +3510,9 @@ vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | inline bool is_count_limit_enabled(finish_cond_e cond){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     return (cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | template <typename ARCH> |  |  |  | template <typename ARCH> | 
			
		
	
		
		
			
				
					
					|  |  |  | typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){ |  |  |  | typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){ | 
			
		
	
		
		
			
				
					
					|  |  |  |     // we fetch at max 4 byte, alignment is 2 |  |  |  |     // we fetch at max 4 byte, alignment is 2 | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -3443,8 +3521,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | 
			
		
	
		
		
			
				
					
					|  |  |  |     auto *const data = (uint8_t *)&insn; |  |  |  |     auto *const data = (uint8_t *)&insn; | 
			
		
	
		
		
			
				
					
					|  |  |  |     auto pc=start; |  |  |  |     auto pc=start; | 
			
		
	
		
		
			
				
					
					|  |  |  |     while(!this->core.should_stop() && |  |  |  |     while(!this->core.should_stop() && | 
			
		
	
		
		
			
				
					
					|  |  |  |             !((cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT && |  |  |  |             !(is_count_limit_enabled(cond) && this->core.get_icount() >= icount_limit)){ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     this->core.get_icount() < icount_limit)){ |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         auto res = fetch_ins(pc, data); |  |  |  |         auto res = fetch_ins(pc, data); | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(res!=iss::Ok){ |  |  |  |         if(res!=iss::Ok){ | 
			
		
	
		
		
			
				
					
					|  |  |  |             auto new_pc = super::core.enter_trap(TRAP_ID, pc.val); |  |  |  |             auto new_pc = super::core.enter_trap(TRAP_ID, pc.val); | 
			
		
	
	
		
		
			
				
					
					|  |  |   |