moves pending interrupt check before handling trap thus saving 1 cycle
This commit is contained in:
parent
1a0fc4bd5d
commit
7113683ee0
@ -289,6 +289,8 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::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<unsigned>(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<ARCH>::virt_addr_t vm_impl<ARCH>::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;
|
||||
|
@ -2318,6 +2318,8 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::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<unsigned>(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<ARCH>::virt_addr_t vm_impl<ARCH>::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;
|
||||
|
Loading…
Reference in New Issue
Block a user