JIT: make fprf conditional in fcmp, just like the other instructions

Missed in the FPRF merge (it didn't break anything, but it's probably a bit
slower and not consistent with the others).
This commit is contained in:
Fiora 2014-08-28 11:18:33 -07:00
parent 0217fb2008
commit 7929f2f033
1 changed files with 11 additions and 5 deletions

View File

@ -242,11 +242,13 @@ void Jit64::fcmpx(UGeckoInstruction inst)
int a = inst.FA; int a = inst.FA;
int b = inst.FB; int b = inst.FB;
int crf = inst.CRFD; int crf = inst.CRFD;
bool fprf = Core::g_CoreStartupParameter.bEnableFPRF && js.op->wantsFPRF;
fpr.Lock(a,b); fpr.Lock(a,b);
fpr.BindToRegister(b, true); fpr.BindToRegister(b, true);
AND(32, M(&FPSCR), Imm32(~FPRF_MASK)); if (fprf)
AND(32, M(&FPSCR), Imm32(~FPRF_MASK));
// Are we masking sNaN invalid floating point exceptions? If not this could crash if we don't handle the exception? // Are we masking sNaN invalid floating point exceptions? If not this could crash if we don't handle the exception?
UCOMISD(fpr.R(b).GetSimpleReg(), fpr.R(a)); UCOMISD(fpr.R(b).GetSimpleReg(), fpr.R(a));
@ -270,13 +272,15 @@ void Jit64::fcmpx(UGeckoInstruction inst)
} }
MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_EQ))); MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_EQ)));
OR(32, M(&FPSCR), Imm32(CR_EQ << FPRF_SHIFT)); if (fprf)
OR(32, M(&FPSCR), Imm32(CR_EQ << FPRF_SHIFT));
continue1 = J(); continue1 = J();
SetJumpTarget(pNaN); SetJumpTarget(pNaN);
MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_SO))); MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_SO)));
OR(32, M(&FPSCR), Imm32(CR_SO << FPRF_SHIFT)); if (fprf)
OR(32, M(&FPSCR), Imm32(CR_SO << FPRF_SHIFT));
if (a != b) if (a != b)
{ {
@ -284,12 +288,14 @@ void Jit64::fcmpx(UGeckoInstruction inst)
SetJumpTarget(pGreater); SetJumpTarget(pGreater);
MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_GT))); MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_GT)));
OR(32, M(&FPSCR), Imm32(CR_GT << FPRF_SHIFT)); if (fprf)
OR(32, M(&FPSCR), Imm32(CR_GT << FPRF_SHIFT));
continue3 = J(); continue3 = J();
SetJumpTarget(pLesser); SetJumpTarget(pLesser);
MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_LT))); MOV(64, R(RAX), Imm64(PPCCRToInternal(CR_LT)));
OR(32, M(&FPSCR), Imm32(CR_LT << FPRF_SHIFT)); if (fprf)
OR(32, M(&FPSCR), Imm32(CR_LT << FPRF_SHIFT));
} }
SetJumpTarget(continue1); SetJumpTarget(continue1);