diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 22:08:58 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 22:08:58 +0100 |
| commit | 8bd81dffcfa97a0014ec64efdbfc411fa144524f (patch) | |
| tree | 04f6f2e97333dcb222874975dbba526f10b18145 /src/dynarec/arm64_printer.c | |
| parent | 79ca411d6a5d35e66842b3886d2c6077ef85b58a (diff) | |
| download | box64-8bd81dffcfa97a0014ec64efdbfc411fa144524f.tar.gz box64-8bd81dffcfa97a0014ec64efdbfc411fa144524f.zip | |
[DYNAREC] Complete 81/833 opcodes, plus various bugfixes
Diffstat (limited to 'src/dynarec/arm64_printer.c')
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index 46e1feae..b068b9d8 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -265,7 +265,17 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) else snprintf(buff, sizeof(buff), "STR%c %s, [%s]", size?'H':'B', Xt[Rt], XtSp[Rn]); return buff; - } // --- MOV (REGS: see Logic MOV==ORR, MVN==ORN) + } + if(isMask(opcode, "1011100110iiiiiiiiiiiinnnnnttttt", &a)) { + int offset = imm<<2; + if(!offset) + snprintf(buff, sizeof(buff), "LDRSW %s, [%s]", Xt[Rt], XtSp[Rn]); + else + snprintf(buff, sizeof(buff), "LDRSW %s, [%s, #%d]", Xt[Rt], XtSp[Rn], offset); + return buff; + } + + // --- MOV (REGS: see Logic MOV==ORR, MVN==ORN) if(isMask(opcode, "f10100101wwiiiiiiiiiiiiiiiiddddd", &a)) { if(!hw) snprintf(buff, sizeof(buff), "MOVZ %s, 0x%x", sf?Xt[Rd]:Wt[Rd], imm); @@ -582,6 +592,11 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) return buff; } + if(isMask(opcode, "f0011010110mmmmm001011nnnnnddddd", &a)) { + snprintf(buff, sizeof(buff), "ROR %s, %s, %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm]); + return buff; + } + if(isMask(opcode, "f0011010110mmmmm001001nnnnnddddd", &a)) { snprintf(buff, sizeof(buff), "LSR %s, %s, %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm]); return buff; @@ -893,6 +908,28 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) return buff; } + // FMOV + if(isMask(opcode, "00011110pp100000010000nnnnnddddd", &a)) { + int type = a.p; + char s = (type==0)?'S':((type==1)?'D':'?'); + snprintf(buff, sizeof(buff), "FMOV %c%d, %c%d", s, Rd, s, Rn); + return buff; + } + if(isMask(opcode, "f0011110pp10x11c000000nnnnnddddd", &a)) { + int type = a.p; + int rmode = a.x; + int opcd = 6+a.c; + if(sf==0 && type==0 && rmode==0 && opcd==7) {snprintf(buff, sizeof(buff), "FMOV S%d, %s", Rd, Wt[Rn]);} + else if(sf==0 && type==0 && rmode==0 && opcd==6) {snprintf(buff, sizeof(buff), "FMOV %s, S%d", Wt[Rn], Rd);} + else if(sf==1 && type==1 && rmode==0 && opcd==7) {snprintf(buff, sizeof(buff), "FMOV D%d, %s", Rd, Xt[Rn]);} + else if(sf==1 && type==2 && rmode==1 && opcd==7) {snprintf(buff, sizeof(buff), "FMOV V%d.D[1], %s", Rd, Xt[Rn]);} + else if(sf==1 && type==1 && rmode==0 && opcd==6) {snprintf(buff, sizeof(buff), "FMOV %s, S%d", Xt[Rn], Rd);} + else if(sf==1 && type==2 && rmode==1 && opcd==6) {snprintf(buff, sizeof(buff), "FMOV %s, V%d.D[1]", Xt[Rn], Rd);} + else snprintf(buff, sizeof(buff), "FMOV ????"); + return buff; + } + + snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(opcode)); return buff; |