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-16 15:45:02 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-16 15:45:02 +0100
commitc1b6cb73027b61b5a511a6221d596f213ea6a328 (patch)
tree189c66aaae58b0a0e4c284c188e643ca3610f232 /src/dynarec/arm64_printer.c
parent70f50037845e2d368e5f47197bed28bcecf8dc85 (diff)
downloadbox64-c1b6cb73027b61b5a511a6221d596f213ea6a328.tar.gz
box64-c1b6cb73027b61b5a511a6221d596f213ea6a328.zip
[DYNAREC] Added 8B opcode
Diffstat (limited to 'src/dynarec/arm64_printer.c')
-rwxr-xr-xsrc/dynarec/arm64_printer.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index dcfa3032..56dfd5c3 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -81,6 +81,8 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
     #define shift a.h

     #define hw a.w

     #define cond a.c

+    #define immr a.r

+    #define imms a.s

     // --- LDR / STR

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

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

@@ -257,6 +259,26 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
     }

     // ---- LOGIC

 

+    // ---- SHIFT

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

+        if(sf && imms!=0b111111 && imms+1==immr)

+            snprintf(buff, sizeof(buff), "LSL %s, %s, %d", Xt[Rd], Xt[Rn], 63-imms);

+        else if(!sf && imms!=0b011111 && imms+1==immr)

+            snprintf(buff, sizeof(buff), "LSL %s, %s, %d", Wt[Rd], Wt[Rn], 31-imms);

+        else if(sf && imms==0b111111)

+            snprintf(buff, sizeof(buff), "LSR %s, %s, %d", Xt[Rd], Xt[Rn], immr);

+        else if(!sf && imms==0b011111)

+            snprintf(buff, sizeof(buff), "LSR %s, %s, %d", Wt[Rd], Wt[Rn], immr);

+        else if(immr==0 && imms==0b000111)

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

+        else if(immr==0 && imms==0b001111)

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

+        else

+            snprintf(buff, sizeof(buff), "UBFM %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], immr, imms);

+

+        return buff;

+    }

+

     // ---- BRANCH / TEST

     if(isMask(opcode, "1101011000011111000000nnnnn00000", &a)) {

         snprintf(buff, sizeof(buff), "BR %s", Xt[Rn]);