From 6fe86f1fd1fedf55ba58d52bd2e7252717334de7 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 14 Sep 2013 04:29:37 +0000 Subject: [PATCH] [ARM] cntlzwx implementation. --- Source/Core/Core/Src/PowerPC/JitArm32/Jit.h | 1 + .../Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp | 16 ++++++++++++++++ .../Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h index 143f21b5ee..cb2dbbd508 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h +++ b/Source/Core/Core/Src/PowerPC/JitArm32/Jit.h @@ -157,6 +157,7 @@ public: void arith(UGeckoInstruction _inst); void addex(UGeckoInstruction _inst); + void cntlzwx(UGeckoInstruction _inst); void cmp (UGeckoInstruction _inst); void cmpi(UGeckoInstruction _inst); void cmpl(UGeckoInstruction _inst); diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp index 9873c0d479..67004ecfb5 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Integer.cpp @@ -529,6 +529,22 @@ void JitArm::addex(UGeckoInstruction inst) gpr.Unlock(rA); } +void JitArm::cntlzwx(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITIntegerOff) + u32 a = inst.RA, s = inst.RS; + + ARMReg RA = gpr.R(a); + ARMReg RS = gpr.R(s); + CLZ(RA, RS); + if (inst.Rc) + { + CMP(RA, 0); + ComputeRC(); + } +} + void JitArm::mulhwux(UGeckoInstruction inst) { INSTRUCTION_START diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp index 4569eb54c4..9728bc270c 100644 --- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp +++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp @@ -204,7 +204,7 @@ static GekkoOPTemplate table31[] = {284, &JitArm::arith}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}}, {0, &JitArm::cmp}, //"cmp", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, {32, &JitArm::cmpl}, //"cmpl", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}}, - {26, &JitArm::Default}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, + {26, &JitArm::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, {922, &JitArm::extshx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, {954, &JitArm::extsbx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}}, {536, &JitArm::Default}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},