From af471d0a84b671c887d092ca86b4dd34e709c98a Mon Sep 17 00:00:00 2001 From: Fiora Date: Mon, 8 Sep 2014 21:36:50 -0700 Subject: [PATCH 1/2] JIT: optimize andi(s)_rc We usually don't need to do a sign-extend for the resulting flags. --- Source/Core/Core/PowerPC/Jit64/Jit.h | 2 +- Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index 53a846237f..e006286ff4 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -103,7 +103,7 @@ public: void FinalizeCarryOverflow(bool oe, bool inv = false); void FinalizeCarry(Gen::CCFlags cond); void FinalizeCarry(bool ca); - void ComputeRC(const Gen::OpArg & arg); + void ComputeRC(const Gen::OpArg & arg, bool sign_extend = true); // Use to extract bytes from a register using the regcache. offset is in bytes. Gen::OpArg ExtractFromReg(int reg, int offset); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index dbb6a5fbf1..57e9434f08 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -116,17 +116,21 @@ void Jit64::FinalizeCarryOverflow(bool oe, bool inv) FinalizeCarry(inv ? CC_NC : CC_C); } -void Jit64::ComputeRC(const Gen::OpArg & arg) +void Jit64::ComputeRC(const Gen::OpArg & arg, bool sign_extend) { if (arg.IsImm()) { MOV(64, PPCSTATE(cr_val[0]), Imm32((s32)arg.offset)); } - else + else if (sign_extend) { MOVSX(64, 32, RSCRATCH, arg); MOV(64, PPCSTATE(cr_val[0]), R(RSCRATCH)); } + else + { + MOV(64, PPCSTATE(cr_val[0]), arg); + } } OpArg Jit64::ExtractFromReg(int reg, int offset) @@ -206,7 +210,7 @@ void Jit64::regimmop(int d, int a, bool binary, u32 value, Operation doop, void if (carry) FinalizeCarry(CC_C); if (Rc) - ComputeRC(gpr.R(d)); + ComputeRC(gpr.R(d), doop != And || (value & 0x80000000)); } else if (doop == Add) { From 3845c27155ee3120f7aa7079fba54af32a1ac1ce Mon Sep 17 00:00:00 2001 From: Fiora Date: Tue, 9 Sep 2014 20:21:12 -0700 Subject: [PATCH 2/2] JIT: save an instruction in psq_l --- Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp index 5f87d22ecb..c5b2a6e8f9 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp @@ -95,10 +95,8 @@ void Jit64::psq_l(UGeckoInstruction inst) MOV(32, R(RSCRATCH2), Imm32(0x3F07)); AND(32, R(RSCRATCH2), M(((char *)&GQR(inst.I)) + 2)); MOVZX(32, 8, RSCRATCH, R(RSCRATCH2)); - if (inst.W) - OR(32, R(RSCRATCH), Imm8(8)); - CALLptr(MScaled(RSCRATCH, SCALE_8, (u32)(u64)asm_routines.pairedLoadQuantized)); + CALLptr(MScaled(RSCRATCH, SCALE_8, (u32)(u64)(asm_routines.pairedLoadQuantized + inst.W * 8))); MEMCHECK_START(false) CVTPS2PD(fpr.RX(s), R(XMM0));