34 #include "config/the_gpu_isa.hh"
35 #include "debug/GPURename.hh"
58 panic_if((vgprIndex >=
w->reservedVectorRegs)
59 || (
w->reservedVectorRegs < 0),
60 "VGPR index %d is out of range: VGPR range=[0,%d]",
61 vgprIndex,
w->reservedVectorRegs);
64 int physicalVgprIndex =
w->startVgprIndex + vgprIndex;
66 panic_if(!((
w->startVgprIndex <= physicalVgprIndex) &&
67 (
w->startVgprIndex +
w->reservedVectorRegs - 1)
68 >= physicalVgprIndex),
69 "Invalid VGPR index %d\n", physicalVgprIndex);
72 return physicalVgprIndex %
w->computeUnit->vrf[
w->simdId]->numRegs();
78 panic_if(!((sgprIndex < w->reservedScalarRegs)
79 && (
w->reservedScalarRegs > 0)),
80 "SGPR index %d is out of range: SGPR range=[0,%d]\n",
81 sgprIndex,
w->reservedScalarRegs);
84 int physicalSgprIndex =
w->startSgprIndex + sgprIndex;
86 panic_if(!((
w->startSgprIndex <= physicalSgprIndex) &&
87 (
w->startSgprIndex +
w->reservedScalarRegs - 1)
88 >= physicalSgprIndex),
89 "Invalid SGPR index %d\n", physicalSgprIndex);
92 return physicalSgprIndex %
w->computeUnit->srf[
w->simdId]->numRegs();
100 canAllocate(nWfs, demandPerWf);
108 canAllocate(nWfs, demandPerWf);
115 uint32_t allocatedSize = 0;
117 allocateRegion(vectorDemand, &allocatedSize);
118 w->reservedVectorRegs = allocatedSize;
121 "VRF[%d] has been overallocated %d > %d\n",
127 allocateRegion(scalarDemand, &allocatedSize);
128 w->reservedScalarRegs = allocatedSize;
131 "SRF[%d] has been overallocated %d > %d\n",
141 w->computeUnit->vectorRegsReserved[
w->simdId] -=
w->reservedVectorRegs;
143 w->computeUnit->scalarRegsReserved[
w->simdId] -=
w->reservedScalarRegs;
145 panic_if(
w->computeUnit->vectorRegsReserved[
w->simdId] < 0,
146 "Freeing VRF[%d] registers left %d registers reserved\n",
148 w->computeUnit->vectorRegsReserved[
w->simdId]);
149 panic_if(
w->computeUnit->scalarRegsReserved[
w->simdId] < 0,
150 "Freeing SRF[%d] registers left %d registers reserved\n",
152 w->computeUnit->scalarRegsReserved[
w->simdId]);
155 int endIndex =
w->startVgprIndex +
w->reservedVectorRegs;
157 w->computeUnit->registerManager->vrfPoolMgrs[
w->simdId]->
158 freeRegion(
w->startVgprIndex, endIndex);
161 for (
int i = 0;
i <
w->reservedVectorRegs;
i++) {
163 w->computeUnit->vrf[
w->simdId]->markReg(physVgprIdx,
false);
166 w->reservedVectorRegs = 0;
167 w->startVgprIndex = 0;
169 endIndex =
w->startSgprIndex +
w->reservedScalarRegs;
170 w->computeUnit->registerManager->srfPoolMgrs[
w->simdId]->
171 freeRegion(
w->startSgprIndex, endIndex);
174 for (
int i = 0;
i <
w->reservedScalarRegs;
i++) {
176 w->computeUnit->srf[
w->simdId]->markReg(physSgprIdx,
false);
179 w->reservedScalarRegs = 0;
180 w->startSgprIndex = 0;
std::vector< int > vectorRegsReserved
RegisterManager * registerManager
std::vector< int > scalarRegsReserved
std::vector< PoolManager * > vrfPoolMgrs
std::vector< PoolManager * > srfPoolMgrs
bool canAllocateSgprs(int simdId, int nWfs, int demandPerWf) override
void allocateRegisters(Wavefront *w, int vectorDemand, int scalarDemand) override
void freeRegisters(Wavefront *w) override
int mapSgpr(Wavefront *w, int sgprIndex) override
int mapVgpr(Wavefront *w, int vgprIndex) override
bool canAllocateVgprs(int simdId, int nWfs, int demandPerWf) override
StaticRegisterManagerPolicy()
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....