36 #include "config/the_gpu_isa.hh"
37 #include "debug/GPURename.hh"
57 panic_if((vgprIndex >=
w->reservedVectorRegs)
58 || (
w->reservedVectorRegs < 0),
59 "VGPR index %d is out of range: VGPR range=[0,%d]",
60 vgprIndex,
w->reservedVectorRegs);
63 int physicalVgprIndex =
w->startVgprIndex + vgprIndex;
65 panic_if(!((
w->startVgprIndex <= physicalVgprIndex) &&
66 (
w->startVgprIndex +
w->reservedVectorRegs - 1)
67 >= physicalVgprIndex),
68 "Invalid VGPR index %d\n", physicalVgprIndex);
71 return physicalVgprIndex %
w->computeUnit->vrf[
w->simdId]->numRegs();
77 panic_if(!((sgprIndex < w->reservedScalarRegs)
78 && (
w->reservedScalarRegs > 0)),
79 "SGPR index %d is out of range: SGPR range=[0,%d]\n",
80 sgprIndex,
w->reservedScalarRegs);
83 int physicalSgprIndex =
w->startSgprIndex + sgprIndex;
85 panic_if(!((
w->startSgprIndex <= physicalSgprIndex) &&
86 (
w->startSgprIndex +
w->reservedScalarRegs - 1)
87 >= physicalSgprIndex),
88 "Invalid SGPR index %d\n", physicalSgprIndex);
91 return physicalSgprIndex %
w->computeUnit->srf[
w->simdId]->numRegs();
99 canAllocate(nWfs, demandPerWf);
107 canAllocate(nWfs, demandPerWf);
114 uint32_t allocatedSize = 0;
116 allocateRegion(vectorDemand, &allocatedSize);
117 w->reservedVectorRegs = allocatedSize;
120 "VRF[%d] has been overallocated %d > %d\n",
126 allocateRegion(scalarDemand, &allocatedSize);
127 w->reservedScalarRegs = allocatedSize;
130 "SRF[%d] has been overallocated %d > %d\n",
140 w->computeUnit->vectorRegsReserved[
w->simdId] -=
w->reservedVectorRegs;
142 w->computeUnit->scalarRegsReserved[
w->simdId] -=
w->reservedScalarRegs;
144 panic_if(
w->computeUnit->vectorRegsReserved[
w->simdId] < 0,
145 "Freeing VRF[%d] registers left %d registers reserved\n",
147 w->computeUnit->vectorRegsReserved[
w->simdId]);
148 panic_if(
w->computeUnit->scalarRegsReserved[
w->simdId] < 0,
149 "Freeing SRF[%d] registers left %d registers reserved\n",
151 w->computeUnit->scalarRegsReserved[
w->simdId]);
154 int endIndex =
w->startVgprIndex +
w->reservedVectorRegs;
156 w->computeUnit->registerManager->vrfPoolMgrs[
w->simdId]->
157 freeRegion(
w->startVgprIndex, endIndex);
160 for (
int i = 0;
i <
w->reservedVectorRegs;
i++) {
162 w->computeUnit->vrf[
w->simdId]->markReg(physVgprIdx,
false);
165 w->reservedVectorRegs = 0;
166 w->startVgprIndex = 0;
168 endIndex =
w->startSgprIndex +
w->reservedScalarRegs;
169 w->computeUnit->registerManager->srfPoolMgrs[
w->simdId]->
170 freeRegion(
w->startSgprIndex, endIndex);
173 for (
int i = 0;
i <
w->reservedScalarRegs;
i++) {
175 w->computeUnit->srf[
w->simdId]->markReg(physSgprIdx,
false);
178 w->reservedScalarRegs = 0;
179 w->startSgprIndex = 0;