diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 14 |
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"}; |