Skip to content

Commit 31d7b05

Browse files
committed
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.
1 parent 9b49603 commit 31d7b05

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

cpu/ppc/ppcopcodes.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -728,8 +728,10 @@ void dppc_interpreter::ppc_mtsr() {
728728
}
729729
int reg_s = (ppc_cur_instruction >> 21) & 0x1F;
730730
uint32_t grab_sr = (ppc_cur_instruction >> 16) & 0x0F;
731-
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
732-
mmu_pat_ctx_changed();
731+
if (ppc_state.sr[grab_sr] != ppc_state.gpr[reg_s]) {
732+
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
733+
mmu_pat_ctx_changed();
734+
}
733735
}
734736

735737
void dppc_interpreter::ppc_mtsrin() {
@@ -741,8 +743,10 @@ void dppc_interpreter::ppc_mtsrin() {
741743
}
742744
ppc_grab_regssb(ppc_cur_instruction);
743745
uint32_t grab_sr = ppc_result_b >> 28;
744-
ppc_state.sr[grab_sr] = ppc_result_d;
745-
mmu_pat_ctx_changed();
746+
if (ppc_state.sr[grab_sr] != ppc_result_d) {
747+
ppc_state.sr[grab_sr] = ppc_result_d;
748+
mmu_pat_ctx_changed();
749+
}
746750
}
747751

748752
void dppc_interpreter::ppc_mfsr() {
@@ -969,8 +973,10 @@ void dppc_interpreter::ppc_mtspr() {
969973
ppc_state.spr[ref_spr] = val & 0xe000ff7f;
970974
break;
971975
case SPR::SDR1:
972-
ppc_state.spr[ref_spr] = val;
973-
mmu_pat_ctx_changed(); // adapt to SDR1 changes
976+
if (ppc_state.spr[ref_spr] != val) {
977+
ppc_state.spr[ref_spr] = val;
978+
mmu_pat_ctx_changed(); // adapt to SDR1 changes
979+
}
974980
break;
975981
case SPR::RTCL_S:
976982
calc_rtcl_value();

0 commit comments

Comments
 (0)