about summary refs log tree commit diff stats
path: root/src/dynarec/arm64_printer.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-18 16:03:08 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-18 16:03:08 +0100
commitbd46fd7d4f6288277384e708ad59d3e70dfd71fa (patch)
tree88d713aae0284246fdb27f7feb6890acb106563d /src/dynarec/arm64_printer.c
parentcb25e077f99e608ecce1f8358ea9f33421a1e810 (diff)
downloadbox64-bd46fd7d4f6288277384e708ad59d3e70dfd71fa.tar.gz
box64-bd46fd7d4f6288277384e708ad59d3e70dfd71fa.zip
[DYNAREC] Fixed and32 emiter and some printer (vvvvvv works, but still not IntoTheBreach)
Diffstat (limited to 'src/dynarec/arm64_printer.c')
-rwxr-xr-xsrc/dynarec/arm64_printer.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index 0f9abb55..d92766ef 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -400,6 +400,15 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
             snprintf(buff, sizeof(buff), "ORR %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm);

         return buff;

     }

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

+        uint64_t i = DecodeBitMasks(a.N, imms, immr);

+        if(!sf) i&=0xffffffff;

+        if(sf==0 && a.N==1)

+            snprintf(buff, sizeof(buff), "invalid EOR %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);

+        else

+            snprintf(buff, sizeof(buff), "EOR %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);

+        return buff;

+    }

     if(isMask(opcode, "f1001010hh0mmmmmiiiiiinnnnnddddd", &a)) {

         const char* shifts[] = { "LSL", "LSR", "ASR", "ROR" };

         if(shift==0 && imm==0)

@@ -408,6 +417,23 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
             snprintf(buff, sizeof(buff), "EOR %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm);

         return buff;

     }

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

+        uint64_t i = DecodeBitMasks(a.N, imms, immr);

+        if(!sf) i&=0xffffffff;

+        if(sf==0 && a.N==1)

+            snprintf(buff, sizeof(buff), "invalid AND %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i);

+        else

+            snprintf(buff, sizeof(buff), "AND %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i);

+        return buff;

+    }

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

+        const char* shifts[] = { "LSL", "LSR", "ASR", "ROR" };

+        if(shift==0 && imm==0)

+            snprintf(buff, sizeof(buff), "AND %s, %s, %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm]);

+        else

+            snprintf(buff, sizeof(buff), "AND %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm);

+        return buff;

+    }

 

     // ---- SHIFT

     if(isMask(opcode, "f10100110Nrrrrrrssssssnnnnnddddd", &a)) {