about summary refs log tree commit diff stats
path: root/src/dynarec/arm64/arm64_printer.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-02 20:10:00 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-02 20:10:00 +0200
commitf1f690552fc5c2d1a1db12afa2bbfcfe4300e49d (patch)
treec3021b593b0a74bbb29569de27859aa17deaba8f /src/dynarec/arm64/arm64_printer.c
parent57dcf3401c9e73a982cc0c5abdfeb0cb8b00cdb9 (diff)
downloadbox64-f1f690552fc5c2d1a1db12afa2bbfcfe4300e49d.tar.gz
box64-f1f690552fc5c2d1a1db12afa2bbfcfe4300e49d.zip
[ARM64_DYNAREC] Added AVX.66.0F38 08-0A/1C-1E/30-35/58/59/90/92/A8/A9/B8/B9 opcodes
Diffstat (limited to 'src/dynarec/arm64/arm64_printer.c')
-rw-r--r--src/dynarec/arm64/arm64_printer.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c
index 98bbcc98..9e8d10ab 100644
--- a/src/dynarec/arm64/arm64_printer.c
+++ b/src/dynarec/arm64/arm64_printer.c
@@ -930,6 +930,22 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
             snprintf(buff, sizeof(buff), "UMOV %s, %c%d.%c[%d]", a.Q?Xt[Rd]:Wt[Rd], q, Rn, s, index);

         return buff;

     }

+    // SMOV

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

+        char q = a.Q?'Q':'D';

+        char s = '?';

+        int sz=0;

+        if(a.Q==0 && immr&1) {s='B'; sz=0; }

+        else if(/*a.Q==0 &&*/ (immr&3)==2) {s='H'; sz=1; }

+        else if(/*a.Q==0 &&*/ (immr&7)==4) {s='S'; sz=2; }

+        else if(a.Q==1 && (immr&15)==8) {s='D'; sz=3; }

+        int index = (immr)>>(sz+1);

+        if(sz>2)

+            snprintf(buff, sizeof(buff), "MOV %s, %c%d.%c[%d]", a.Q?Xt[Rd]:Wt[Rd], q, Rn, s, index);

+        else

+            snprintf(buff, sizeof(buff), "SMOV %s, %c%d.%c[%d]", a.Q?Xt[Rd]:Wt[Rd], q, Rn, s, index);

+        return buff;

+    }

     // VEOR

     if(isMask(opcode, "0Q101110001mmmmm000111nnnnnddddd", &a)) {

         char q = a.Q?'Q':'D';

@@ -1303,6 +1319,20 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr)
         snprintf(buff, sizeof(buff), "F%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"MIN":"MAX", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);

         return buff;

     }

+    // FMADD

+    if(isMask(opcode, "00011111tt0mmmmmoaaaaannnnnddddd", &a)) {

+        char s = (a.t==0b00)?'S':((a.t==0b01)?'D':'?');

+        int n = (a.t==0)?1:2;

+        snprintf(buff, sizeof(buff), "FM%s V%d.%d%c, V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"SUB":"ADD", Rd, n, s, Ra, n, s, Rn, n, s, Rm, n, s);

+    }

+    // FMLA

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

+        char s = (sf==0)?'S':((sf==1)?'D':'?');

+        int n = (sf==0)?2:1;

+        n *= a.Q?2:1;

+        snprintf(buff, sizeof(buff), "FML%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", option?"S":"A", a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s);

+        return buff;

+    }

     // NEG

     if(isMask(opcode, "0Q101110ff100000101110nnnnnddddd", &a)) {

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