Skip to content

Commit

Permalink
Merge pull request #104 from mihaip/upstream-mmu-perf
Browse files Browse the repository at this point in the history
ppcopcodes: avoid TLB flushes for noop SR changes
  • Loading branch information
dingusdev committed Jul 28, 2024
2 parents f192d11 + 31d7b05 commit 6f62f9d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
18 changes: 12 additions & 6 deletions cpu/ppc/ppcopcodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -728,8 +728,10 @@ void dppc_interpreter::ppc_mtsr() {
}
int reg_s = (ppc_cur_instruction >> 21) & 0x1F;
uint32_t grab_sr = (ppc_cur_instruction >> 16) & 0x0F;
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
mmu_pat_ctx_changed();
if (ppc_state.sr[grab_sr] != ppc_state.gpr[reg_s]) {
ppc_state.sr[grab_sr] = ppc_state.gpr[reg_s];
mmu_pat_ctx_changed();
}
}

void dppc_interpreter::ppc_mtsrin() {
Expand All @@ -741,8 +743,10 @@ void dppc_interpreter::ppc_mtsrin() {
}
ppc_grab_regssb(ppc_cur_instruction);
uint32_t grab_sr = ppc_result_b >> 28;
ppc_state.sr[grab_sr] = ppc_result_d;
mmu_pat_ctx_changed();
if (ppc_state.sr[grab_sr] != ppc_result_d) {
ppc_state.sr[grab_sr] = ppc_result_d;
mmu_pat_ctx_changed();
}
}

void dppc_interpreter::ppc_mfsr() {
Expand Down Expand Up @@ -969,8 +973,10 @@ void dppc_interpreter::ppc_mtspr() {
ppc_state.spr[ref_spr] = val & 0xe000ff7f;
break;
case SPR::SDR1:
ppc_state.spr[ref_spr] = val;
mmu_pat_ctx_changed(); // adapt to SDR1 changes
if (ppc_state.spr[ref_spr] != val) {
ppc_state.spr[ref_spr] = val;
mmu_pat_ctx_changed(); // adapt to SDR1 changes
}
break;
case SPR::RTCL_S:
calc_rtcl_value();
Expand Down
13 changes: 12 additions & 1 deletion devices/memctrl/memctrlbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,18 @@ bool MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
entry->devobj = nullptr;
entry->mem_ptr = reg_content;

this->address_map.push_back(entry);
// Keep address_map sorted, that way the RAM region (which starts at 0 and
// is most often requested) will be found by find_range on the first
// iteration.
this->address_map.insert(
std::upper_bound(
this->address_map.begin(),
this->address_map.end(),
entry,
[](const auto& lhs, const auto& rhs) {
return lhs->start < rhs->start;
}),
entry);

LOG_F(INFO, "Added mem region 0x%X..0x%X (%s%s%s%s) -> 0x%X", start_addr, end,
entry->type & RT_ROM ? "ROM," : "",
Expand Down

0 comments on commit 6f62f9d

Please sign in to comment.