Browse Source

[dynarmic] exclude r13 and r14 from regsel

pull/128/head
lizzie 8 months ago
committed by crueter
parent
commit
0c1ed90d5b
  1. 6
      externals/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp
  2. 6
      externals/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
  3. 2
      externals/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp
  4. 5
      externals/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp
  5. 1
      externals/dynarmic/tests/A64/a64.cpp
  6. 2
      externals/dynarmic/tests/A64/test_invalidation.cpp

6
externals/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.cpp

@ -109,12 +109,12 @@ A32EmitX64::BlockDescriptor A32EmitX64::Emit(IR::Block& block) {
const boost::container::static_vector<HostLoc, 28> gpr_order = [this] {
boost::container::static_vector<HostLoc, 28> gprs{any_gpr};
if (conf.page_table) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R14));
}
if (conf.fastmem_pointer) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R13));
}
if (conf.page_table) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R14));
}
return gprs;
}();

6
externals/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp

@ -80,12 +80,12 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept {
const boost::container::static_vector<HostLoc, 28> gpr_order = [this] {
boost::container::static_vector<HostLoc, 28> gprs{any_gpr};
if (conf.page_table) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R14));
}
if (conf.fastmem_pointer) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R13));
}
if (conf.page_table) {
gprs.erase(std::find(gprs.begin(), gprs.end(), HostLoc::R14));
}
return gprs;
}();

2
externals/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp

@ -331,6 +331,8 @@ void BlockOfCode::GenRunCode(std::function<void(BlockOfCode&)> rcp) {
mov(qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, cycles_remaining)], ABI_RETURN);
}
// r14 = page table
// r13 = fastmem pointer
rcp(*this);
cmp(dword[r15 + jsi.offsetof_halt_reason], 0);

5
externals/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp

@ -434,6 +434,11 @@ HostLoc RegAlloc::SelectARegister(const boost::container::static_vector<HostLoc,
// Abstain from using upper registers unless absolutely nescesary
if (loc_info.IsLocked()) {
// skip, not suitable for allocation
// While R13 and R14 are technically available, we avoid allocating for them
// at all costs, because theoretically skipping them is better than spilling
// all over the place - it also fixes bugs with high reg pressure
} else if (*it >= HostLoc::R13 && *it <= HostLoc::R15) {
// skip, do not touch
} else {
if (loc_info.lru_counter < min_lru_counter) {
if (loc_info.IsEmpty())

1
externals/dynarmic/tests/A64/a64.cpp

@ -8,7 +8,6 @@
#include "./testenv.h"
#include "dynarmic/common/fp/fpsr.h"
#include "dynarmic/common/llvm_disassemble.h"
#include "dynarmic/interface/exclusive_monitor.h"
using namespace Dynarmic;

2
externals/dynarmic/tests/A64/test_invalidation.cpp
File diff suppressed because it is too large
View File

Loading…
Cancel
Save