spu: don't leave garbage in capture buffers
[pcsx_rearmed.git] / deps / lightrec / disassembler.c
index bef9594..5111d17 100644 (file)
@@ -40,6 +40,10 @@ static const char * const std_opcodes[] = {
        [OP_SWR]                = "swr     ",
        [OP_LWC2]               = "lwc2    ",
        [OP_SWC2]               = "swc2    ",
+       [OP_META_MULT2]         = "mult2   ",
+       [OP_META_MULTU2]        = "multu2  ",
+       [OP_META_LWU]           = "lwu     ",
+       [OP_META_SWU]           = "swu     ",
 };
 
 static const char * const special_opcodes[] = {
@@ -120,6 +124,13 @@ static const char * const cp2_opcodes[] = {
        [OP_CP2_NCCT]           = "ncct    ",
 };
 
+static const char * const meta_opcodes[] = {
+       [OP_META_MOV]           = "move    ",
+       [OP_META_EXTC]          = "extc    ",
+       [OP_META_EXTS]          = "exts    ",
+       [OP_META_COM]           = "com     ",
+};
+
 static const char * const mult2_opcodes[] = {
        "mult2   ", "multu2  ",
 };
@@ -133,6 +144,7 @@ static const char * const opcode_io_flags[] = {
        "self-modifying code",
        "no invalidation",
        "no mask",
+       "load delay",
 };
 
 static const char * const opcode_io_modes[] = {
@@ -149,6 +161,10 @@ static const char * const opcode_branch_flags[] = {
        "local branch",
 };
 
+static const char * const opcode_movi_flags[] = {
+       "movi",
+};
+
 static const char * const opcode_multdiv_flags[] = {
        "No LO",
        "No HI",
@@ -395,10 +411,13 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
                                pc + 4 + ((s16)c.i.imm << 2));
        case OP_ADDI:
        case OP_ADDIU:
+       case OP_ORI:
+               *flags_ptr = opcode_movi_flags;
+               *nb_flags = ARRAY_SIZE(opcode_movi_flags);
+               fallthrough;
        case OP_SLTI:
        case OP_SLTIU:
        case OP_ANDI:
-       case OP_ORI:
        case OP_XORI:
                return snprintf(buf, len, "%s%s,%s,0x%04hx",
                                std_opcodes[c.i.op],
@@ -407,6 +426,8 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
                                (u16)c.i.imm);
 
        case OP_LUI:
+               *flags_ptr = opcode_movi_flags;
+               *nb_flags = ARRAY_SIZE(opcode_movi_flags);
                return snprintf(buf, len, "%s%s,0x%04hx",
                                std_opcodes[c.i.op],
                                lightrec_reg_name(c.i.rt),
@@ -427,6 +448,8 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
        case OP_SWL:
        case OP_SW:
        case OP_SWR:
+       case OP_META_LWU:
+       case OP_META_SWU:
                *flags_ptr = opcode_io_flags;
                *nb_flags = ARRAY_SIZE(opcode_io_flags);
                *is_io = true;
@@ -444,18 +467,11 @@ static int print_op(union code c, u32 pc, char *buf, size_t len,
                                lightrec_reg_name(c.i.rt),
                                (s16)c.i.imm,
                                lightrec_reg_name(c.i.rs));
-       case OP_META_MOV:
-               return snprintf(buf, len, "move    %s,%s",
-                               lightrec_reg_name(c.r.rd),
-                               lightrec_reg_name(c.r.rs));
-       case OP_META_EXTC:
-               return snprintf(buf, len, "extc    %s,%s",
-                               lightrec_reg_name(c.i.rt),
-                               lightrec_reg_name(c.i.rs));
-       case OP_META_EXTS:
-               return snprintf(buf, len, "exts    %s,%s",
-                               lightrec_reg_name(c.i.rt),
-                               lightrec_reg_name(c.i.rs));
+       case OP_META:
+               return snprintf(buf, len, "%s%s,%s",
+                               meta_opcodes[c.m.op],
+                               lightrec_reg_name(c.m.rd),
+                               lightrec_reg_name(c.m.rs));
        case OP_META_MULT2:
        case OP_META_MULTU2:
                *flags_ptr = opcode_multdiv_flags;