Skip to content

Commit

Permalink
jit: Discard unused regs before a syscall.
Browse files Browse the repository at this point in the history
This is a pretty minor optimization, though.
  • Loading branch information
unknownbrackets committed Mar 1, 2015
1 parent 238e0ed commit 8b82190
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 4 deletions.
5 changes: 2 additions & 3 deletions Core/HLE/HLE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -358,9 +358,8 @@ inline static void SetDeadbeefRegs()
currentMIPS->r[MIPS_REG_COMPILER_SCRATCH] = 0xDEADBEEF;
// Set all the arguments and temp regs.
memcpy(&currentMIPS->r[MIPS_REG_A0], deadbeefRegs, sizeof(deadbeefRegs));
// Using a magic number since there's confusion/disagreement on reg names.
currentMIPS->r[24] = 0xDEADBEEF;
currentMIPS->r[25] = 0xDEADBEEF;
currentMIPS->r[MIPS_REG_T8] = 0xDEADBEEF;
currentMIPS->r[MIPS_REG_T9] = 0xDEADBEEF;

currentMIPS->lo = 0xDEADBEEF;
currentMIPS->hi = 0xDEADBEEF;
Expand Down
17 changes: 17 additions & 0 deletions Core/MIPS/ARM/ArmCompBranch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,23 @@ void ArmJit::Comp_JumpReg(MIPSOpcode op)

void ArmJit::Comp_Syscall(MIPSOpcode op)
{
if (!g_Config.bSkipDeadbeefFilling)
{
// These will be set to the result.
gpr.DiscardR(MIPS_REG_V0);
gpr.DiscardR(MIPS_REG_V1);

// All of these will be overwritten with DEADBEEF anyway.
gpr.DiscardR(MIPS_REG_COMPILER_SCRATCH);
// We need to keep A0 - T3, which are used for args.
gpr.DiscardR(MIPS_REG_T4);
gpr.DiscardR(MIPS_REG_T5);
gpr.DiscardR(MIPS_REG_T6);
gpr.DiscardR(MIPS_REG_T7);
gpr.DiscardR(MIPS_REG_T8);
gpr.DiscardR(MIPS_REG_T9);
}

// If we're in a delay slot, this is off by one.
const int offset = js.inDelaySlot ? -1 : 0;
WriteDownCount(offset);
Expand Down
17 changes: 16 additions & 1 deletion Core/MIPS/x86/CompBranch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,22 @@ void Jit::Comp_JumpReg(MIPSOpcode op)

void Jit::Comp_Syscall(MIPSOpcode op)
{
// TODO: Maybe discard v0, v1, and some temps? Definitely at?
if (!g_Config.bSkipDeadbeefFilling)
{
// These will be set to the result.
gpr.DiscardR(MIPS_REG_V0);
gpr.DiscardR(MIPS_REG_V1);

// All of these will be overwritten with DEADBEEF anyway.
gpr.DiscardR(MIPS_REG_COMPILER_SCRATCH);
// We need to keep A0 - T3, which are used for args.
gpr.DiscardR(MIPS_REG_T4);
gpr.DiscardR(MIPS_REG_T5);
gpr.DiscardR(MIPS_REG_T6);
gpr.DiscardR(MIPS_REG_T7);
gpr.DiscardR(MIPS_REG_T8);
gpr.DiscardR(MIPS_REG_T9);
}
FlushAll();

// If we're in a delay slot, this is off by one.
Expand Down
15 changes: 15 additions & 0 deletions Core/MIPS/x86/RegCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,21 @@ void GPRRegCache::DiscardRegContentsIfCached(MIPSGPReg preg) {
}
}

void GPRRegCache::DiscardR(MIPSGPReg preg) {
if (regs[preg].away) {
if (regs[preg].location.IsSimpleReg()) {
DiscardRegContentsIfCached(preg);
} else {
regs[preg].away = false;
if (preg == MIPS_REG_ZERO) {
regs[preg].location = Imm32(0);
} else {
regs[preg].location = GetDefaultLocation(preg);
}
}
}
}


void GPRRegCache::SetImm(MIPSGPReg preg, u32 immValue) {
// ZERO is always zero. Let's just make sure.
Expand Down
1 change: 1 addition & 0 deletions Core/MIPS/x86/RegCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class GPRRegCache
void Start(MIPSState *mips, MIPSComp::JitState *js, MIPSComp::JitOptions *jo, MIPSAnalyst::AnalysisResults &stats);

void DiscardRegContentsIfCached(MIPSGPReg preg);
void DiscardR(MIPSGPReg preg);
void SetEmitter(Gen::XEmitter *emitter) {emit = emitter;}

void FlushR(Gen::X64Reg reg);
Expand Down

0 comments on commit 8b82190

Please sign in to comment.