mirror of
https://github.com/dingusdev/dingusppc.git
synced 2025-01-08 14:30:55 +00:00
ppcopcodes: avoid TLB flushes for noop SR changes
They happen surprisingly often, and flushing the TLB is expensive because we need to walk over all entries. Takes booting 10.2 on a Beige G3 from binary start to "Welcome to Macintosh" from 58s to 38s on my machine.
This commit is contained in:
parent
9b49603c72
commit
31d7b056af
@ -728,8 +728,10 @@ void dppc_interpreter::ppc_mtsr() {
|
|||||||
}
|
}
|
||||||
int reg_s = (ppc_cur_instruction >> 21) & 0x1F;
|
int reg_s = (ppc_cur_instruction >> 21) & 0x1F;
|
||||||
uint32_t grab_sr = (ppc_cur_instruction >> 16) & 0x0F;
|
uint32_t grab_sr = (ppc_cur_instruction >> 16) & 0x0F;
|
||||||
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
|
if (ppc_state.sr[grab_sr] != ppc_state.gpr[reg_s]) {
|
||||||
mmu_pat_ctx_changed();
|
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
|
||||||
|
mmu_pat_ctx_changed();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dppc_interpreter::ppc_mtsrin() {
|
void dppc_interpreter::ppc_mtsrin() {
|
||||||
@ -741,8 +743,10 @@ void dppc_interpreter::ppc_mtsrin() {
|
|||||||
}
|
}
|
||||||
ppc_grab_regssb(ppc_cur_instruction);
|
ppc_grab_regssb(ppc_cur_instruction);
|
||||||
uint32_t grab_sr = ppc_result_b >> 28;
|
uint32_t grab_sr = ppc_result_b >> 28;
|
||||||
ppc_state.sr[grab_sr] = ppc_result_d;
|
if (ppc_state.sr[grab_sr] != ppc_result_d) {
|
||||||
mmu_pat_ctx_changed();
|
ppc_state.sr[grab_sr] = ppc_result_d;
|
||||||
|
mmu_pat_ctx_changed();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dppc_interpreter::ppc_mfsr() {
|
void dppc_interpreter::ppc_mfsr() {
|
||||||
@ -969,8 +973,10 @@ void dppc_interpreter::ppc_mtspr() {
|
|||||||
ppc_state.spr[ref_spr] = val & 0xe000ff7f;
|
ppc_state.spr[ref_spr] = val & 0xe000ff7f;
|
||||||
break;
|
break;
|
||||||
case SPR::SDR1:
|
case SPR::SDR1:
|
||||||
ppc_state.spr[ref_spr] = val;
|
if (ppc_state.spr[ref_spr] != val) {
|
||||||
mmu_pat_ctx_changed(); // adapt to SDR1 changes
|
ppc_state.spr[ref_spr] = val;
|
||||||
|
mmu_pat_ctx_changed(); // adapt to SDR1 changes
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPR::RTCL_S:
|
case SPR::RTCL_S:
|
||||||
calc_rtcl_value();
|
calc_rtcl_value();
|
||||||
|
Loading…
Reference in New Issue
Block a user