diff options
Diffstat (limited to 'src/dynarec/arm64/arm64_printer.c')
| -rw-r--r-- | src/dynarec/arm64/arm64_printer.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index 2d28a831..0b043886 100644 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -743,8 +743,12 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "BFC %s, %d, %d", sf?Xt[Rd]:Wt[Rd], lsb, width); else snprintf(buff, sizeof(buff), "BFI %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], lsb, width); - } else - snprintf(buff, sizeof(buff), "BFXIL %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], immr, imms-immr+1); + } else { + if(Rn==31 && immr==0) + snprintf(buff, sizeof(buff), "BFC %s, %d, %d", sf?Xt[Rd]:Wt[Rd], immr, imms-immr+1); + else + snprintf(buff, sizeof(buff), "BFXIL %s, %s, %d, %d", sf?Xt[Rd]:Wt[Rd], sf?Xt[Rn]:Wt[Rn], immr, imms-immr+1); + } return buff; } // ---- BRANCH / TEST @@ -1643,6 +1647,11 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "%cQXTN%s V%d.%s, V%d.%s", a.U?'U':'S', a.Q?"2":"", Rd, Vd, Rn, Va); return buff; } + if(isMask(opcode, "01U11110ff100001010010nnnnnddddd", &a)) { + const char Z[] = {'B', 'H', 'S', 'D', '?'}; + snprintf(buff, sizeof(buff), "SQXT%sN %c%d, %c%d", a.U?"U":"", Z[sf], Rn, Z[sf+1], Rm); + return buff; + } // (S/U)SSHL(2) / (U/S)XTL(2) if(isMask(opcode, "0QU011110hhhhiii101001nnnnnddddd", &a)) { |