about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-02-13 10:07:36 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-02-13 10:07:36 +0100
commitbf212a7b528ca6e7db4abe906b7ed65177500df3 (patch)
tree28a4593d2c093997745f53a8f8278beeab65f337 /src
parent40d83ad882179f31876dc5a4a65f073012f3bc13 (diff)
downloadbox64-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.c18
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