diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-18 16:03:08 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-18 16:03:08 +0100 |
| commit | bd46fd7d4f6288277384e708ad59d3e70dfd71fa (patch) | |
| tree | 88d713aae0284246fdb27f7feb6890acb106563d /src/dynarec/arm64_printer.c | |
| parent | cb25e077f99e608ecce1f8358ea9f33421a1e810 (diff) | |
| download | box64-bd46fd7d4f6288277384e708ad59d3e70dfd71fa.tar.gz box64-bd46fd7d4f6288277384e708ad59d3e70dfd71fa.zip | |
[DYNAREC] Fixed and32 emiter and some printer (vvvvvv works, but still not IntoTheBreach)
Diffstat (limited to 'src/dynarec/arm64_printer.c')
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index 0f9abb55..d92766ef 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -400,6 +400,15 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "ORR %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm); return buff; } + if(isMask(opcode, "f10100100Nrrrrrrssssssnnnnnddddd", &a)) { + uint64_t i = DecodeBitMasks(a.N, imms, immr); + if(!sf) i&=0xffffffff; + if(sf==0 && a.N==1) + snprintf(buff, sizeof(buff), "invalid EOR %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i); + else + snprintf(buff, sizeof(buff), "EOR %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i); + return buff; + } if(isMask(opcode, "f1001010hh0mmmmmiiiiiinnnnnddddd", &a)) { const char* shifts[] = { "LSL", "LSR", "ASR", "ROR" }; if(shift==0 && imm==0) @@ -408,6 +417,23 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "EOR %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm); return buff; } + if(isMask(opcode, "f00100100Nrrrrrrssssssnnnnnddddd", &a)) { + uint64_t i = DecodeBitMasks(a.N, imms, immr); + if(!sf) i&=0xffffffff; + if(sf==0 && a.N==1) + snprintf(buff, sizeof(buff), "invalid AND %s, %s, 0x%lx", Wt[Rd], Wt[Rn], i); + else + snprintf(buff, sizeof(buff), "AND %s, %s, 0x%lx", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], i); + return buff; + } + if(isMask(opcode, "f0001010hh0mmmmmiiiiiinnnnnddddd", &a)) { + const char* shifts[] = { "LSL", "LSR", "ASR", "ROR" }; + if(shift==0 && imm==0) + snprintf(buff, sizeof(buff), "AND %s, %s, %s", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm]); + else + snprintf(buff, sizeof(buff), "AND %s, %s, %s, %s %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], sf?Xt[Rm]:Wt[Rm], shifts[shift], imm); + return buff; + } // ---- SHIFT if(isMask(opcode, "f10100110Nrrrrrrssssssnnnnnddddd", &a)) { |