Merge pull request #1351 from FioraAeterna/fixfprf
Fix FPRF flag setting
This commit is contained in:
commit
080883ad9e
|
@ -47,7 +47,7 @@ namespace BootManager
|
||||||
// Apply fire liberally
|
// Apply fire liberally
|
||||||
struct ConfigCache
|
struct ConfigCache
|
||||||
{
|
{
|
||||||
bool valid, bCPUThread, bSkipIdle, bEnableFPRF, bBAT, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread,
|
bool valid, bCPUThread, bSkipIdle, bFPRF, bBAT, bMMU, bDCBZOFF, m_EnableJIT, bDSPThread,
|
||||||
bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2, bProgressive;
|
bVBeamSpeedHack, bSyncGPU, bFastDiscSpeed, bMergeBlocks, bDSPHLE, bHLE_BS2, bProgressive;
|
||||||
int iCPUCore, Volume;
|
int iCPUCore, Volume;
|
||||||
int iWiimoteSource[MAX_BBMOTES];
|
int iWiimoteSource[MAX_BBMOTES];
|
||||||
|
@ -113,7 +113,7 @@ bool BootCore(const std::string& _rFilename)
|
||||||
config_cache.bCPUThread = StartUp.bCPUThread;
|
config_cache.bCPUThread = StartUp.bCPUThread;
|
||||||
config_cache.bSkipIdle = StartUp.bSkipIdle;
|
config_cache.bSkipIdle = StartUp.bSkipIdle;
|
||||||
config_cache.iCPUCore = StartUp.iCPUCore;
|
config_cache.iCPUCore = StartUp.iCPUCore;
|
||||||
config_cache.bEnableFPRF = StartUp.bEnableFPRF;
|
config_cache.bFPRF = StartUp.bFPRF;
|
||||||
config_cache.bBAT = StartUp.bBAT;
|
config_cache.bBAT = StartUp.bBAT;
|
||||||
config_cache.bMMU = StartUp.bMMU;
|
config_cache.bMMU = StartUp.bMMU;
|
||||||
config_cache.bDCBZOFF = StartUp.bDCBZOFF;
|
config_cache.bDCBZOFF = StartUp.bDCBZOFF;
|
||||||
|
@ -156,8 +156,8 @@ bool BootCore(const std::string& _rFilename)
|
||||||
|
|
||||||
core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread);
|
core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread);
|
||||||
core_section->Get("SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle);
|
core_section->Get("SkipIdle", &StartUp.bSkipIdle, StartUp.bSkipIdle);
|
||||||
core_section->Get("EnableFPRF", &StartUp.bEnableFPRF, StartUp.bEnableFPRF);
|
core_section->Get("FPRF", &StartUp.bFPRF, StartUp.bFPRF);
|
||||||
core_section->Get("BAT", &StartUp.bEnableFPRF, StartUp.bBAT);
|
core_section->Get("BAT", &StartUp.bBAT, StartUp.bBAT);
|
||||||
core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU);
|
core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU);
|
||||||
core_section->Get("DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF);
|
core_section->Get("DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF);
|
||||||
core_section->Get("VBeam", &StartUp.bVBeamSpeedHack, StartUp.bVBeamSpeedHack);
|
core_section->Get("VBeam", &StartUp.bVBeamSpeedHack, StartUp.bVBeamSpeedHack);
|
||||||
|
@ -283,7 +283,7 @@ void Stop()
|
||||||
StartUp.bCPUThread = config_cache.bCPUThread;
|
StartUp.bCPUThread = config_cache.bCPUThread;
|
||||||
StartUp.bSkipIdle = config_cache.bSkipIdle;
|
StartUp.bSkipIdle = config_cache.bSkipIdle;
|
||||||
StartUp.iCPUCore = config_cache.iCPUCore;
|
StartUp.iCPUCore = config_cache.iCPUCore;
|
||||||
StartUp.bEnableFPRF = config_cache.bEnableFPRF;
|
StartUp.bFPRF = config_cache.bFPRF;
|
||||||
StartUp.bBAT = config_cache.bBAT;
|
StartUp.bBAT = config_cache.bBAT;
|
||||||
StartUp.bMMU = config_cache.bMMU;
|
StartUp.bMMU = config_cache.bMMU;
|
||||||
StartUp.bDCBZOFF = config_cache.bDCBZOFF;
|
StartUp.bDCBZOFF = config_cache.bDCBZOFF;
|
||||||
|
|
|
@ -32,7 +32,7 @@ SCoreStartupParameter::SCoreStartupParameter()
|
||||||
bJITPairedOff(false), bJITSystemRegistersOff(false),
|
bJITPairedOff(false), bJITSystemRegistersOff(false),
|
||||||
bJITBranchOff(false),
|
bJITBranchOff(false),
|
||||||
bJITILTimeProfiling(false), bJITILOutputIR(false),
|
bJITILTimeProfiling(false), bJITILOutputIR(false),
|
||||||
bEnableFPRF(false),
|
bFPRF(false),
|
||||||
bCPUThread(true), bDSPThread(false), bDSPHLE(true),
|
bCPUThread(true), bDSPThread(false), bDSPHLE(true),
|
||||||
bSkipIdle(true), bNTSC(false), bForceNTSCJ(false),
|
bSkipIdle(true), bNTSC(false), bForceNTSCJ(false),
|
||||||
bHLE_BS2(true), bEnableCheats(false),
|
bHLE_BS2(true), bEnableCheats(false),
|
||||||
|
@ -73,7 +73,7 @@ void SCoreStartupParameter::LoadDefaults()
|
||||||
bDSPHLE = true;
|
bDSPHLE = true;
|
||||||
bDSPThread = true;
|
bDSPThread = true;
|
||||||
bFastmem = true;
|
bFastmem = true;
|
||||||
bEnableFPRF = false;
|
bFPRF = false;
|
||||||
bBAT = false;
|
bBAT = false;
|
||||||
bMMU = false;
|
bMMU = false;
|
||||||
bDCBZOFF = false;
|
bDCBZOFF = false;
|
||||||
|
|
|
@ -141,7 +141,7 @@ struct SCoreStartupParameter
|
||||||
bool bJITILOutputIR;
|
bool bJITILOutputIR;
|
||||||
|
|
||||||
bool bFastmem;
|
bool bFastmem;
|
||||||
bool bEnableFPRF;
|
bool bFPRF;
|
||||||
|
|
||||||
bool bCPUThread;
|
bool bCPUThread;
|
||||||
bool bDSPThread;
|
bool bDSPThread;
|
||||||
|
|
|
@ -181,7 +181,7 @@ void Jit64::Init()
|
||||||
// TODO: support block linking with MMU
|
// TODO: support block linking with MMU
|
||||||
jo.enableBlocklink = false;
|
jo.enableBlocklink = false;
|
||||||
}
|
}
|
||||||
jo.fpAccurateFcmp = SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableFPRF;
|
jo.fpAccurateFcmp = SConfig::GetInstance().m_LocalCoreStartupParameter.bFPRF;
|
||||||
jo.optimizeGatherPipe = true;
|
jo.optimizeGatherPipe = true;
|
||||||
jo.fastInterrupts = false;
|
jo.fastInterrupts = false;
|
||||||
jo.accurateSinglePrecision = true;
|
jo.accurateSinglePrecision = true;
|
||||||
|
|
|
@ -52,8 +52,8 @@ void Jit64::SetFPRFIfNeeded(UGeckoInstruction inst, X64Reg xmm)
|
||||||
{
|
{
|
||||||
// As far as we know, the games that use this flag only need FPRF for fmul and fmadd, but
|
// As far as we know, the games that use this flag only need FPRF for fmul and fmadd, but
|
||||||
// FPRF is fast enough in JIT that we might as well just enable it for every float instruction
|
// FPRF is fast enough in JIT that we might as well just enable it for every float instruction
|
||||||
// if the enableFPRF flag is set.
|
// if the FPRF flag is set.
|
||||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableFPRF && js.op->wantsFPRF)
|
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFPRF && js.op->wantsFPRF)
|
||||||
SetFPRF(xmm);
|
SetFPRF(xmm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ void Jit64::fmrx(UGeckoInstruction inst)
|
||||||
|
|
||||||
void Jit64::FloatCompare(UGeckoInstruction inst, bool upper)
|
void Jit64::FloatCompare(UGeckoInstruction inst, bool upper)
|
||||||
{
|
{
|
||||||
bool fprf = SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableFPRF && js.op->wantsFPRF;
|
bool fprf = SConfig::GetInstance().m_LocalCoreStartupParameter.bFPRF && js.op->wantsFPRF;
|
||||||
//bool ordered = !!(inst.SUBOP10 & 32);
|
//bool ordered = !!(inst.SUBOP10 & 32);
|
||||||
int a = inst.FA;
|
int a = inst.FA;
|
||||||
int b = inst.FB;
|
int b = inst.FB;
|
||||||
|
|
|
@ -12,7 +12,7 @@ void JitILBase::fp_arith_s(UGeckoInstruction inst)
|
||||||
FALLBACK_IF(inst.Rc || (inst.SUBOP5 != 25 && inst.SUBOP5 != 20 && inst.SUBOP5 != 21));
|
FALLBACK_IF(inst.Rc || (inst.SUBOP5 != 25 && inst.SUBOP5 != 20 && inst.SUBOP5 != 21));
|
||||||
|
|
||||||
// Only the interpreter has "proper" support for (some) FP flags
|
// Only the interpreter has "proper" support for (some) FP flags
|
||||||
FALLBACK_IF(inst.SUBOP5 == 25 && SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableFPRF);
|
FALLBACK_IF(inst.SUBOP5 == 25 && SConfig::GetInstance().m_LocalCoreStartupParameter.bFPRF);
|
||||||
|
|
||||||
IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA);
|
IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA);
|
||||||
switch (inst.SUBOP5)
|
switch (inst.SUBOP5)
|
||||||
|
@ -49,7 +49,7 @@ void JitILBase::fmaddXX(UGeckoInstruction inst)
|
||||||
FALLBACK_IF(inst.Rc);
|
FALLBACK_IF(inst.Rc);
|
||||||
|
|
||||||
// Only the interpreter has "proper" support for (some) FP flags
|
// Only the interpreter has "proper" support for (some) FP flags
|
||||||
FALLBACK_IF(inst.SUBOP5 == 29 && SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableFPRF);
|
FALLBACK_IF(inst.SUBOP5 == 29 && SConfig::GetInstance().m_LocalCoreStartupParameter.bFPRF);
|
||||||
|
|
||||||
IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA);
|
IREmitter::InstLoc val = ibuild.EmitLoadFReg(inst.FA);
|
||||||
val = ibuild.EmitFDMul(val, ibuild.EmitLoadFReg(inst.FC));
|
val = ibuild.EmitFDMul(val, ibuild.EmitLoadFReg(inst.FC));
|
||||||
|
|
Loading…
Reference in New Issue