Merge pull request #668 from pcercuei/update-lightrec-20220607
[pcsx_rearmed.git] / deps / lightrec / disassembler.c
index 43ac677..9b2dbd5 100644 (file)
@@ -213,6 +213,9 @@ static int print_op_special(union code c, char *buf, size_t len,
                                lightrec_reg_name(c.r.rt),
                                lightrec_reg_name(c.r.rs));
        case OP_SPECIAL_JR:
+               *flags_ptr = opcode_branch_flags;
+               *nb_flags = ARRAY_SIZE(opcode_branch_flags);
+               fallthrough;
        case OP_SPECIAL_MTHI:
        case OP_SPECIAL_MTLO:
                return snprintf(buf, len, "%s%s",
@@ -300,6 +303,8 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
                                pc + 4 + ((s16)c.i.imm << 2));
        case OP_J:
        case OP_JAL:
+               *flags_ptr = opcode_branch_flags;
+               *nb_flags = ARRAY_SIZE(opcode_branch_flags);
                return snprintf(buf, len, "%s0x%x",
                                std_opcodes[c.i.op],
                                (pc & 0xf0000000) | (c.j.imm << 2));
@@ -382,22 +387,23 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
        }
 }
 
-void lightrec_print_disassembly(const struct block *block, const u32 *code)
+void lightrec_print_disassembly(const struct block *block, const u32 *code_ptr)
 {
        const struct opcode *op;
        const char **flags_ptr;
        size_t nb_flags, count, count2;
        char buf[256], buf2[256], buf3[256];
        unsigned int i;
-       u32 pc, branch_pc;
+       u32 pc, branch_pc, code;
        bool is_io;
 
        for (i = 0; i < block->nb_ops; i++) {
                op = &block->opcode_list[i];
                branch_pc = get_branch_pc(block, i, 0);
                pc = block->pc + (i << 2);
+               code = LE32TOH(code_ptr[i]);
 
-               count = print_op((union code)code[i], pc, buf, sizeof(buf),
+               count = print_op((union code)code, pc, buf, sizeof(buf),
                                 &flags_ptr, &nb_flags, &is_io);
 
                flags_ptr = NULL;
@@ -406,7 +412,7 @@ void lightrec_print_disassembly(const struct block *block, const u32 *code)
                count2 = print_op(op->c, branch_pc, buf2, sizeof(buf2),
                                  &flags_ptr, &nb_flags, &is_io);
 
-               if (code[i] == op->c.opcode) {
+               if (code == op->c.opcode) {
                        *buf2 = '\0';
                        count2 = 0;
                }