void FPURegCache::MapRegsV(int vec, VectorSize sz, int flags) { u8 v[4]; GetVectorRegs(v, sz, vec); SpillLockV(v, sz); for (int i = 0; i < GetNumVectorElements(sz); i++) { BindToRegister(v[i] + 32, (flags & MAP_NOINIT) == 0, (flags & MAP_DIRTY) != 0); } }
void ArmRegCache::Flush() { for (u8 a = 0; a < 32; ++a) { if (regs[a].GetType() == REG_IMM) BindToRegister(a); if (regs[a].GetType() == REG_REG) { u32 regindex = regs[a].GetRegIndex(); emit->STR(ArmCRegs[regindex].Reg, R9, PPCSTATE_OFF(gpr) + a * 4); ArmCRegs[regindex].PPCReg = 33; ArmCRegs[regindex].LastLoad = 0; } regs[a].Flush(); } }
ARMReg ArmRegCache::R(u32 preg) { if (regs[preg].GetType() == REG_IMM) return BindToRegister(preg); u32 lastRegIndex = GetLeastUsedRegister(true); // Check if already Loaded if (regs[preg].GetType() == REG_REG) { u8 a = regs[preg].GetRegIndex(); ArmCRegs[a].LastLoad = 0; return ArmCRegs[a].Reg; } // Check if we have a free register u32 regindex; if (FindFreeRegister(regindex)) { emit->LDR(ArmCRegs[regindex].Reg, R9, PPCSTATE_OFF(gpr) + preg * 4); ArmCRegs[regindex].PPCReg = preg; ArmCRegs[regindex].LastLoad = 0; regs[preg].LoadToReg(regindex); return ArmCRegs[regindex].Reg; } // Alright, we couldn't get a free space, dump that least used register emit->STR(ArmCRegs[lastRegIndex].Reg, R9, PPCSTATE_OFF(gpr) + ArmCRegs[lastRegIndex].PPCReg * 4); emit->LDR(ArmCRegs[lastRegIndex].Reg, R9, PPCSTATE_OFF(gpr) + preg * 4); regs[ArmCRegs[lastRegIndex].PPCReg].Flush(); ArmCRegs[lastRegIndex].PPCReg = preg; ArmCRegs[lastRegIndex].LastLoad = 0; regs[preg].LoadToReg(lastRegIndex); return ArmCRegs[lastRegIndex].Reg; }
void FPURegCache::MapRegsV(const u8 *v, VectorSize sz, int flags) { SpillLockV(v, sz); for (int i = 0; i < GetNumVectorElements(sz); i++) { BindToRegister(v[i] + 32, (flags & MAP_NOINIT) == 0, (flags & MAP_DIRTY) != 0); } }