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
|
// post execution stuff
|
||||||
process_spawn_blocks();
|
process_spawn_blocks();
|
||||||
if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast<unsigned>(inst_id));
|
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
|
// trap check
|
||||||
if(trap_state!=0){
|
if(trap_state!=0){
|
||||||
super::core.enter_trap(trap_state, pc.val, instr);
|
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++;
|
cycle++;
|
||||||
pc.val=*NEXT_PC;
|
pc.val=*NEXT_PC;
|
||||||
this->core.reg.PC = this->core.reg.NEXT_PC;
|
this->core.reg.PC = this->core.reg.NEXT_PC;
|
||||||
this->core.trap_state = this->core.pending_trap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pc;
|
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
|
// post execution stuff
|
||||||
process_spawn_blocks();
|
process_spawn_blocks();
|
||||||
if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast<unsigned>(inst_id));
|
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
|
// trap check
|
||||||
if(trap_state!=0){
|
if(trap_state!=0){
|
||||||
super::core.enter_trap(trap_state, pc.val, instr);
|
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++;
|
cycle++;
|
||||||
pc.val=*NEXT_PC;
|
pc.val=*NEXT_PC;
|
||||||
this->core.reg.PC = this->core.reg.NEXT_PC;
|
this->core.reg.PC = this->core.reg.NEXT_PC;
|
||||||
this->core.trap_state = this->core.pending_trap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pc;
|
return pc;
|
||||||
|
|
Loading…
Reference in New Issue