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 FPURegCache::MapRegsV(int vec, VectorSize sz, int flags) { u8 r[4]; GetVectorRegs(r, sz, vec); SpillLockV(r, sz); for (int i = 0; i < GetNumVectorElements(sz); i++) { MapReg(r[i] + 32, (flags & MAP_NOINIT) != MAP_NOINIT, (flags & MAP_DIRTY) != 0); } }
bool FPURegCache::TryMapDirtyInInVS(const u8 *vd, VectorSize vdsz, const u8 *vs, VectorSize vssz, const u8 *vt, VectorSize vtsz, bool avoidLoad) { // Don't waste time mapping if some will for sure fail. if (!CanMapVS(vd, vdsz) || !CanMapVS(vs, vssz) || !CanMapVS(vt, vtsz)) { return false; } // But, they could still fail based on overlap. Hopefully not common... bool success = TryMapRegsVS(vs, vssz, 0); if (success) { SpillLockV(vs, vssz); success = TryMapRegsVS(vt, vtsz, 0); } if (success) { SpillLockV(vt, vtsz); success = TryMapRegsVS(vd, vdsz, avoidLoad ? MAP_NOINIT : MAP_DIRTY); } ReleaseSpillLockV(vs, vssz); ReleaseSpillLockV(vt, vtsz); return success; }
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); } }
void FPURegCache::SpillLockV(int vec, VectorSize sz) { u8 v[4]; GetVectorRegs(v, sz, vec); SpillLockV(v, sz); }
void FPURegCache::MapRegsV(const u8 *r, VectorSize sz, int flags) { SpillLockV(r, sz); for (int i = 0; i < GetNumVectorElements(sz); i++) { MapReg(r[i] + 32, (flags & MAP_NOINIT) != MAP_NOINIT, (flags & MAP_DIRTY) != 0); } }