From 8c70a17c7204f2e60846d30ef7e2a66d6d5ea15a Mon Sep 17 00:00:00 2001 From: Simone <91993281+SimoneN64@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:02:59 +0100 Subject: [PATCH] [JIT]: Implement non-constant dadd, daddu, daddi and daddiu --- src/backend/core/jit/instructions.cpp | 51 +++++++++++++++++---------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/backend/core/jit/instructions.cpp b/src/backend/core/jit/instructions.cpp index 09d4527b..f5f69b5c 100644 --- a/src/backend/core/jit/instructions.cpp +++ b/src/backend/core/jit/instructions.cpp @@ -544,24 +544,39 @@ void JIT::dadd(u32 instr) { Util::panic("[JIT]: Unhandled Overflow exception in DADD!"); } regs.Write(RD(instr), result); - } else { - Util::panic("[JIT]: Implement non constant DADD!"); + return; } + + if(regs.IsRegConstant(RS(instr))) { + auto rs = regs.Read(RS(instr)); + regs.Read(RT(instr), code.rax); + code.add(code.rax, rs); + regs.Write(RD(instr), code.rax); + return; + } + + if(regs.IsRegConstant(RT(instr))) { + auto rt = regs.Read(RT(instr)); + regs.Read(RS(instr), code.rax); + code.add(code.rax, rt); + regs.Write(RD(instr), code.rax); + return; + } + + regs.Read(RS(instr), code.rax); + regs.Read(RT(instr), code.rdi); + code.add(code.rax, code.rdi); + regs.Write(RD(instr), code.rax); } void JIT::daddu(u32 instr) { - if (regs.IsRegConstant(RS(instr), RT(instr))) { - auto rs = regs.Read(RS(instr)); - auto rt = regs.Read(RT(instr)); - regs.Write(RD(instr), rt + rs); - } else { - Util::panic("[JIT]: Implement non constant DADD!"); - } + // TODO: IMPLEMENT DADDU BY ITSELF ACTUALLY + dadd(instr); } void JIT::daddi(u32 instr) { + u64 imm = s64(s16(instr)); if (regs.IsRegConstant(RS(instr))) { - u64 imm = s64(s16(instr)); auto rs = regs.Read(RS(instr)); u64 result = imm + rs; if (check_signed_overflow(rs, imm, result)) { @@ -569,19 +584,17 @@ void JIT::daddi(u32 instr) { Util::panic("[JIT]: Unhandled Overflow exception in DADDI!"); } regs.Write(RT(instr), result); - } else { - Util::panic("[JIT]: Implement non constant DADDI!"); + return; } + + regs.Read(RS(instr), code.rax); + code.add(code.rax, imm); + regs.Write(RT(instr), code.rax); } void JIT::daddiu(u32 instr) { - if (regs.IsRegConstant(RS(instr))) { - s16 imm = s16(instr); - auto rs = regs.Read(RS(instr)); - regs.Write(RT(instr), imm + rs); - } else { - Util::panic("[JIT]: Implement non constant DADDI!"); - } + // TODO: IMPLEMENT DADDIU BY ITSELF ACTUALLY + daddi(instr); } void JIT::ddiv(u32 instr) {