From 718491c56dc7279dbb9dc70cdeb7aaee9dbe6669 Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 19 Sep 2019 10:39:28 +0300 Subject: [PATCH] ppu disasm: Improve BC formatting --- rpcs3/Emu/Cell/PPUDisAsm.cpp | 68 ++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUDisAsm.cpp b/rpcs3/Emu/Cell/PPUDisAsm.cpp index 7a2b925823..acdd8d2690 100644 --- a/rpcs3/Emu/Cell/PPUDisAsm.cpp +++ b/rpcs3/Emu/Cell/PPUDisAsm.cpp @@ -804,93 +804,109 @@ void PPUDisAsm::BC(ppu_opcode_t op) return; } - //TODO: aa lk const u8 bo0 = (bo & 0x10) ? 1 : 0; const u8 bo1 = (bo & 0x08) ? 1 : 0; const u8 bo2 = (bo & 0x04) ? 1 : 0; const u8 bo3 = (bo & 0x02) ? 1 : 0; const u8 bo4 = (bo & 0x01) ? 1 : 0; + std::add_pointer_t inst{""}, sign = inst; + if (bo0 && !bo1 && !bo2 && bo3 && !bo4) { - DisAsm_CR_BRANCH("bdz", bi / 4, bd); return; + inst = "bdz"; } else if (bo0 && bo1 && !bo2 && bo3 && !bo4) { - DisAsm_CR_BRANCH("bdz-", bi / 4, bd); return; + inst = "bdz", sign = "-"; } else if (bo0 && bo1 && !bo2 && bo3 && bo4) { - DisAsm_CR_BRANCH("bdz+", bi / 4, bd); return; + inst = "bdz", sign = "+"; } else if (bo0 && !bo1 && !bo2 && !bo3 && !bo4) { - DisAsm_CR_BRANCH("bdnz", bi / 4, bd); return; + inst = "bdnz"; } else if (bo0 && bo1 && !bo2 && !bo3 && !bo4) { - DisAsm_CR_BRANCH("bdnz-", bi / 4, bd); return; + inst = "bdnz", sign = "-"; } else if (bo0 && bo1 && !bo2 && !bo3 && bo4) { - DisAsm_CR_BRANCH("bdnz+", bi / 4, bd); return; + inst = "bdnz", sign = "+"; } else if (!bo0 && !bo1 && bo2 && !bo3 && !bo4) { switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("bge", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("ble", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("bne", bi / 4, bd); return; + case 0x0: inst = "bge"; break; + case 0x1: inst = "ble"; break; + case 0x2: inst = "bne"; break; + case 0x3: inst = "bns"; break; } } else if (!bo0 && !bo1 && bo2 && bo3 && !bo4) { + sign = "-"; switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("bge-", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("ble-", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("bne-", bi / 4, bd); return; + case 0x0: inst = "bge"; break; + case 0x1: inst = "ble"; break; + case 0x2: inst = "bne"; break; + case 0x3: inst = "bns"; break; } } else if (!bo0 && !bo1 && bo2 && bo3 && bo4) { + sign = "+"; switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("bge+", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("ble+", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("bne+", bi / 4, bd); return; + case 0x0: inst = "bge"; break; + case 0x1: inst = "ble"; break; + case 0x2: inst = "bne"; break; + case 0x3: inst = "bns"; break; } } else if (!bo0 && bo1 && bo2 && !bo3 && !bo4) { switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("blt", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("bgt", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("beq", bi / 4, bd); return; + case 0x0: inst = "blt"; break; + case 0x1: inst = "bgt"; break; + case 0x2: inst = "beq"; break; + case 0x3: inst = "bso"; break; } } else if (!bo0 && bo1 && bo2 && bo3 && !bo4) { + sign = "-"; switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("blt-", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("bgt-", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("beq-", bi / 4, bd); return; + case 0x0: inst = "blt"; break; + case 0x1: inst = "bgt"; break; + case 0x2: inst = "beq"; break; + case 0x3: inst = "bso"; break; } } else if (!bo0 && bo1 && bo2 && bo3 && bo4) { + sign = "+"; switch (bi % 4) { - case 0x0: DisAsm_CR_BRANCH("blt+", bi / 4, bd); return; - case 0x1: DisAsm_CR_BRANCH("bgt+", bi / 4, bd); return; - case 0x2: DisAsm_CR_BRANCH("beq+", bi / 4, bd); return; + case 0x0: inst = "blt"; break; + case 0x1: inst = "bgt"; break; + case 0x2: inst = "beq"; break; + case 0x3: inst = "bso"; break; } } - Write(fmt::format("bc [%x:%x:%x:%x:%x], cr%d[%x], 0x%x, %d, %d", bo0, bo1, bo2, bo3, bo4, bi / 4, bi % 4, bd, aa, lk)); + if (inst[0] == '\0') + { + return Write(fmt::format("bc 0x%x, 0x%x, 0x%x, %d, %d", bo, bi, bd, aa, lk)); + } + + DisAsm_CR_BRANCH(std::string(inst) + (lk ? "l" : "") + (aa ? "a" : "") + sign, bi / 4, bd); } void PPUDisAsm::SC(ppu_opcode_t op)