diff options
author | RSDuck <rsduck@users.noreply.github.com> | 2021-01-19 23:49:32 +0100 |
---|---|---|
committer | RSDuck <rsduck@users.noreply.github.com> | 2021-01-19 23:50:08 +0100 |
commit | 771dfaca2e3851217287aa73423eb6ec6d6b4360 (patch) | |
tree | e2917b8770e6cf9354bff9d89f3ae0455f4a15d4 /src/ARMJIT_A64/ARMJIT_LoadStore.cpp | |
parent | 31c9d116bd9a1e16fccc2e7a974d4a7410f7da90 (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.cpp | 12 |
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); |