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-31 11:05:02 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-31 11:05:02 +0200
commit424a08607cdb4bb03e1ba2c443adae55db72243c (patch)
tree6c07389f8c77baa4506048c9e844e2d3376043af /src/dynarec/arm64_printer.c
parent0d2a060e663b092b7c966a2a720b380f21e0a38f (diff)
downloadbox64-424a08607cdb4bb03e1ba2c443adae55db72243c.tar.gz
box64-424a08607cdb4bb03e1ba2c443adae55db72243c.zip
[DYNAREC] Added 66 0F F6 opcode
Diffstat (limited to 'src/dynarec/arm64_printer.c')
-rwxr-xr-xsrc/dynarec/arm64_printer.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c
index d7c52e97..606271af 100755
--- a/src/dynarec/arm64_printer.c
+++ b/src/dynarec/arm64_printer.c
@@ -1137,6 +1137,36 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         return buff;

     }

 

+    // Absolute Difference

+    // SABA / SABD / UABA / UABD

+    if(isMask(opcode, "0QU01110ff1mmmmm0111c1nnnnnddddd", &a)) {

+        const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "???"};

+        const char* Vd = Y[(sf<<1) | a.Q];

+        snprintf(buff, sizeof(buff), "%cAB%c V%d.%s, V%d.%s, V%d.%s", a.U?'U':'S', a.c?'A':'D', Rd, Vd, Rn, Vd, Rm, Vd);

+        return buff;

+    }

+    if(isMask(opcode, "0QU01110ff1mmmmm01c100nnnnnddddd", &a)) {

+        const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "???"};

+        const char* Vd = Y[(sf<<1) | a.Q];

+        const char* Z[] = {"8H", "4S", "2D", "?"};

+        const char* Va = Y[(sf<<1)];

+        snprintf(buff, sizeof(buff), "%cAB%cL%s V%d.%s, V%d.%s, V%d.%s", a.U?'U':'S', a.c?'A':'D', a.Q?"2":"", Rd, Va, Rn, Vd, Rm, Vd);

+        return buff;

+    }

+    // Add pair / accros vector

+    if(isMask(opcode, "0QU01110ff1000000c1010nnnnnddddd", &a)) {

+        const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "???"};

+        const char* Vd = Y[(sf<<1) | a.Q];

+        snprintf(buff, sizeof(buff), "%cAD%cLP V%d.%s, V%d.%s", a.U?'U':'S', a.c?'A':'D', Rd, Vd, Rn, Vd);

+        return buff;

+    }

+    if(isMask(opcode, "0QU01110ff110000001110nnnnnddddd", &a)) {

+        const char* Y[] = {"8B", "16B", "4H", "8H", "2S", "4S", "??", "???"};

+        const char* Vd = Y[(sf<<1) | a.Q];

+        const char* Z[] = {"H", "S", "D", "?"};

+        snprintf(buff, sizeof(buff), "%cADDLV V%d.%s, V%d.%s", a.U?'U':'S', Rd, Z[sf], Rn, Vd);

+        return buff;

+    }

 

 

     snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(opcode));