aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
diff options
context:
space:
mode:
authorRSDuck <rsduck@users.noreply.github.com>2021-01-19 23:49:32 +0100
committerRSDuck <rsduck@users.noreply.github.com>2021-01-19 23:50:08 +0100
commit771dfaca2e3851217287aa73423eb6ec6d6b4360 (patch)
treee2917b8770e6cf9354bff9d89f3ae0455f4a15d4 /src/ARMJIT_A64/ARMJIT_LoadStore.cpp
parent31c9d116bd9a1e16fccc2e7a974d4a7410f7da90 (diff)
JIT: handle STR post with rd == rn
fixes Zelda Four Swords
Diffstat (limited to 'src/ARMJIT_A64/ARMJIT_LoadStore.cpp')
-rw-r--r--src/ARMJIT_A64/ARMJIT_LoadStore.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
index 3d30759..a622a92 100644
--- a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
+++ b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
@@ -116,6 +116,12 @@ void Compiler::Comp_MemAccess(int rd, int rn, Op2 offset, int size, int flags)
rnMapped = W3;
}
+ if (flags & memop_Store && flags & (memop_Post|memop_Writeback) && rd == rn)
+ {
+ MOV(W4, rdMapped);
+ rdMapped = W4;
+ }
+
ARM64Reg finalAddr = W0;
if (flags & memop_Post)
{
@@ -170,10 +176,10 @@ void Compiler::Comp_MemAccess(int rd, int rn, Op2 offset, int size, int flags)
ptrdiff_t memopStart = GetCodeOffset();
LoadStorePatch patch;
+ assert((rdMapped >= W19 && rdMapped <= W26) || rdMapped == W4);
patch.PatchFunc = flags & memop_Store
- ? PatchedStoreFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][rdMapped - W19]
- : PatchedLoadFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][!!(flags & memop_SignExtend)][rdMapped - W19];
- assert(rdMapped - W19 >= 0 && rdMapped - W19 < 8);
+ ? PatchedStoreFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][rdMapped]
+ : PatchedLoadFuncs[NDS::ConsoleType][Num][__builtin_ctz(size) - 3][!!(flags & memop_SignExtend)][rdMapped];
MOVP2R(X7, Num == 0 ? ARMJIT_Memory::FastMem9Start : ARMJIT_Memory::FastMem7Start);