From aa430608e70fe6857ef7a9d63b59525b5f261f18 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Tue, 29 Jun 2021 22:25:43 +0200 Subject: support allocating more registers for aarch64 JIT also some minor fixes for the x64 JIT as well --- src/ARMJIT_x64/ARMJIT_Branch.cpp | 4 ++-- src/ARMJIT_x64/ARMJIT_Compiler.cpp | 25 +++++++++++++++++-------- src/ARMJIT_x64/ARMJIT_Compiler.h | 6 +++--- src/ARMJIT_x64/ARMJIT_LoadStore.cpp | 14 +++++++------- 4 files changed, 29 insertions(+), 20 deletions(-) (limited to 'src/ARMJIT_x64') diff --git a/src/ARMJIT_x64/ARMJIT_Branch.cpp b/src/ARMJIT_x64/ARMJIT_Branch.cpp index 8ca3542..a89cf99 100644 --- a/src/ARMJIT_x64/ARMJIT_Branch.cpp +++ b/src/ARMJIT_x64/ARMJIT_Branch.cpp @@ -165,7 +165,7 @@ void Compiler::Comp_JumpTo(Gen::X64Reg addr, bool restoreCPSR) bool cpsrDirty = CPSRDirty; SaveCPSR(); - PushRegs(restoreCPSR); + PushRegs(restoreCPSR, true); MOV(64, R(ABI_PARAM1), R(RCPU)); MOV(32, R(ABI_PARAM2), R(addr)); @@ -178,7 +178,7 @@ void Compiler::Comp_JumpTo(Gen::X64Reg addr, bool restoreCPSR) else CALL((void*)&ARMv4JumpToTrampoline); - PopRegs(restoreCPSR); + PopRegs(restoreCPSR, true); LoadCPSR(); // in case this instruction is skipped diff --git a/src/ARMJIT_x64/ARMJIT_Compiler.cpp b/src/ARMJIT_x64/ARMJIT_Compiler.cpp index 5ab8c6a..aef8b91 100644 --- a/src/ARMJIT_x64/ARMJIT_Compiler.cpp +++ b/src/ARMJIT_x64/ARMJIT_Compiler.cpp @@ -64,7 +64,7 @@ const BitSet32 CallerSavedPushRegs({R10, R11}); const BitSet32 CallerSavedPushRegs({R9, R10, R11}); #endif -void Compiler::PushRegs(bool saveHiRegs) +void Compiler::PushRegs(bool saveHiRegs, bool saveRegsToBeChanged, bool allowUnload) { BitSet32 loadedRegs(RegCache.LoadedRegs); @@ -83,17 +83,26 @@ void Compiler::PushRegs(bool saveHiRegs) } for (int reg : loadedRegs) - if (BitSet32(1 << RegCache.Mapping[reg]) & ABI_ALL_CALLER_SAVED) - SaveReg(reg, RegCache.Mapping[reg]); + { + if (CallerSavedPushRegs[RegCache.Mapping[reg]] + && (saveRegsToBeChanged || !((1<= 8 && reg < 15) - || BitSet32(1 << RegCache.Mapping[reg]) & ABI_ALL_CALLER_SAVED) + || (CallerSavedPushRegs[RegCache.Mapping[reg]] + && (saveRegsToBeChanged || !((1<); break; } - PopRegs(false); + PopRegs(false, false); if (allocOffset) ADD(64, R(RSP), Imm8(allocOffset)); @@ -606,7 +606,7 @@ s32 Compiler::Comp_MemAccessBlock(int rn, BitSet16 regs, bool store, bool preinc if (allocOffset) SUB(64, R(RSP), Imm8(allocOffset)); - PushRegs(false); + PushRegs(false, false, !compileFastPath); MOV(32, R(ABI_PARAM1), R(RSCRATCH4)); if (allocOffset) @@ -628,7 +628,7 @@ s32 Compiler::Comp_MemAccessBlock(int rn, BitSet16 regs, bool store, bool preinc ADD(64, R(RSP), stackAlloc <= INT8_MAX ? Imm8(stackAlloc) : Imm32(stackAlloc)); - PopRegs(false); + PopRegs(false, false); } if (compileFastPath) -- cgit v1.2.3