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:
parent
0217fb2008
commit
7929f2f033
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue