diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 20:10:00 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 20:10:00 +0200 |
| commit | f1f690552fc5c2d1a1db12afa2bbfcfe4300e49d (patch) | |
| tree | c3021b593b0a74bbb29569de27859aa17deaba8f /src/dynarec/arm64/arm64_printer.c | |
| parent | 57dcf3401c9e73a982cc0c5abdfeb0cb8b00cdb9 (diff) | |
| download | box64-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.c | 30 |
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"}; |