diff --git a/gen_input/templates/interp/CORENAME.cpp.gtl b/gen_input/templates/interp/CORENAME.cpp.gtl index 930a818..3b62ca7 100644 --- a/gen_input/templates/interp/CORENAME.cpp.gtl +++ b/gen_input/templates/interp/CORENAME.cpp.gtl @@ -289,6 +289,8 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co // post execution stuff process_spawn_blocks(); if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast(inst_id)); + if(!this->core.trap_state) // update trap state if there is a pending interrupt + this->core.trap_state = this->core.pending_trap; // trap check if(trap_state!=0){ super::core.enter_trap(trap_state, pc.val, instr); @@ -299,7 +301,6 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co cycle++; pc.val=*NEXT_PC; this->core.reg.PC = this->core.reg.NEXT_PC; - this->core.trap_state = this->core.pending_trap; } } return pc; diff --git a/src/vm/interp/vm_tgc_c.cpp b/src/vm/interp/vm_tgc_c.cpp index a71d8c5..6a0f8cb 100644 --- a/src/vm/interp/vm_tgc_c.cpp +++ b/src/vm/interp/vm_tgc_c.cpp @@ -2318,6 +2318,8 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co // post execution stuff process_spawn_blocks(); if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast(inst_id)); + if(!this->core.trap_state) // update trap state if there is a pending interrupt + this->core.trap_state = this->core.pending_trap; // trap check if(trap_state!=0){ super::core.enter_trap(trap_state, pc.val, instr); @@ -2328,7 +2330,6 @@ typename vm_base::virt_addr_t vm_impl::execute_inst(finish_cond_e co cycle++; pc.val=*NEXT_PC; this->core.reg.PC = this->core.reg.NEXT_PC; - this->core.trap_state = this->core.pending_trap; } } return pc;