36 #include "config/the_gpu_isa.hh"
37 #include "debug/GPURename.hh"
60 panic_if((vgprIndex >=
w->reservedVectorRegs)
61 || (
w->reservedVectorRegs < 0),
62 "VGPR index %d is out of range: VGPR range=[0,%d]",
63 vgprIndex,
w->reservedVectorRegs);
66 int physicalVgprIndex =
w->startVgprIndex + vgprIndex;
68 panic_if(!((
w->startVgprIndex <= physicalVgprIndex) &&
69 (
w->startVgprIndex +
w->reservedVectorRegs - 1)
70 >= physicalVgprIndex),
71 "Invalid VGPR index %d\n", physicalVgprIndex);
74 return physicalVgprIndex %
w->computeUnit->vrf[
w->simdId]->numRegs();
80 panic_if(!((sgprIndex < w->reservedScalarRegs)
81 && (
w->reservedScalarRegs > 0)),
82 "SGPR index %d is out of range: SGPR range=[0,%d]\n",
83 sgprIndex,
w->reservedScalarRegs);
86 int physicalSgprIndex =
w->startSgprIndex + sgprIndex;
88 panic_if(!((
w->startSgprIndex <= physicalSgprIndex) &&
89 (
w->startSgprIndex +
w->reservedScalarRegs - 1)
90 >= physicalSgprIndex),
91 "Invalid SGPR index %d\n", physicalSgprIndex);
94 return physicalSgprIndex %
w->computeUnit->srf[
w->simdId]->numRegs();
102 canAllocate(nWfs, demandPerWf);
110 canAllocate(nWfs, demandPerWf);
117 uint32_t allocatedSize = 0;
119 allocateRegion(vectorDemand, &allocatedSize);
120 w->reservedVectorRegs = allocatedSize;
123 "VRF[%d] has been overallocated %d > %d\n",
129 allocateRegion(scalarDemand, &allocatedSize);
130 w->reservedScalarRegs = allocatedSize;
133 "SRF[%d] has been overallocated %d > %d\n",
143 w->computeUnit->vectorRegsReserved[
w->simdId] -=
w->reservedVectorRegs;
145 w->computeUnit->scalarRegsReserved[
w->simdId] -=
w->reservedScalarRegs;
147 panic_if(
w->computeUnit->vectorRegsReserved[
w->simdId] < 0,
148 "Freeing VRF[%d] registers left %d registers reserved\n",
150 w->computeUnit->vectorRegsReserved[
w->simdId]);
151 panic_if(
w->computeUnit->scalarRegsReserved[
w->simdId] < 0,
152 "Freeing SRF[%d] registers left %d registers reserved\n",
154 w->computeUnit->scalarRegsReserved[
w->simdId]);
157 int endIndex =
w->startVgprIndex +
w->reservedVectorRegs;
159 w->computeUnit->registerManager->vrfPoolMgrs[
w->simdId]->
160 freeRegion(
w->startVgprIndex, endIndex);
163 for (
int i = 0;
i <
w->reservedVectorRegs;
i++) {
165 w->computeUnit->vrf[
w->simdId]->markReg(physVgprIdx,
false);
168 w->reservedVectorRegs = 0;
169 w->startVgprIndex = 0;
171 endIndex =
w->startSgprIndex +
w->reservedScalarRegs;
172 w->computeUnit->registerManager->srfPoolMgrs[
w->simdId]->
173 freeRegion(
w->startSgprIndex, endIndex);
176 for (
int i = 0;
i <
w->reservedScalarRegs;
i++) {
178 w->computeUnit->srf[
w->simdId]->markReg(physSgprIdx,
false);
181 w->reservedScalarRegs = 0;
182 w->startSgprIndex = 0;