44 #include "params/VectorRegisterFile.hh" 49 simdId(p->simd_id), numRegsPerSimd(p->num_regs_per_simd),
56 "multiple of VRF size\n");
78 if (operandSize > 4) {
90 if (operandSize > 4) {
102 if (operandSize > 4) {
110 busy.at(regIdx) = value;
112 if (operandSize > 4) {
120 for (
int i = 0;
i < ii->getNumOperands(); ++
i) {
121 if (ii->isVectorRegister(
i)) {
122 uint32_t vgprIdx = ii->getRegisterIndex(
i, ii);
123 uint32_t pVgpr = w->
remap(vgprIdx, ii->getOperandSize(
i), 1);
125 if (
regBusy(pVgpr, ii->getOperandSize(
i)) == 1) {
126 if (ii->isDstOperand(
i)) {
128 }
else if (ii->isSrcOperand(
i)) {
135 if (
regNxtBusy(pVgpr, ii->getOperandSize(
i)) == 1) {
136 if (ii->isDstOperand(
i)) {
138 }
else if (ii->isSrcOperand(
i)) {
153 bool loadInstr = ii->isLoad();
154 bool atomicInstr = ii->isAtomic() || ii->isMemFence();
156 bool loadNoArgInstr = loadInstr && !ii->isArgLoad();
159 for (
int i = 0;
i < ii->getNumOperands(); ++
i) {
160 if (ii->isVectorRegister(
i) && ii->isDstOperand(
i)) {
161 uint32_t physReg = w->
remap(ii->getRegisterIndex(
i, ii),
162 ii->getOperandSize(
i), 1);
165 markReg(physReg, ii->getOperandSize(
i), 1);
175 if (!atomicInstr && !loadNoArgInstr) {
176 uint32_t pipeLen = ii->getOperandSize(
i) <= 4 ?
182 ii->getOperandSize(
i),
198 panic_if(regVec.size() <= 0,
"Illegal VGPR vector size=%d\n",
201 for (
int i = 0;
i < regVec.size(); ++
i) {
215 for (
int i = 0;
i < ii->getNumOperands(); ++
i) {
216 if (ii->isVectorRegister(
i) && ii->isDstOperand(
i)) {
217 uint32_t physReg = w->
remap(ii->getRegisterIndex(
i, ii),
218 ii->getOperandSize(
i), 1);
245 VectorRegisterFileParams::create()
void init(uint32_t _size, uint32_t wf_size)
Stats::Scalar numTimesBlockedDueRAWDependencies
std::vector< uint8_t > nxtBusy
bool operandsReady(Wavefront *w, GPUDynInstPtr ii) const
virtual void updateResources(Wavefront *w, GPUDynInstPtr ii)
ComputeUnit * computeUnit
virtual void exec(GPUDynInstPtr ii, Wavefront *w)
void setParent(ComputeUnit *_computeUnit)
Stats::Scalar numTimesBlockedDueWAXDependencies
std::shared_ptr< GPUDynInst > GPUDynInstPtr
VecRegisterState * vgprState
uint8_t regBusy(int idx, uint32_t operandSize) const
virtual bool vrfOperandAccessReady(uint64_t dynamic_id, Wavefront *w, GPUDynInstPtr ii, VrfAccessType accessType)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
void setParent(ComputeUnit *_computeUnit)
uint8_t regNxtBusy(int idx, uint32_t operandSize) const
Tick ticks(int numCycles) const
void markReg(int regIdx, uint32_t operandSize, uint8_t value)
void preMarkReg(int regIdx, uint32_t operandSize, uint8_t value)
void registerEvent(uint32_t simdId, uint32_t regIdx, uint32_t operandSize, uint64_t when, uint8_t newStatus)
uint32_t remap(uint32_t vgprIndex, uint32_t size, uint8_t mode=0)
std::vector< uint8_t > busy
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
VectorRegisterFile(const VectorRegisterFileParams *p)
Abstract superclass for simulation objects.