From fdd06da500c69495a45aced02817a456f22d5e4f Mon Sep 17 00:00:00 2001 From: magumagu9 Date: Mon, 5 Jan 2009 04:18:10 +0000 Subject: [PATCH] Small JIT WIP fix: I figured out how subfic and subfcx work. It was a bit surprising to me that the carry flag works differently between PPC and x86... git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1789 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp index 7a741528b2..e8344ef92e 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/Jit_Integer.cpp @@ -179,29 +179,31 @@ void Jit64::subfic(UGeckoInstruction inst) { - Default(inst); - return; - // FIXME: Disabling until I figure out subfcx - IREmitter::InstLoc val, test, c; - c = ibuild.EmitIntConst(inst.SIMM_16); - val = ibuild.EmitSub(c, ibuild.EmitLoadGReg(inst.RA)); + IREmitter::InstLoc nota, lhs, val, test; + nota = ibuild.EmitXor(ibuild.EmitLoadGReg(inst.RA), + ibuild.EmitIntConst(-1)); + if (inst.SIMM_16 == -1) { + val = nota; + test = ibuild.EmitIntConst(1); + } else { + lhs = ibuild.EmitIntConst(inst.SIMM_16 + 1); + val = ibuild.EmitAdd(nota, lhs); + test = ibuild.EmitICmpUgt(lhs, val); + } ibuild.EmitStoreGReg(val, inst.RD); - test = ibuild.EmitICmpUgt(val, c); ibuild.EmitStoreCarry(test); } void Jit64::subfcx(UGeckoInstruction inst) { - Default(inst); - return; - // FIXME: Figure out what the heck is going wrong here... if (inst.OE) PanicAlert("OE: subfcx"); IREmitter::InstLoc val, test, lhs, rhs; lhs = ibuild.EmitLoadGReg(inst.RB); rhs = ibuild.EmitLoadGReg(inst.RA); val = ibuild.EmitSub(lhs, rhs); ibuild.EmitStoreGReg(val, inst.RD); - test = ibuild.EmitICmpUgt(rhs, lhs); + test = ibuild.EmitICmpEq(rhs, ibuild.EmitIntConst(0)); + test = ibuild.EmitOr(test, ibuild.EmitICmpUgt(lhs, val)); ibuild.EmitStoreCarry(test); if (inst.Rc) ComputeRC(ibuild, val);