From 40b18f09b2ce03f908b5303643b352d084b0c4b4 Mon Sep 17 00:00:00 2001 From: Fiora Date: Sun, 14 Sep 2014 05:36:23 -0700 Subject: [PATCH] JIT: use LZCNT in cntlzw --- .../Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 10ea9f8448..271a0dc861 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1901,13 +1901,19 @@ void Jit64::cntlzwx(UGeckoInstruction inst) else { gpr.Lock(a, s); - gpr.KillImmediate(s, true, false); - gpr.BindToRegister(a, (a == s), true); - BSR(32, gpr.R(a).GetSimpleReg(), gpr.R(s)); - FixupBranch gotone = J_CC(CC_NZ); - MOV(32, gpr.R(a), Imm32(63)); - SetJumpTarget(gotone); - XOR(32, gpr.R(a), Imm8(0x1f)); // flip order + gpr.BindToRegister(a, a == s, true); + if (cpu_info.bLZCNT) + { + LZCNT(32, gpr.RX(a), gpr.R(s)); + } + else + { + BSR(32, gpr.RX(a), gpr.R(s)); + FixupBranch gotone = J_CC(CC_NZ); + MOV(32, gpr.R(a), Imm32(63)); + SetJumpTarget(gotone); + XOR(32, gpr.R(a), Imm8(0x1f)); // flip order + } gpr.UnlockAll(); }