Path: blob/21.2-virgl/src/gallium/drivers/nouveau/codegen/nv50_ir_sched_gm107.h
4574 views
#ifndef __NV50_IR_SCHED_GM107_H__1#define __NV50_IR_SCHED_GM107_H__2namespace nv50_ir {34class SchedDataCalculatorGM107 : public Pass5{6public:7SchedDataCalculatorGM107(const TargetGM107 *targ) : score(NULL), targ(targ) {}89private:10struct RegScores11{12struct ScoreData {13int r[256];14int p[8];15int c;16} rd, wr;17int base;1819void rebase(const int base)20{21const int delta = this->base - base;22if (!delta)23return;24this->base = 0;2526for (int i = 0; i < 256; ++i) {27rd.r[i] += delta;28wr.r[i] += delta;29}30for (int i = 0; i < 8; ++i) {31rd.p[i] += delta;32wr.p[i] += delta;33}34rd.c += delta;35wr.c += delta;36}37void wipe()38{39memset(&rd, 0, sizeof(rd));40memset(&wr, 0, sizeof(wr));41}42int getLatest(const ScoreData& d) const43{44int max = 0;45for (int i = 0; i < 256; ++i)46if (d.r[i] > max)47max = d.r[i];48for (int i = 0; i < 8; ++i)49if (d.p[i] > max)50max = d.p[i];51if (d.c > max)52max = d.c;53return max;54}55inline int getLatestRd() const56{57return getLatest(rd);58}59inline int getLatestWr() const60{61return getLatest(wr);62}63inline int getLatest() const64{65return MAX2(getLatestRd(), getLatestWr());66}67void setMax(const RegScores *that)68{69for (int i = 0; i < 256; ++i) {70rd.r[i] = MAX2(rd.r[i], that->rd.r[i]);71wr.r[i] = MAX2(wr.r[i], that->wr.r[i]);72}73for (int i = 0; i < 8; ++i) {74rd.p[i] = MAX2(rd.p[i], that->rd.p[i]);75wr.p[i] = MAX2(wr.p[i], that->wr.p[i]);76}77rd.c = MAX2(rd.c, that->rd.c);78wr.c = MAX2(wr.c, that->wr.c);79}80void print(int cycle)81{82for (int i = 0; i < 256; ++i) {83if (rd.r[i] > cycle)84INFO("rd $r%i @ %i\n", i, rd.r[i]);85if (wr.r[i] > cycle)86INFO("wr $r%i @ %i\n", i, wr.r[i]);87}88for (int i = 0; i < 8; ++i) {89if (rd.p[i] > cycle)90INFO("rd $p%i @ %i\n", i, rd.p[i]);91if (wr.p[i] > cycle)92INFO("wr $p%i @ %i\n", i, wr.p[i]);93}94if (rd.c > cycle)95INFO("rd $c @ %i\n", rd.c);96if (wr.c > cycle)97INFO("wr $c @ %i\n", wr.c);98}99};100101RegScores *score; // for current BB102std::vector<RegScores> scoreBoards;103104const TargetGM107 *targ;105bool visit(Function *);106bool visit(BasicBlock *);107108void commitInsn(const Instruction *, int);109int calcDelay(const Instruction *, int) const;110void setDelay(Instruction *, int, const Instruction *);111void recordWr(const Value *, int, int);112void checkRd(const Value *, int, int&) const;113114inline void emitYield(Instruction *);115inline void emitStall(Instruction *, uint8_t);116inline void emitReuse(Instruction *, uint8_t);117inline void emitWrDepBar(Instruction *, uint8_t);118inline void emitRdDepBar(Instruction *, uint8_t);119inline void emitWtDepBar(Instruction *, uint8_t);120121inline int getStall(const Instruction *) const;122inline int getWrDepBar(const Instruction *) const;123inline int getRdDepBar(const Instruction *) const;124inline int getWtDepBar(const Instruction *) const;125126void setReuseFlag(Instruction *);127128inline void printSchedInfo(int, const Instruction *) const;129130struct LiveBarUse {131LiveBarUse(Instruction *insn, Instruction *usei)132: insn(insn), usei(usei) { }133Instruction *insn;134Instruction *usei;135};136137struct LiveBarDef {138LiveBarDef(Instruction *insn, Instruction *defi)139: insn(insn), defi(defi) { }140Instruction *insn;141Instruction *defi;142};143144bool insertBarriers(BasicBlock *);145146bool doesInsnWriteTo(const Instruction *insn, const Value *val) const;147Instruction *findFirstUse(const Instruction *) const;148Instruction *findFirstDef(const Instruction *) const;149150bool needRdDepBar(const Instruction *) const;151bool needWrDepBar(const Instruction *) const;152};153154}; // namespace nv50_ir155#endif156157158