diff options
Diffstat (limited to 'src/ARMJIT_A64/ARMJIT_LoadStore.cpp')
-rw-r--r-- | src/ARMJIT_A64/ARMJIT_LoadStore.cpp | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp index 2c14dc6..3d30759 100644 --- a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp +++ b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp @@ -472,31 +472,24 @@ s32 Compiler::Comp_MemAccessBlock(int rn, BitSet16 regs, bool store, bool preinc bool compileFastPath = Config::JIT_FastMemory && store && !usermode && (CurInstr.Cond() < 0xE || ARMJIT_Memory::IsFastmemCompatible(expectedTarget)); - if (decrement) { - s32 offset = -regsCount * 4 + (preinc ? 0 : 4); + s32 offset = decrement + ? -regsCount * 4 + (preinc ? 0 : 4) + : (preinc ? 4 : 0); + if (offset) - { ADDI2R(W0, MapReg(rn), offset); - ANDI2R(W0, W0, ~3); - } - else - { + else if (compileFastPath) ANDI2R(W0, MapReg(rn), ~3); - } - } - else - { - ANDI2R(W0, MapReg(rn), ~3); - if (preinc) - ADD(W0, W0, 4); + else + MOV(W0, MapReg(rn)); } u8* patchFunc; if (compileFastPath) { ptrdiff_t fastPathStart = GetCodeOffset(); - ptrdiff_t loadStoreOffsets[16]; + ptrdiff_t loadStoreOffsets[8]; MOVP2R(X1, Num == 0 ? ARMJIT_Memory::FastMem9Start : ARMJIT_Memory::FastMem7Start); ADD(X1, X1, X0); @@ -547,16 +540,19 @@ s32 Compiler::Comp_MemAccessBlock(int rn, BitSet16 regs, bool store, bool preinc LoadReg(nextReg, second); loadStoreOffsets[i++] = GetCodeOffset(); - if (store) + { STP(INDEX_SIGNED, first, second, X1, offset); + } else + { LDP(INDEX_SIGNED, first, second, X1, offset); - - if (!(RegCache.LoadedRegs & (1 << reg)) && !store) - SaveReg(reg, first); - if (!(RegCache.LoadedRegs & (1 << nextReg)) && !store) - SaveReg(nextReg, second); + + if (!(RegCache.LoadedRegs & (1 << reg))) + SaveReg(reg, first); + if (!(RegCache.LoadedRegs & (1 << nextReg))) + SaveReg(nextReg, second); + } offset += 8; } @@ -566,7 +562,8 @@ s32 Compiler::Comp_MemAccessBlock(int rn, BitSet16 regs, bool store, bool preinc SwapCodeRegion(); patchFunc = (u8*)GetRXPtr(); patch.PatchFunc = patchFunc; - for (i = 0; i < regsCount; i++) + u32 numLoadStores = i; + for (i = 0; i < numLoadStores; i++) { patch.PatchOffset = fastPathStart - loadStoreOffsets[i]; LoadStorePatches[loadStoreOffsets[i]] = patch; |