diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-02-13 10:07:36 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-02-13 10:07:36 +0100 |
| commit | bf212a7b528ca6e7db4abe906b7ed65177500df3 (patch) | |
| tree | 28a4593d2c093997745f53a8f8278beeab65f337 /src | |
| parent | 40d83ad882179f31876dc5a4a65f073012f3bc13 (diff) | |
| download | box64-bf212a7b528ca6e7db4abe906b7ed65177500df3.tar.gz box64-bf212a7b528ca6e7db4abe906b7ed65177500df3.zip | |
[ARM64_DYNAREC] Fixed LD1R and CBN/CBNZ printer
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/arm64_printer.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index b8fc2cc3..66aacec5 100644 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -782,17 +782,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) } if(isMask(opcode, "f0110100iiiiiiiiiiiiiiiiiiittttt", &a)) { int offset = signExtend(imm, 19)<<2; - snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset)); + snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", sf?Xt[Rt]:Wt[Rt], offset>>2, (void*)(addr + offset)); return buff; } if(isMask(opcode, "f0110101iiiiiiiiiiiiiiiiiiittttt", &a)) { int offset = signExtend(imm, 19)<<2; - snprintf(buff, sizeof(buff), "CBNZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset)); - return buff; - } - if(isMask(opcode, "f0110100iiiiiiiiiiiiiiiiiiittttt", &a)) { - int offset = signExtend(imm, 19)<<2; - snprintf(buff, sizeof(buff), "CBZ %s, #%+di\t; %p", Xt[Rt], offset>>2, (void*)(addr + offset)); + snprintf(buff, sizeof(buff), "CBNZ %s, #%+di\t; %p", sf?Xt[Rt]:Wt[Rt], offset>>2, (void*)(addr + offset)); return buff; } if(isMask(opcode, "s0110110sssssiiiiiiiiiiiiiittttt", &a)) { @@ -1594,12 +1589,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) } // LD1/ST1 single structure - if(isMask(opcode, "0Q0011010L000000cc0Sffnnnnnttttt", &a)) { + if(isMask(opcode, "0Q0011010Lo00000cc0Sffnnnnnttttt", &a)) { int scale = a.c; int idx = 0; const char* Y[] = {"B", "H", "S", "D"}; switch(scale) { - case 3: scale = sf; /* rep = 1; */ break; + case 3: scale = sf; /* rep = 1; */ idx=(8*(a.Q+1))>>scale; break; case 0: idx = (a.Q<<3) | (a.S<<2) | sf; break; case 1: idx = (a.Q<<2) | (a.S<<1) | (sf>>1); break; case 2: if(!(sf&1)) @@ -1610,7 +1605,10 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) } break; } - snprintf(buff, sizeof(buff), "%s1 {V%d.%s}[%d], [%s]", a.L?"LD":"ST", Rt, Y[scale], idx, XtSp[Rn]); + if(!option && a.L && scale==3) + snprintf(buff, sizeof(buff), "LD1R {V%d.%d%s}, [%s]", Rt, idx, Y[scale], XtSp[Rn]); + else + snprintf(buff, sizeof(buff), "%s1 {V%d.%s}[%d], [%s]", a.L?"LD":"ST", Rt, Y[scale], idx, XtSp[Rn]); return buff; } // LDUR/STUR |