From 0a6382c3860cd0b24a5661753d1be88b559b6ff2 Mon Sep 17 00:00:00 2001 From: Ran-j Date: Tue, 15 Apr 2025 15:58:34 -0300 Subject: [PATCH] feat: added more instruction parser --- ps2xRecomp/include/ps2recomp/instructions.h | 4 +- ps2xRecomp/src/code_generator.cpp | 126 ++++---------------- 2 files changed, 24 insertions(+), 106 deletions(-) diff --git a/ps2xRecomp/include/ps2recomp/instructions.h b/ps2xRecomp/include/ps2recomp/instructions.h index 7d57f89..94e1f4e 100644 --- a/ps2xRecomp/include/ps2recomp/instructions.h +++ b/ps2xRecomp/include/ps2recomp/instructions.h @@ -69,7 +69,9 @@ namespace ps2recomp OPCODE_SCD = 0x3C, OPCODE_SDC1 = 0x3D, OPCODE_SDC2 = 0x3E, - OPCODE_SD = 0x3F + OPCODE_SD = 0x3F, + OPCODE_LQC2 = 0x36, + OPCODE_SQC2 = 0x3E }; // SPECIAL function codes diff --git a/ps2xRecomp/src/code_generator.cpp b/ps2xRecomp/src/code_generator.cpp index f029636..53c20ae 100644 --- a/ps2xRecomp/src/code_generator.cpp +++ b/ps2xRecomp/src/code_generator.cpp @@ -462,111 +462,7 @@ namespace ps2recomp switch (inst.opcode) { case OPCODE_SPECIAL: - switch (inst.function) - { - case SPECIAL_SLL: - if (inst.rd == 0 && inst.rt == 0 && inst.sa == 0) - { - return "// NOP"; - } - return fmt::format("ctx->r[{}] = SLL32(ctx->r[{}], {});", - inst.rd, inst.rt, inst.sa); - - case SPECIAL_SRL: - return fmt::format("ctx->r[{}] = SRL32(ctx->r[{}], {});", - inst.rd, inst.rt, inst.sa); - - case SPECIAL_SRA: - return fmt::format("ctx->r[{}] = SRA32(ctx->r[{}], {});", - inst.rd, inst.rt, inst.sa); - - case SPECIAL_SLLV: - return fmt::format("ctx->r[{}] = SLL32(ctx->r[{}], ctx->r[{}] & 0x1F);", - inst.rd, inst.rt, inst.rs); - - case SPECIAL_SRLV: - return fmt::format("ctx->r[{}] = SRL32(ctx->r[{}], ctx->r[{}] & 0x1F);", - inst.rd, inst.rt, inst.rs); - - case SPECIAL_SRAV: - return fmt::format("ctx->r[{}] = SRA32(ctx->r[{}], ctx->r[{}] & 0x1F);", - inst.rd, inst.rt, inst.rs); - - case SPECIAL_MFHI: - return fmt::format("ctx->r[{}] = ctx->hi;", inst.rd); - - case SPECIAL_MTHI: - return fmt::format("ctx->hi = ctx->r[{}];", inst.rs); - - case SPECIAL_MFLO: - return fmt::format("ctx->r[{}] = ctx->lo;", inst.rd); - - case SPECIAL_MTLO: - return fmt::format("ctx->lo = ctx->r[{}];", inst.rs); - - case SPECIAL_MULT: - return fmt::format("{{ int64_t result = (int64_t)(int32_t)ctx->r[{}] * (int64_t)(int32_t)ctx->r[{}]; ctx->lo = (uint32_t)result; ctx->hi = (uint32_t)(result >> 32); }}", - inst.rs, inst.rt); - - case SPECIAL_MULTU: - return fmt::format("{{ uint64_t result = (uint64_t)ctx->r[{}] * (uint64_t)ctx->r[{}]; ctx->lo = (uint32_t)result; ctx->hi = (uint32_t)(result >> 32); }}", - inst.rs, inst.rt); - - case SPECIAL_DIV: - return fmt::format("{{ if (ctx->r[{}] != 0) {{ ctx->lo = (uint32_t)((int32_t)ctx->r[{}] / (int32_t)ctx->r[{}]); ctx->hi = (uint32_t)((int32_t)ctx->r[{}] % (int32_t)ctx->r[{}]); }} }}", - inst.rt, inst.rs, inst.rt, inst.rs, inst.rt); - - case SPECIAL_DIVU: - return fmt::format("{{ if (ctx->r[{}] != 0) {{ ctx->lo = ctx->r[{}] / ctx->r[{}]; ctx->hi = ctx->r[{}] % ctx->r[{}]; }} }}", - inst.rt, inst.rs, inst.rt, inst.rs, inst.rt); - - case SPECIAL_ADD: - case SPECIAL_ADDU: - return fmt::format("ctx->r[{}] = ADD32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_SUB: - case SPECIAL_SUBU: - return fmt::format("ctx->r[{}] = SUB32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_AND: - return fmt::format("ctx->r[{}] = AND32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_OR: - return fmt::format("ctx->r[{}] = OR32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_XOR: - return fmt::format("ctx->r[{}] = XOR32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_NOR: - return fmt::format("ctx->r[{}] = NOR32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_SLT: - return fmt::format("ctx->r[{}] = SLT32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - case SPECIAL_SLTU: - return fmt::format("ctx->r[{}] = SLTU32(ctx->r[{}], ctx->r[{}]);", - inst.rd, inst.rs, inst.rt); - - // PS2-specific instructions - case SPECIAL_MOVZ: - return fmt::format("if (ctx->r[{}] == 0) ctx->r[{}] = ctx->r[{}];", - inst.rt, inst.rd, inst.rs); - - case SPECIAL_MOVN: - return fmt::format("if (ctx->r[{}] != 0) ctx->r[{}] = ctx->r[{}];", - inst.rt, inst.rd, inst.rs); - - default: - return fmt::format("// Unhandled SPECIAL instruction: 0x{:X}", inst.function); - } - break; + return translateSpecialInstruction(inst); case OPCODE_ADDI: case OPCODE_ADDIU: @@ -650,6 +546,26 @@ namespace ps2recomp return fmt::format("{{ uint64_t val = ((uint64_t)ctx->r[{}].m128i_u32[1] << 32) | ctx->r[{}].m128i_u32[0]; WRITE64(ADD32(ctx->r[{}], 0x{:X}), val); }}", inst.rt, inst.rt, inst.rs, (int16_t)inst.immediate); + case OPCODE_SWC1: + return fmt::format("{{ float val = ctx->f[{}]; WRITE32(ADD32(ctx->r[{}], 0x{:X}), *(uint32_t*)&val); }}", + inst.rt, inst.rs, (int16_t)inst.immediate); + + case OPCODE_LQC2: + return fmt::format("ctx->vu0_vf[{}] = (__m128)READ128(ADD32(ctx->r[{}], 0x{:X}));", + inst.rt, inst.rs, (int16_t)inst.immediate); + + case OPCODE_SQC2: + return fmt::format("WRITE128(ADD32(ctx->r[{}], 0x{:X}), (__m128i)ctx->vu0_vf[{}]);", + inst.rs, (int16_t)inst.immediate, inst.rt); + + case OPCODE_LWC1: + return fmt::format("{{ uint32_t val = READ32(ADD32(ctx->r[{}], 0x{:X})); ctx->f[{}] = *(float*)&val; }}", + inst.rs, (int16_t)inst.immediate, inst.rt); + + case OPCODE_LWU: + return fmt::format("ctx->r[{}] = (uint32_t)READ32(ADD32(ctx->r[{}], 0x{:X}));", + inst.rt, inst.rs, (int16_t)inst.immediate); + // Special case for R5900 case OPCODE_CACHE: return "// CACHE instruction (ignored)";