about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64_printer.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index ac29d0a9..43d84daa 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -180,10 +180,22 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
     }

     if(isMask(opcode, "0x011000iiiiiiiiiiiiiiiiiiittttt", &a)) {

         int size = ((opcode>>30)&1)?3:2;

-        int offset = signExtend(imm, 9)<<size;

+        int offset = signExtend(imm, 19)<<2;

         snprintf(buff, sizeof(buff), "LDR %s, [#%+d]\t;%p", (size==2)?Wt[Rt]:Xt[Rt], offset, (void*)(addr+offset));

         return buff;

     }

+    if(isMask(opcode, "10011000iiiiiiiiiiiiiiiiiiittttt", &a)) {

+        int offset = signExtend(imm, 19)<<2;

+        snprintf(buff, sizeof(buff), "LDRSW %s, [#%+d]\t;%p", Xt[Rt], offset, (void*)(addr+offset));

+        return buff;

+    }

+    if(isMask(opcode, "ff011100iiiiiiiiiiiiiiiiiiittttt", &a)) {

+        int size = ((opcode>>30)&1)?3:2;

+        int offset = signExtend(imm, 19)<<2;

+        const char* Y[] = {"S", "D", "Q", "?"};

+        snprintf(buff, sizeof(buff), "LDR %s%d, [#%+d]\t;%p", Y[sf], Rt, offset, (void*)(addr+offset));

+        return buff;

+    }

     if(isMask(opcode, "1x111000011mmmmmoooS10nnnnnttttt", &a)) {

         int size = (opcode>>30)&3;

         const char* extend[] = {"?0", "?1", "UXTW", "LSL", "?4", "?5", "SXTW", "SXTX"};