From ac5aacbd16bdd752692524abc0bdc34515106cff Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 11 Nov 2013 23:38:42 -0800 Subject: [PATCH] armjit: Spill an imm armreg back to an imm. We might be able to avoid the store or etc. --- Core/MIPS/ARM/ArmRegCache.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index d05297009a..ad68e6b9dd 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -318,17 +318,24 @@ void ArmRegCache::MapDirtyDirtyInIn(MIPSGPReg rd1, MIPSGPReg rd2, MIPSGPReg rs, void ArmRegCache::FlushArmReg(ARMReg r) { if (ar[r].mipsReg == MIPS_REG_INVALID) { // Nothing to do, reg not mapped. + if (ar[r].isDirty) { + ERROR_LOG(JIT, "Dirty but no mipsreg?"); + } return; } if (ar[r].mipsReg != MIPS_REG_INVALID) { - if (ar[r].isDirty && (mr[ar[r].mipsReg].loc == ML_ARMREG || mr[ar[r].mipsReg].loc == ML_ARMREG_IMM)) - emit_->STR(r, CTXREG, GetMipsRegOffset(ar[r].mipsReg)); - // IMMs won't be in an ARM reg. - mr[ar[r].mipsReg].loc = ML_MEM; - mr[ar[r].mipsReg].reg = INVALID_REG; - mr[ar[r].mipsReg].imm = 0; - } else { - ERROR_LOG(JIT, "Dirty but no mipsreg?"); + auto &mreg = mr[ar[r].mipsReg]; + if (mreg.loc == ML_ARMREG_IMM) { + // We know it's immedate value, no need to STR now. + mreg.loc = ML_IMM; + mreg.reg = INVALID_REG; + } else { + if (ar[r].isDirty && mreg.loc == ML_ARMREG) + emit_->STR(r, CTXREG, GetMipsRegOffset(ar[r].mipsReg)); + mreg.loc = ML_MEM; + mreg.reg = INVALID_REG; + mreg.imm = 0; + } } ar[r].isDirty = false; ar[r].mipsReg = MIPS_REG_INVALID;