Compare commits
	
		
			6 Commits
		
	
	
		
			msvc_compa
			...
			438e598a4a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 438e598a4a | |||
| 174259155d | |||
| ba9339a50d | |||
| 65b4db5eca | |||
| 0fd82f1f3c | |||
| a3084456fd | 
 Submodule gen_input/CoreDSL-Instruction-Set-Description updated: 8d9a0fb149...89dabd00e3
									
								
							
							
								
								
									
										13
									
								
								gen_input/TGC_B.core_desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								gen_input/TGC_B.core_desc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | import "CoreDSL-Instruction-Set-Description/RV32I.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVM.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVC.core_desc" | ||||||
|  |  | ||||||
|  | Core TGC_B provides RV32I { | ||||||
|  | 	architectural_state { | ||||||
|  |         XLEN=32; | ||||||
|  |         // definitions for the architecture wrapper | ||||||
|  |         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA | ||||||
|  |         unsigned MISA_VAL = 0b01000000000000000000000100000000; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								gen_input/TGC_C.core_desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								gen_input/TGC_C.core_desc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | import "CoreDSL-Instruction-Set-Description/RV32I.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVM.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVC.core_desc" | ||||||
|  |  | ||||||
|  | Core TGC_C provides RV32I, RV32M, RV32IC { | ||||||
|  |     architectural_state { | ||||||
|  |         XLEN=32; | ||||||
|  |         // definitions for the architecture wrapper | ||||||
|  |         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA | ||||||
|  |         unsigned MISA_VAL = 0b01000000000000000001000100000100; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								gen_input/TGC_D.core_desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								gen_input/TGC_D.core_desc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | import "CoreDSL-Instruction-Set-Description/RV32I.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVM.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVC.core_desc" | ||||||
|  |  | ||||||
|  | Core TGC_D provides RV32I, RV32M, RV32IC { | ||||||
|  |     architectural_state { | ||||||
|  |         XLEN=32; | ||||||
|  |         // definitions for the architecture wrapper | ||||||
|  |         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA | ||||||
|  |         unsigned MISA_VAL = 0b01000000000000000001000100000100; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										72
									
								
								gen_input/TGC_D_XRB_MAC.core_desc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								gen_input/TGC_D_XRB_MAC.core_desc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | import "CoreDSL-Instruction-Set-Description/RISCVBase.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RV32I.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVM.core_desc" | ||||||
|  | import "CoreDSL-Instruction-Set-Description/RVC.core_desc" | ||||||
|  |  | ||||||
|  | InstructionSet X_RB_MAC extends RISCVBase { | ||||||
|  |   architectural_state { | ||||||
|  |     register unsigned<64> ACC; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   instructions { | ||||||
|  |     RESET_ACC { // v-- funct7       v-- funct3 | ||||||
|  |       encoding: 7'd0 :: 10'b0 :: 3'd0 :: 5'b0 :: 7'b0001011; | ||||||
|  |       behavior: ACC = 0; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     GET_ACC_LO { | ||||||
|  |       encoding: 7'd1 :: 10'b0 :: 3'd0 :: rd[4:0] :: 7'b0001011; | ||||||
|  |       behavior: if (rd != 0) X[rd] = ACC[31:0]; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     GET_ACC_HI { | ||||||
|  |       encoding: 7'd2 :: 10'b0 :: 3'd0 :: rd[4:0] :: 7'b0001011; | ||||||
|  |       behavior: if (rd != 0) X[rd] = ACC[63:32]; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     MACU_32 { | ||||||
|  |       encoding: 7'd0 :: rs2[4:0] :: rs1[4:0] :: 3'd1 :: 5'b0 :: 7'b0001011; | ||||||
|  |       behavior: { | ||||||
|  |         unsigned<64> mul = X[rs1]    * X[rs2]; | ||||||
|  |         unsigned<33> add = mul[31:0] + ACC[31:0]; | ||||||
|  |         ACC = add[31:0]; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     MACS_32 { | ||||||
|  |       encoding: 7'd1 :: rs2[4:0] :: rs1[4:0] :: 3'd1 :: 5'b0 :: 7'b0001011; | ||||||
|  |       behavior: { | ||||||
|  |         signed<64> mul = ((signed) X[rs1])    * ((signed) X[rs2]); | ||||||
|  |         signed<33> add = ((signed) mul[31:0]) + ((signed) ACC[31:0]); | ||||||
|  |         ACC = add[31:0]; // bit range always yields unsigned type | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     MACU_64 { | ||||||
|  |       encoding: 7'd0 :: rs2[4:0] :: rs1[4:0] :: 3'd2 :: 5'b0 :: 7'b0001011; | ||||||
|  |       behavior: { | ||||||
|  |         unsigned<64> mul = X[rs1] * X[rs2]; | ||||||
|  |         unsigned<65> add = mul    + ACC; | ||||||
|  |         ACC = add[63:0]; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     MACS_64 { | ||||||
|  |       encoding: 7'd1 :: rs2[4:0] :: rs1[4:0] :: 3'd2 :: 5'b0 :: 7'b0001011; | ||||||
|  |       behavior: { | ||||||
|  |         signed<64> mul = ((signed) X[rs1]) * ((signed) X[rs2]); | ||||||
|  |         signed<65> add =           mul     + ((signed) ACC); | ||||||
|  |         ACC = add[63:0]; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Core TGC_D_XRB_MAC provides RV32I, RV32M, RV32IC, X_RB_MAC { | ||||||
|  |     architectural_state { | ||||||
|  |         XLEN=32; | ||||||
|  |         // definitions for the architecture wrapper | ||||||
|  |         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA | ||||||
|  |         unsigned MISA_VAL = 0b01000000000000000001000100000100; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| import "CoreDSL-Instruction-Set-Description/RV32I.core_desc" |  | ||||||
| import "CoreDSL-Instruction-Set-Description/RVM.core_desc" |  | ||||||
| import "CoreDSL-Instruction-Set-Description/RVC.core_desc" |  | ||||||
|  |  | ||||||
| Core TGC_B provides RV32I { |  | ||||||
| 	architectural_state { |  | ||||||
|         unsigned XLEN=32; |  | ||||||
|         unsigned PCLEN=32; |  | ||||||
|         // definitions for the architecture wrapper |  | ||||||
|         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA |  | ||||||
|         unsigned MISA_VAL = 0b01000000000000000000000100000000; |  | ||||||
|         unsigned PGSIZE = 0x1000; //1 << 12; |  | ||||||
|         unsigned PGMASK = 0xfff; //PGSIZE-1 |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Core TGC_C provides RV32I, RV32M, RV32IC { |  | ||||||
|     architectural_state { |  | ||||||
|         unsigned XLEN=32; |  | ||||||
|         unsigned PCLEN=32; |  | ||||||
|         // definitions for the architecture wrapper |  | ||||||
|         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA |  | ||||||
|         unsigned MISA_VAL = 0b01000000000000000001000100000100; |  | ||||||
|         unsigned PGSIZE = 0x1000; //1 << 12; |  | ||||||
|         unsigned PGMASK = 0xfff; //PGSIZE-1 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Core TGC_D provides RV32I, RV32M, RV32IC { |  | ||||||
|     architectural_state { |  | ||||||
|         unsigned XLEN=32; |  | ||||||
|         unsigned PCLEN=32; |  | ||||||
|         // definitions for the architecture wrapper |  | ||||||
|         //                    XL    ZYXWVUTSRQPONMLKJIHGFEDCBA |  | ||||||
|         unsigned MISA_VAL = 0b01000000000000000001000100000100; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -64,7 +64,9 @@ public: | |||||||
|     using addr_t      = typename super::addr_t; |     using addr_t      = typename super::addr_t; | ||||||
|     using reg_t       = typename traits::reg_t; |     using reg_t       = typename traits::reg_t; | ||||||
|     using mem_type_e  = typename traits::mem_type_e; |     using mem_type_e  = typename traits::mem_type_e; | ||||||
|  |      | ||||||
|  |     const bool has_compressed = traits::MISA_VAL & 0b100; | ||||||
|  |      | ||||||
|     vm_impl(); |     vm_impl(); | ||||||
|  |  | ||||||
|     vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0); |     vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0); | ||||||
| @@ -210,6 +212,7 @@ private: | |||||||
|         <%instr.behavior.eachLine{%>${it} |         <%instr.behavior.eachLine{%>${it} | ||||||
|         <%}%>} catch(...){} |         <%}%>} catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, ${idx}); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, ${idx}); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -324,6 +327,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | |||||||
|             if (is_jump_to_self_enabled(cond) && |             if (is_jump_to_self_enabled(cond) && | ||||||
|                     (insn == 0x0000006f || (insn&0xffff)==0xa001)) throw simulation_stopped(0); // 'J 0' or 'C.J 0' |                     (insn == 0x0000006f || (insn&0xffff)==0xa001)) throw simulation_stopped(0); // 'J 0' or 'C.J 0' | ||||||
|             auto f = decode_inst(insn); |             auto f = decode_inst(insn); | ||||||
|  |             auto old_pc = pc.val; | ||||||
|             pc = (this->*f)(pc, insn); |             pc = (this->*f)(pc, insn); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -362,8 +362,8 @@ riscv_hart_m_p<BASE>::riscv_hart_m_p() | |||||||
|     csr_rd_cb[mie] = &this_class::read_ie; |     csr_rd_cb[mie] = &this_class::read_ie; | ||||||
|     csr_wr_cb[mie] = &this_class::write_ie; |     csr_wr_cb[mie] = &this_class::write_ie; | ||||||
|     csr_rd_cb[mhartid] = &this_class::read_hartid; |     csr_rd_cb[mhartid] = &this_class::read_hartid; | ||||||
|     csr_rd_cb[mcounteren] = &this_class::read_null; | //    csr_rd_cb[mcounteren] = &this_class::read_null; | ||||||
|     csr_wr_cb[mcounteren] = &this_class::write_null; | //    csr_wr_cb[mcounteren] = &this_class::write_null; | ||||||
|     csr_wr_cb[misa] = &this_class::write_null; |     csr_wr_cb[misa] = &this_class::write_null; | ||||||
|     csr_wr_cb[mvendorid] = &this_class::write_null; |     csr_wr_cb[mvendorid] = &this_class::write_null; | ||||||
|     csr_wr_cb[marchid] = &this_class::write_null; |     csr_wr_cb[marchid] = &this_class::write_null; | ||||||
| @@ -920,7 +920,16 @@ template <typename BASE> uint64_t riscv_hart_m_p<BASE>::enter_trap(uint64_t flag | |||||||
|     if (trap_id == 0) { // exception |     if (trap_id == 0) { // exception | ||||||
|         // store ret addr in xepc register |         // store ret addr in xepc register | ||||||
|         csr[mepc] = static_cast<reg_t>(addr) & get_pc_mask(); // store actual address instruction of exception |         csr[mepc] = static_cast<reg_t>(addr) & get_pc_mask(); // store actual address instruction of exception | ||||||
|         csr[mtval] = cause==2?((instr & 0x3)==3?instr:instr&0xffff):fault_data; |         switch(cause){ | ||||||
|  |         case 0: | ||||||
|  |             csr[mtval] = instr; | ||||||
|  |             break; | ||||||
|  |         case 2: | ||||||
|  |             csr[mtval] = (instr & 0x3)==3?instr:instr&0xffff; | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             csr[mtval] = fault_data; | ||||||
|  |         } | ||||||
|         fault_data = 0; |         fault_data = 0; | ||||||
|     } else { |     } else { | ||||||
|         csr[mepc] = this->reg.NEXT_PC & get_pc_mask(); // store next address if interrupt |         csr[mepc] = this->reg.NEXT_PC & get_pc_mask(); // store next address if interrupt | ||||||
|   | |||||||
| @@ -145,7 +145,7 @@ public: | |||||||
|  |  | ||||||
|         mstatus_t mstatus; |         mstatus_t mstatus; | ||||||
|  |  | ||||||
|         static const reg_t mstatus_reset_val = 0; |         static const reg_t mstatus_reset_val = 0x1800; | ||||||
|  |  | ||||||
|         void write_mstatus(T val, unsigned priv_lvl) { |         void write_mstatus(T val, unsigned priv_lvl) { | ||||||
|             auto mask = get_mask(priv_lvl); |             auto mask = get_mask(priv_lvl); | ||||||
| @@ -398,7 +398,7 @@ private: | |||||||
|     iss::status read_ip(unsigned addr, reg_t &val); |     iss::status read_ip(unsigned addr, reg_t &val); | ||||||
|     iss::status write_ip(unsigned addr, reg_t val); |     iss::status write_ip(unsigned addr, reg_t val); | ||||||
|     iss::status read_hartid(unsigned addr, reg_t &val); |     iss::status read_hartid(unsigned addr, reg_t &val); | ||||||
|     iss::status write_mepc(unsigned addr, reg_t val); |     iss::status write_epc(unsigned addr, reg_t val); | ||||||
|     iss::status read_satp(unsigned addr, reg_t &val); |     iss::status read_satp(unsigned addr, reg_t &val); | ||||||
|     iss::status write_satp(unsigned addr, reg_t val); |     iss::status write_satp(unsigned addr, reg_t val); | ||||||
|     iss::status read_fcsr(unsigned addr, reg_t &val); |     iss::status read_fcsr(unsigned addr, reg_t &val); | ||||||
| @@ -954,8 +954,8 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ip(unsigned | |||||||
|     return iss::Ok; |     return iss::Ok; | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename BASE> iss::status riscv_hart_m_p<BASE>::write_epc(unsigned addr, reg_t val) { | template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_epc(unsigned addr, reg_t val) { | ||||||
|      csr[addr] = val & get_pc_mask(); |     csr[addr] = val & get_pc_mask(); | ||||||
|     return iss::Ok; |     return iss::Ok; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -146,7 +146,7 @@ public: | |||||||
|  |  | ||||||
|         mstatus_t mstatus; |         mstatus_t mstatus; | ||||||
|  |  | ||||||
|         static const reg_t mstatus_reset_val = 0; |         static const reg_t mstatus_reset_val = 0x1800; // MPP set to 1 | ||||||
|  |  | ||||||
|         void write_mstatus(T val, unsigned priv_lvl) { |         void write_mstatus(T val, unsigned priv_lvl) { | ||||||
|             auto mask = get_mask(priv_lvl); |             auto mask = get_mask(priv_lvl); | ||||||
| @@ -543,25 +543,27 @@ template <typename BASE, features_e FEAT> bool riscv_hart_mu_p<BASE, FEAT>::pmp_ | |||||||
|     constexpr auto PMP_NA4 =0x2U; |     constexpr auto PMP_NA4 =0x2U; | ||||||
|     constexpr auto PMP_NAPOT =0x3U; |     constexpr auto PMP_NAPOT =0x3U; | ||||||
|     reg_t base = 0; |     reg_t base = 0; | ||||||
|  |     auto any_active = false; | ||||||
|     for (size_t i = 0; i < 16; i++) { |     for (size_t i = 0; i < 16; i++) { | ||||||
|         reg_t tor = csr[pmpaddr0+i] << PMP_SHIFT; |         reg_t tor = csr[pmpaddr0+i] << PMP_SHIFT; | ||||||
|         uint8_t cfg = csr[pmpcfg0+(i/4)]>>(i%4); |         uint8_t cfg = csr[pmpcfg0+(i/4)]>>(i%4); | ||||||
|         if (cfg & PMP_A) { |         if (cfg & PMP_A) { | ||||||
|  |             any_active=true; | ||||||
|             auto pmp_a = (cfg & PMP_A) >> 3; |             auto pmp_a = (cfg & PMP_A) >> 3; | ||||||
|             bool is_tor = pmp_a == PMP_TOR; |             auto is_tor = pmp_a == PMP_TOR; | ||||||
|             bool is_na4 = pmp_a == PMP_NA4; |             auto is_na4 = pmp_a == PMP_NA4; | ||||||
|  |  | ||||||
|             reg_t mask = (csr[pmpaddr0+i] << 1) | (!is_na4); |             reg_t mask = (csr[pmpaddr0+i] << 1) | (!is_na4); | ||||||
|             mask = ~(mask & ~(mask + 1)) << PMP_SHIFT; |             mask = ~(mask & ~(mask + 1)) << PMP_SHIFT; | ||||||
|  |  | ||||||
|             // Check each 4-byte sector of the access |             // Check each 4-byte sector of the access | ||||||
|             bool any_match = false; |             auto any_match = false; | ||||||
|             bool all_match = true; |             auto all_match = true; | ||||||
|             for (reg_t offset = 0; offset < len; offset += 1 << PMP_SHIFT) { |             for (reg_t offset = 0; offset < len; offset += 1 << PMP_SHIFT) { | ||||||
|                 reg_t cur_addr = addr + offset; |                 reg_t cur_addr = addr + offset; | ||||||
|                 bool napot_match = ((cur_addr ^ tor) & mask) == 0; |                 auto napot_match = ((cur_addr ^ tor) & mask) == 0; | ||||||
|                 bool tor_match = base <= cur_addr && cur_addr < tor; |                 auto tor_match = base <= cur_addr && cur_addr < tor; | ||||||
|                 bool match = is_tor ? tor_match : napot_match; |                 auto match = is_tor ? tor_match : napot_match; | ||||||
|                 any_match |= match; |                 any_match |= match; | ||||||
|                 all_match &= match; |                 all_match &= match; | ||||||
|             } |             } | ||||||
| @@ -577,7 +579,7 @@ template <typename BASE, features_e FEAT> bool riscv_hart_mu_p<BASE, FEAT>::pmp_ | |||||||
|         } |         } | ||||||
|         base = tor; |         base = tor; | ||||||
|     } |     } | ||||||
|     return this->reg.PRIV == PRIV_M; |     return !any_active || this->reg.PRIV == PRIV_M; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -926,8 +928,6 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT | |||||||
|  |  | ||||||
| template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ie(unsigned addr, reg_t val) { | template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ie(unsigned addr, reg_t val) { | ||||||
|     auto mask = get_irq_wrmask((addr >> 8) & 0x3); |     auto mask = get_irq_wrmask((addr >> 8) & 0x3); | ||||||
|     if(this->reg.PRIV==0) |  | ||||||
|         mask&= ~(0xff<<4); // STIE and UTIE are read only in user and supervisor mode |  | ||||||
|     csr[mie] = (csr[mie] & ~mask) | (val & mask); |     csr[mie] = (csr[mie] & ~mask) | (val & mask); | ||||||
|     check_interrupt(); |     check_interrupt(); | ||||||
|     return iss::Ok; |     return iss::Ok; | ||||||
| @@ -1256,27 +1256,33 @@ template <typename BASE, features_e FEAT> uint64_t riscv_hart_mu_p<BASE, FEAT>:: | |||||||
| template <typename BASE, features_e FEAT> uint64_t riscv_hart_mu_p<BASE, FEAT>::leave_trap(uint64_t flags) { | template <typename BASE, features_e FEAT> uint64_t riscv_hart_mu_p<BASE, FEAT>::leave_trap(uint64_t flags) { | ||||||
|     auto cur_priv = this->reg.PRIV; |     auto cur_priv = this->reg.PRIV; | ||||||
|     auto inst_priv = (flags & 0x3)? 3:0; |     auto inst_priv = (flags & 0x3)? 3:0; | ||||||
|     auto status = state.mstatus; |     if(inst_priv>cur_priv){ | ||||||
|     // pop the relevant lower-privilege interrupt enable and privilege mode stack |         auto trap_val =  0x80ULL << 24 | (2 << 16); // illegal instruction | ||||||
|     // clear respective yIE |         this->reg.trap_state = trap_val; | ||||||
|     switch (inst_priv) { |         this->reg.NEXT_PC = std::numeric_limits<uint32_t>::max(); | ||||||
|     case PRIV_M: |     } else { | ||||||
|         this->reg.PRIV = state.mstatus.MPP; |         auto status = state.mstatus; | ||||||
|         state.mstatus.MPP = 0; // clear mpp to U mode |         // pop the relevant lower-privilege interrupt enable and privilege mode stack | ||||||
|         state.mstatus.MIE = state.mstatus.MPIE; |         // clear respective yIE | ||||||
|         state.mstatus.MPIE = 1; |         switch (inst_priv) { | ||||||
|         break; |         case PRIV_M: | ||||||
|     case PRIV_U: |             this->reg.PRIV = state.mstatus.MPP; | ||||||
|         this->reg.PRIV = 0; |             state.mstatus.MPP = 0; // clear mpp to U mode | ||||||
|         state.mstatus.UIE = state.mstatus.UPIE; |             state.mstatus.MIE = state.mstatus.MPIE; | ||||||
|         state.mstatus.UPIE = 1; |             state.mstatus.MPIE = 1; | ||||||
|         break; |             break; | ||||||
|  |         case PRIV_U: | ||||||
|  |             this->reg.PRIV = 0; | ||||||
|  |             state.mstatus.UIE = state.mstatus.UPIE; | ||||||
|  |             state.mstatus.UPIE = 1; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         // sets the pc to the value stored in the x epc register. | ||||||
|  |         this->reg.NEXT_PC = csr[uepc | inst_priv << 8]; | ||||||
|  |         CLOG(INFO, disass) << "Executing xRET , changing privilege level from " << lvl[cur_priv] << " to " | ||||||
|  |                            << lvl[this->reg.PRIV]; | ||||||
|  |         check_interrupt(); | ||||||
|     } |     } | ||||||
|     // sets the pc to the value stored in the x epc register. |  | ||||||
|     this->reg.NEXT_PC = csr[uepc | inst_priv << 8]; |  | ||||||
|     CLOG(INFO, disass) << "Executing xRET , changing privilege level from " << lvl[cur_priv] << " to " |  | ||||||
|                        << lvl[this->reg.PRIV]; |  | ||||||
|     check_interrupt(); |  | ||||||
|     return this->reg.NEXT_PC; |     return this->reg.NEXT_PC; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -51,9 +51,9 @@ template <> struct traits<tgc_c> { | |||||||
|         {"X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "X30", "X31", "PC", "NEXT_PC", "PRIV"}}; |         {"X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "X30", "X31", "PC", "NEXT_PC", "PRIV"}}; | ||||||
|   |   | ||||||
|     static constexpr std::array<const char*, 35> reg_aliases{ |     static constexpr std::array<const char*, 35> reg_aliases{ | ||||||
|         {"X0", "X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", "X23", "X24", "X25", "X26", "X27", "X28", "X29", "X30", "X31", "PC", "NEXT_PC", "PRIV"}}; |         {"ZERO", "RA", "SP", "GP", "TP", "T0", "T1", "T2", "S0", "S1", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "S11", "T3", "T4", "T5", "T6", "PC", "NEXT_PC", "PRIV"}}; | ||||||
|  |  | ||||||
|     enum constants {XLEN=32, PCLEN=32, MISA_VAL=0b01000000000000000001000100000100, PGSIZE=0x1000, PGMASK=0b111111111111, CSR_SIZE=4096, fence=0, fencei=1, fencevmal=2, fencevmau=3, MUL_LEN=64}; |     enum constants {MISA_VAL=0b01000000000000000001000100000100, XLEN=32, CSR_SIZE=4096, INSTR_ALIGNMENT=2, fence=0, fencei=1, fencevmal=2, fencevmau=3, MUL_LEN=64}; | ||||||
|  |  | ||||||
|     constexpr static unsigned FP_REGS_SIZE = 0; |     constexpr static unsigned FP_REGS_SIZE = 0; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -49,6 +49,11 @@ using tgc_b_plat_type = iss::arch::riscv_hart_m_p<iss::arch::tgc_b>; | |||||||
| #include "iss/arch/tgc_d.h" | #include "iss/arch/tgc_d.h" | ||||||
| using tgc_d_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_CLIC | iss::arch::FEAT_EXT_N)>; | using tgc_d_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_CLIC | iss::arch::FEAT_EXT_N)>; | ||||||
| #endif | #endif | ||||||
|  | #ifdef CORE_TGC_D_XRB_MAC | ||||||
|  | #include "iss/arch/riscv_hart_mu_p.h" | ||||||
|  | #include "iss/arch/tgc_d_xrb_mac.h" | ||||||
|  | using tgc_d_xrb_mac_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d_xrb_mac, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_CLIC | iss::arch::FEAT_EXT_N)>; | ||||||
|  | #endif | ||||||
| #ifdef WITH_LLVM | #ifdef WITH_LLVM | ||||||
| #include <iss/llvm/jit_helper.h> | #include <iss/llvm/jit_helper.h> | ||||||
| #endif | #endif | ||||||
| @@ -138,6 +143,12 @@ int main(int argc, char *argv[]) { | |||||||
|             std::tie(cpu, vm) = |             std::tie(cpu, vm) = | ||||||
|                 iss::create_cpu<tgc_d_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); |                 iss::create_cpu<tgc_d_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); | ||||||
|         } else |         } else | ||||||
|  | #endif | ||||||
|  | #ifdef CORE_TGC_D_XRB_MAC | ||||||
|  |         if (isa_opt == "tgc_d_xrb_mac") { | ||||||
|  |             std::tie(cpu, vm) = | ||||||
|  |                 iss::create_cpu<tgc_d_xrb_mac_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); | ||||||
|  |         } else | ||||||
| #endif | #endif | ||||||
|         { |         { | ||||||
|             LOG(ERROR) << "Illegal argument value for '--isa': " << clim["isa"].as<std::string>() << std::endl; |             LOG(ERROR) << "Illegal argument value for '--isa': " << clim["isa"].as<std::string>() << std::endl; | ||||||
|   | |||||||
| @@ -44,6 +44,11 @@ using tgc_c_plat_type = iss::arch::riscv_hart_m_p<iss::arch::tgc_c>; | |||||||
| #include "iss/arch/tgc_d.h" | #include "iss/arch/tgc_d.h" | ||||||
| using tgc_d_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d, iss::arch::FEAT_PMP>; | using tgc_d_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d, iss::arch::FEAT_PMP>; | ||||||
| #endif | #endif | ||||||
|  | #ifdef CORE_TGC_D_XRB_MAC | ||||||
|  | #include "iss/arch/riscv_hart_mu_p.h" | ||||||
|  | #include "iss/arch/tgc_d_xrb_mac.h" | ||||||
|  | using tgc_d_xrb_mac_plat_type = iss::arch::riscv_hart_mu_p<iss::arch::tgc_d_xrb_mac, iss::arch::FEAT_PMP>; | ||||||
|  | #endif | ||||||
| #include "iss/debugger/encoderdecoder.h" | #include "iss/debugger/encoderdecoder.h" | ||||||
| #include "iss/debugger/gdb_session.h" | #include "iss/debugger/gdb_session.h" | ||||||
| #include "iss/debugger/server.h" | #include "iss/debugger/server.h" | ||||||
| @@ -285,6 +290,9 @@ public: | |||||||
| #endif | #endif | ||||||
| #ifdef CORE_TGC_D | #ifdef CORE_TGC_D | ||||||
|         CREATE_CORE(tgc_d) |         CREATE_CORE(tgc_d) | ||||||
|  | #endif | ||||||
|  | #ifdef CORE_TGC_D_XRB_MACD | ||||||
|  |         CREATE_CORE(tgc_d_xrb_mac) | ||||||
| #endif | #endif | ||||||
|         { |         { | ||||||
|             LOG(ERROR) << "Illegal argument value for core type: " << type << std::endl; |             LOG(ERROR) << "Illegal argument value for core type: " << type << std::endl; | ||||||
|   | |||||||
| @@ -64,7 +64,9 @@ public: | |||||||
|     using addr_t      = typename super::addr_t; |     using addr_t      = typename super::addr_t; | ||||||
|     using reg_t       = typename traits::reg_t; |     using reg_t       = typename traits::reg_t; | ||||||
|     using mem_type_e  = typename traits::mem_type_e; |     using mem_type_e  = typename traits::mem_type_e; | ||||||
|  |      | ||||||
|  |     const bool has_compressed = traits::MISA_VAL & 0b100; | ||||||
|  |      | ||||||
|     vm_impl(); |     vm_impl(); | ||||||
|  |  | ||||||
|     vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0); |     vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0); | ||||||
| @@ -385,6 +387,7 @@ private: | |||||||
|         if(rd != 0) *(X+rd) = (int32_t)imm;  |         if(rd != 0) *(X+rd) = (int32_t)imm;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 0); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 0); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -425,6 +428,7 @@ private: | |||||||
|         if(rd != 0) *(X+rd) = *PC + (int32_t)imm;  |         if(rd != 0) *(X+rd) = *PC + (int32_t)imm;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 1); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 1); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -463,11 +467,17 @@ private: | |||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         { |         { | ||||||
|             if(rd != 0) *(X+rd) = *PC + 4;  |             if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|             pc_assign(*NEXT_PC) = *PC + (int32_t)sext<21>(imm); |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 if(rd != 0) *(X+rd) = *PC + 4;  | ||||||
|  |                 pc_assign(*NEXT_PC) = *PC + (int32_t)sext<21>(imm); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 2); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 2); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -508,11 +518,17 @@ private: | |||||||
|         try { |         try { | ||||||
|         { |         { | ||||||
|             int32_t new_pc = *(X+rs1) + (int16_t)sext<12>(imm); |             int32_t new_pc = *(X+rs1) + (int16_t)sext<12>(imm); | ||||||
|             if(rd != 0) *(X+rd) = *PC + 4;  |             if(new_pc % traits::INSTR_ALIGNMENT) { | ||||||
|             pc_assign(*NEXT_PC) = new_pc & ~ 0x1; |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 if(rd != 0) *(X+rd) = *PC + 4;  | ||||||
|  |                 pc_assign(*NEXT_PC) = new_pc & ~ 0x1; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 3); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 3); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -551,9 +567,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         if(*(X+rs1) == *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |         { | ||||||
|  |             if(*(X+rs1) == *(X+rs2)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 4); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 4); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -592,9 +614,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         if(*(X+rs1) != *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |         { | ||||||
|  |             if(*(X+rs1) != *(X+rs2)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 5); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 5); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -633,9 +661,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         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)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 6); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 6); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -674,9 +708,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         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)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 7); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 7); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -715,9 +755,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         if(*(X+rs1) < *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |         { | ||||||
|  |             if(*(X+rs1) < *(X+rs2)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 8); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 8); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -756,9 +802,15 @@ private: | |||||||
|         *NEXT_PC = *PC + 4; |         *NEXT_PC = *PC + 4; | ||||||
|         // execute instruction |         // execute instruction | ||||||
|         try { |         try { | ||||||
|         if(*(X+rs1) >= *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);  |         { | ||||||
|  |             if(*(X+rs1) >= *(X+rs2)) if(imm % traits::INSTR_ALIGNMENT) { | ||||||
|  |                 raise(0,  0); | ||||||
|  |             } | ||||||
|  |             else pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm); | ||||||
|  |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 9); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 9); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -803,6 +855,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 10); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 10); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -848,6 +901,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 11); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 11); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -893,6 +947,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 12); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 12); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -937,6 +992,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 13); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 13); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -982,6 +1038,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 14); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 14); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1023,6 +1080,7 @@ private: | |||||||
|         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)); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 15); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 15); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1067,6 +1125,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 16); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 16); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1111,6 +1170,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 17); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 17); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1152,6 +1212,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) + (int16_t)sext<12>(imm);  |         if(rd !=  0) *(X+rd) = *(X+rs1) + (int16_t)sext<12>(imm);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 18); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 18); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1193,6 +1254,7 @@ private: | |||||||
|         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;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 19); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 19); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1234,6 +1296,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = (*(X+rs1) < (uint32_t)((int16_t)sext<12>(imm)))?  1 :  0;  |         if(rd !=  0) *(X+rd) = (*(X+rs1) < (uint32_t)((int16_t)sext<12>(imm)))?  1 :  0;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 20); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 20); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1275,6 +1338,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) ^ (int16_t)sext<12>(imm);  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ (int16_t)sext<12>(imm);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 21); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 21); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1316,6 +1380,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) | (int16_t)sext<12>(imm);  |         if(rd !=  0) *(X+rd) = *(X+rs1) | (int16_t)sext<12>(imm);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 22); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 22); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1357,6 +1422,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) & (int16_t)sext<12>(imm);  |         if(rd !=  0) *(X+rd) = *(X+rs1) & (int16_t)sext<12>(imm);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 23); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 23); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1403,6 +1469,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 24); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 24); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1449,6 +1516,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 25); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 25); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1495,6 +1563,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 26); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 26); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1536,6 +1605,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) + *(X+rs2);  |         if(rd !=  0) *(X+rd) = *(X+rs1) + *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 27); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 27); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1577,6 +1647,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) - *(X+rs2);  |         if(rd !=  0) *(X+rd) = *(X+rs1) - *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 28); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 28); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1618,6 +1689,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) << (*(X+rs2) & (traits::XLEN - 1));  |         if(rd !=  0) *(X+rd) = *(X+rs1) << (*(X+rs2) & (traits::XLEN - 1));  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 29); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 29); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1659,6 +1731,7 @@ private: | |||||||
|         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;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 30); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 30); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1700,6 +1773,7 @@ private: | |||||||
|         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;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 31); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 31); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1741,6 +1815,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) ^ *(X+rs2);  |         if(rd !=  0) *(X+rd) = *(X+rs1) ^ *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 32); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 32); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1782,6 +1857,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  |         if(rd !=  0) *(X+rd) = *(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 33); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 33); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1823,6 +1899,7 @@ private: | |||||||
|         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));  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 34); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 34); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1864,6 +1941,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) | *(X+rs2);  |         if(rd !=  0) *(X+rd) = *(X+rs1) | *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 35); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 35); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1905,6 +1983,7 @@ private: | |||||||
|         if(rd !=  0) *(X+rd) = *(X+rs1) & *(X+rs2);  |         if(rd !=  0) *(X+rd) = *(X+rs1) & *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 36); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 36); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1947,6 +2026,7 @@ private: | |||||||
|         writeSpace1(traits::FENCE, traits::fence, pred << 4 | succ); |         writeSpace1(traits::FENCE, traits::fence, pred << 4 | succ); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 37); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 37); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -1981,6 +2061,7 @@ private: | |||||||
|         raise(0,  11); |         raise(0,  11); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 38); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 38); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2015,6 +2096,7 @@ private: | |||||||
|         raise(0,  3); |         raise(0,  3); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 39); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 39); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2049,6 +2131,7 @@ private: | |||||||
|         leave(0); |         leave(0); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 40); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 40); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2083,6 +2166,7 @@ private: | |||||||
|         leave(1); |         leave(1); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 41); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 41); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2117,6 +2201,7 @@ private: | |||||||
|         leave(3); |         leave(3); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 42); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 42); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2151,6 +2236,7 @@ private: | |||||||
|         wait(1); |         wait(1); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 43); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 43); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2202,6 +2288,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 44); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 44); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2248,6 +2335,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 45); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 45); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2294,6 +2382,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 46); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 46); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2339,6 +2428,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 47); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 47); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2384,6 +2474,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 48); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 48); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2429,6 +2520,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 49); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 49); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2475,6 +2567,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 50); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 50); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2521,6 +2614,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 51); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 51); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2567,6 +2661,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 52); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 52); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2613,6 +2708,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 53); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 53); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2663,6 +2759,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 54); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 54); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2709,6 +2806,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 55); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 55); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2759,6 +2857,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 56); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 56); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2805,6 +2904,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 57); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 57); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2846,6 +2946,7 @@ private: | |||||||
|         else raise(0,  2); |         else raise(0,  2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 58); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 58); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2890,6 +2991,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 59); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 59); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2934,6 +3036,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 60); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 60); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -2974,6 +3077,7 @@ private: | |||||||
|         *(X+rs1) = *(X+rs1) + (int8_t)sext<6>(imm); |         *(X+rs1) = *(X+rs1) + (int8_t)sext<6>(imm); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 61); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 61); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3010,6 +3114,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 62); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 62); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3052,6 +3157,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 63); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 63); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3094,6 +3200,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 64); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 64); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3137,6 +3244,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 65); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 65); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3177,6 +3285,7 @@ private: | |||||||
|         else raise(0,  2); |         else raise(0,  2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 66); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 66); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3212,6 +3321,7 @@ private: | |||||||
|         raise(0,  2); |         raise(0,  2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 67); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 67); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3255,6 +3365,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 68); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 68); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3302,6 +3413,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 69); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 69); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3345,6 +3457,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 70); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 70); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3388,6 +3501,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 71); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 71); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3431,6 +3545,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 72); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 72); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3474,6 +3589,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 73); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 73); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3517,6 +3633,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 74); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 74); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3555,6 +3672,7 @@ private: | |||||||
|         pc_assign(*NEXT_PC) = *PC + (int16_t)sext<12>(imm); |         pc_assign(*NEXT_PC) = *PC + (int16_t)sext<12>(imm); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 75); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 75); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3595,6 +3713,7 @@ private: | |||||||
|         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);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 76); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 76); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3635,6 +3754,7 @@ private: | |||||||
|         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);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 77); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 77); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3675,6 +3795,7 @@ private: | |||||||
|         if(nzuimm) *(X+rs1) = *(X+rs1) << nzuimm;  |         if(nzuimm) *(X+rs1) = *(X+rs1) << nzuimm;  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 78); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 78); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3719,6 +3840,7 @@ private: | |||||||
|         else raise(0, 2); |         else raise(0, 2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 79); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 79); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3759,6 +3881,7 @@ private: | |||||||
|         if(rd != 0) *(X+rd) = *(X+rs2);  |         if(rd != 0) *(X+rd) = *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 80); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 80); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3799,6 +3922,7 @@ private: | |||||||
|         else raise(0, 2); |         else raise(0, 2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 81); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 81); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3833,6 +3957,7 @@ private: | |||||||
|         raise(0, 2); |         raise(0, 2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 82); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 82); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3873,6 +3998,7 @@ private: | |||||||
|         if(rd != 0) *(X+rd) = *(X+rd) + *(X+rs2);  |         if(rd != 0) *(X+rd) = *(X+rd) + *(X+rs2);  | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 83); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 83); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3916,6 +4042,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 84); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 84); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3950,6 +4077,7 @@ private: | |||||||
|         raise(0,  3); |         raise(0,  3); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 85); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 85); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -3993,6 +4121,7 @@ private: | |||||||
|         } |         } | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 86); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 86); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -4027,6 +4156,7 @@ private: | |||||||
|         raise(0,  2); |         raise(0,  2); | ||||||
|         } catch(...){} |         } catch(...){} | ||||||
|         // post execution stuff |         // post execution stuff | ||||||
|  |         if(!has_compressed && (*NEXT_PC&0x3)!=0) raise(0,  0); | ||||||
|         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 87); |         if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, 87); | ||||||
|         // trap check |         // trap check | ||||||
|         if(*trap_state!=0){ |         if(*trap_state!=0){ | ||||||
| @@ -4138,9 +4268,10 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co | |||||||
|             this->do_sync(POST_SYNC, std::numeric_limits<unsigned>::max()); |             this->do_sync(POST_SYNC, std::numeric_limits<unsigned>::max()); | ||||||
|             pc.val = super::core.enter_trap(std::numeric_limits<uint64_t>::max(), pc.val, 0); |             pc.val = super::core.enter_trap(std::numeric_limits<uint64_t>::max(), pc.val, 0); | ||||||
|         } else { |         } else { | ||||||
|             if (is_jump_to_self_enabled(cond) && (insn == 0x0000006f || (insn&0xffff)==0xa001)) |             if (is_jump_to_self_enabled(cond) && | ||||||
|                 throw simulation_stopped(0); // 'J 0' or 'C.J 0' |                     (insn == 0x0000006f || (insn&0xffff)==0xa001)) throw simulation_stopped(0); // 'J 0' or 'C.J 0' | ||||||
|             auto f = decode_inst(insn); |             auto f = decode_inst(insn); | ||||||
|  |             auto old_pc = pc.val; | ||||||
|             pc = (this->*f)(pc, insn); |             pc = (this->*f)(pc, insn); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user