Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
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();
    }
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
	}
}