diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-06 18:01:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-06 18:01:51 +0200 |
| commit | 49392992dae0aac9083ee7a5923b4540ffd51abd (patch) | |
| tree | 8f2a574206a09b6327832879820ced636398c942 /src | |
| parent | 545c303058dcc9f43b6916e4635d1d9c03eaefca (diff) | |
| download | box64-49392992dae0aac9083ee7a5923b4540ffd51abd.tar.gz box64-49392992dae0aac9083ee7a5923b4540ffd51abd.zip | |
[ARM64_DYNAREC] Fixed/improved printer
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_printer.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index a2602429..2c499ea4 100755 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -1095,6 +1095,16 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "FCMP %c%d, %c%d", s, Rn, s, Rm); return buff; } + //FCMP vector + if(isMask(opcode, "0QU01110cf1mmmmm111001nnnnnddddd", &a)) { + char s = (sf==0)?'S':((sf==1)?'D':'?'); + int n = (sf==0)?2:1; + n *= a.Q?2:1; + int op = (a.c<<1) | (a.U); + const char* OP[] = {"EQ", "GE", "??", "GT"}; + snprintf(buff, sizeof(buff), "FCMP%s%s V%d.%d%c, V%d.%d%c, V%d.%d%c", OP[op], a.Q?"Q":"", Rd, n, s, Rn, n, s, Rm, n, s); + return buff; + } //FMIN/FMAX if(isMask(opcode, "00011110ff1mmmmm01oo10nnnnnddddd", &a)) { char s = (sf==0)?'S':((sf==1)?'D':'?'); @@ -1108,6 +1118,13 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "F%sNM%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; } + if(isMask(opcode, "0Q001110of1mmmmm111101nnnnnddddd", &a)) { + char s = (sf==0)?'S':((sf==1)?'D':'?'); + int n = (sf==0)?2:1; + n *= a.Q?2:1; + 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; + } // FCVT if(isMask(opcode, "f0011110pp10010U000000nnnnnddddd", &a)) { @@ -1319,9 +1336,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) sz = 4; int offset = signExtend(imm, 9); if(!offset) - snprintf(buff, sizeof(buff), "%sUR %s%d, [%s]", a.L?"LD":"ST", Y[sz], Rd, XtSp[Rn]); + snprintf(buff, sizeof(buff), "%sUR %s%d, [%s]", a.L?"LD":"ST", Y[sz], Rt, XtSp[Rn]); else - snprintf(buff, sizeof(buff), "%sUR %s%d, [%s, %+d]", a.L?"LD":"ST", Y[sz], Rd, XtSp[Rn], imm); + snprintf(buff, sizeof(buff), "%sUR %s%d, [%s, %s0x%x]", a.L?"LD":"ST", Y[sz], Rt, XtSp[Rn], (offset<0)?"-":"", abs(offset)); return buff; } // LDR/STR vector immediate @@ -1332,9 +1349,9 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) sz = 4; int offset = imm<<sz; if(!offset) - snprintf(buff, sizeof(buff), "%sR %s%d, [%s]", a.L?"LD":"ST", Y[sz], Rd, XtSp[Rn]); + snprintf(buff, sizeof(buff), "%sR %s%d, [%s]", a.L?"LD":"ST", Y[sz], Rt, XtSp[Rn]); else - snprintf(buff, sizeof(buff), "%sR %s%d, [%s, %+d]", a.L?"LD":"ST", Y[sz], Rd, XtSp[Rn], imm); + snprintf(buff, sizeof(buff), "%sR %s%d, [%s, %+d]", a.L?"LD":"ST", Y[sz], Rt, XtSp[Rn], imm); return buff; } |