From 5f8ddbd0698c71e2eb03363d3033cafdcb2a0563 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Sun, 7 Jun 2020 09:52:25 +1000 Subject: [PATCH] nvir/gm107: separate out header for sched data calculator SM70 code emitter will want to reuse this. Signed-off-by: Ben Skeggs Reviewed-by: Karol Herbst Part-of: --- .../nouveau/codegen/nv50_ir_emit_gm107.cpp | 151 +---------------- .../nouveau/codegen/nv50_ir_sched_gm107.h | 156 ++++++++++++++++++ 2 files changed, 157 insertions(+), 150 deletions(-) create mode 100644 src/gallium/drivers/nouveau/codegen/nv50_ir_sched_gm107.h diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp index 6324184204a..dd8e1ab86c4 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp @@ -23,6 +23,7 @@ */ #include "codegen/nv50_ir_target_gm107.h" +#include "codegen/nv50_ir_sched_gm107.h" //#define GM107_DEBUG_SCHED_DATA @@ -3773,156 +3774,6 @@ CodeEmitterGM107::getMinEncodingSize(const Instruction *i) const * sched data calculator ******************************************************************************/ -class SchedDataCalculatorGM107 : public Pass -{ -public: - SchedDataCalculatorGM107(const TargetGM107 *targ) : targ(targ) {} - -private: - struct RegScores - { - struct ScoreData { - int r[256]; - int p[8]; - int c; - } rd, wr; - int base; - - void rebase(const int base) - { - const int delta = this->base - base; - if (!delta) - return; - this->base = 0; - - for (int i = 0; i < 256; ++i) { - rd.r[i] += delta; - wr.r[i] += delta; - } - for (int i = 0; i < 8; ++i) { - rd.p[i] += delta; - wr.p[i] += delta; - } - rd.c += delta; - wr.c += delta; - } - void wipe() - { - memset(&rd, 0, sizeof(rd)); - memset(&wr, 0, sizeof(wr)); - } - int getLatest(const ScoreData& d) const - { - int max = 0; - for (int i = 0; i < 256; ++i) - if (d.r[i] > max) - max = d.r[i]; - for (int i = 0; i < 8; ++i) - if (d.p[i] > max) - max = d.p[i]; - if (d.c > max) - max = d.c; - return max; - } - inline int getLatestRd() const - { - return getLatest(rd); - } - inline int getLatestWr() const - { - return getLatest(wr); - } - inline int getLatest() const - { - return MAX2(getLatestRd(), getLatestWr()); - } - void setMax(const RegScores *that) - { - for (int i = 0; i < 256; ++i) { - rd.r[i] = MAX2(rd.r[i], that->rd.r[i]); - wr.r[i] = MAX2(wr.r[i], that->wr.r[i]); - } - for (int i = 0; i < 8; ++i) { - rd.p[i] = MAX2(rd.p[i], that->rd.p[i]); - wr.p[i] = MAX2(wr.p[i], that->wr.p[i]); - } - rd.c = MAX2(rd.c, that->rd.c); - wr.c = MAX2(wr.c, that->wr.c); - } - void print(int cycle) - { - for (int i = 0; i < 256; ++i) { - if (rd.r[i] > cycle) - INFO("rd $r%i @ %i\n", i, rd.r[i]); - if (wr.r[i] > cycle) - INFO("wr $r%i @ %i\n", i, wr.r[i]); - } - for (int i = 0; i < 8; ++i) { - if (rd.p[i] > cycle) - INFO("rd $p%i @ %i\n", i, rd.p[i]); - if (wr.p[i] > cycle) - INFO("wr $p%i @ %i\n", i, wr.p[i]); - } - if (rd.c > cycle) - INFO("rd $c @ %i\n", rd.c); - if (wr.c > cycle) - INFO("wr $c @ %i\n", wr.c); - } - }; - - RegScores *score; // for current BB - std::vector scoreBoards; - - const TargetGM107 *targ; - bool visit(Function *); - bool visit(BasicBlock *); - - void commitInsn(const Instruction *, int); - int calcDelay(const Instruction *, int) const; - void setDelay(Instruction *, int, const Instruction *); - void recordWr(const Value *, int, int); - void checkRd(const Value *, int, int&) const; - - inline void emitYield(Instruction *); - inline void emitStall(Instruction *, uint8_t); - inline void emitReuse(Instruction *, uint8_t); - inline void emitWrDepBar(Instruction *, uint8_t); - inline void emitRdDepBar(Instruction *, uint8_t); - inline void emitWtDepBar(Instruction *, uint8_t); - - inline int getStall(const Instruction *) const; - inline int getWrDepBar(const Instruction *) const; - inline int getRdDepBar(const Instruction *) const; - inline int getWtDepBar(const Instruction *) const; - - void setReuseFlag(Instruction *); - - inline void printSchedInfo(int, const Instruction *) const; - - struct LiveBarUse { - LiveBarUse(Instruction *insn, Instruction *usei) - : insn(insn), usei(usei) { } - Instruction *insn; - Instruction *usei; - }; - - struct LiveBarDef { - LiveBarDef(Instruction *insn, Instruction *defi) - : insn(insn), defi(defi) { } - Instruction *insn; - Instruction *defi; - }; - - bool insertBarriers(BasicBlock *); - - bool doesInsnWriteTo(const Instruction *insn, const Value *val) const; - Instruction *findFirstUse(const Instruction *) const; - Instruction *findFirstDef(const Instruction *) const; - - bool needRdDepBar(const Instruction *) const; - bool needWrDepBar(const Instruction *) const; -}; - inline void SchedDataCalculatorGM107::emitStall(Instruction *insn, uint8_t cnt) { diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_sched_gm107.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_sched_gm107.h new file mode 100644 index 00000000000..54443ae2770 --- /dev/null +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_sched_gm107.h @@ -0,0 +1,156 @@ +#ifndef __NV50_IR_SCHED_GM107_H__ +#define __NV50_IR_SCHED_GM107_H__ +namespace nv50_ir { + +class SchedDataCalculatorGM107 : public Pass +{ +public: + SchedDataCalculatorGM107(const TargetGM107 *targ) : targ(targ) {} + +private: + struct RegScores + { + struct ScoreData { + int r[256]; + int p[8]; + int c; + } rd, wr; + int base; + + void rebase(const int base) + { + const int delta = this->base - base; + if (!delta) + return; + this->base = 0; + + for (int i = 0; i < 256; ++i) { + rd.r[i] += delta; + wr.r[i] += delta; + } + for (int i = 0; i < 8; ++i) { + rd.p[i] += delta; + wr.p[i] += delta; + } + rd.c += delta; + wr.c += delta; + } + void wipe() + { + memset(&rd, 0, sizeof(rd)); + memset(&wr, 0, sizeof(wr)); + } + int getLatest(const ScoreData& d) const + { + int max = 0; + for (int i = 0; i < 256; ++i) + if (d.r[i] > max) + max = d.r[i]; + for (int i = 0; i < 8; ++i) + if (d.p[i] > max) + max = d.p[i]; + if (d.c > max) + max = d.c; + return max; + } + inline int getLatestRd() const + { + return getLatest(rd); + } + inline int getLatestWr() const + { + return getLatest(wr); + } + inline int getLatest() const + { + return MAX2(getLatestRd(), getLatestWr()); + } + void setMax(const RegScores *that) + { + for (int i = 0; i < 256; ++i) { + rd.r[i] = MAX2(rd.r[i], that->rd.r[i]); + wr.r[i] = MAX2(wr.r[i], that->wr.r[i]); + } + for (int i = 0; i < 8; ++i) { + rd.p[i] = MAX2(rd.p[i], that->rd.p[i]); + wr.p[i] = MAX2(wr.p[i], that->wr.p[i]); + } + rd.c = MAX2(rd.c, that->rd.c); + wr.c = MAX2(wr.c, that->wr.c); + } + void print(int cycle) + { + for (int i = 0; i < 256; ++i) { + if (rd.r[i] > cycle) + INFO("rd $r%i @ %i\n", i, rd.r[i]); + if (wr.r[i] > cycle) + INFO("wr $r%i @ %i\n", i, wr.r[i]); + } + for (int i = 0; i < 8; ++i) { + if (rd.p[i] > cycle) + INFO("rd $p%i @ %i\n", i, rd.p[i]); + if (wr.p[i] > cycle) + INFO("wr $p%i @ %i\n", i, wr.p[i]); + } + if (rd.c > cycle) + INFO("rd $c @ %i\n", rd.c); + if (wr.c > cycle) + INFO("wr $c @ %i\n", wr.c); + } + }; + + RegScores *score; // for current BB + std::vector scoreBoards; + + const TargetGM107 *targ; + bool visit(Function *); + bool visit(BasicBlock *); + + void commitInsn(const Instruction *, int); + int calcDelay(const Instruction *, int) const; + void setDelay(Instruction *, int, const Instruction *); + void recordWr(const Value *, int, int); + void checkRd(const Value *, int, int&) const; + + inline void emitYield(Instruction *); + inline void emitStall(Instruction *, uint8_t); + inline void emitReuse(Instruction *, uint8_t); + inline void emitWrDepBar(Instruction *, uint8_t); + inline void emitRdDepBar(Instruction *, uint8_t); + inline void emitWtDepBar(Instruction *, uint8_t); + + inline int getStall(const Instruction *) const; + inline int getWrDepBar(const Instruction *) const; + inline int getRdDepBar(const Instruction *) const; + inline int getWtDepBar(const Instruction *) const; + + void setReuseFlag(Instruction *); + + inline void printSchedInfo(int, const Instruction *) const; + + struct LiveBarUse { + LiveBarUse(Instruction *insn, Instruction *usei) + : insn(insn), usei(usei) { } + Instruction *insn; + Instruction *usei; + }; + + struct LiveBarDef { + LiveBarDef(Instruction *insn, Instruction *defi) + : insn(insn), defi(defi) { } + Instruction *insn; + Instruction *defi; + }; + + bool insertBarriers(BasicBlock *); + + bool doesInsnWriteTo(const Instruction *insn, const Value *val) const; + Instruction *findFirstUse(const Instruction *) const; + Instruction *findFirstDef(const Instruction *) const; + + bool needRdDepBar(const Instruction *) const; + bool needWrDepBar(const Instruction *) const; +}; + +}; // namespace nv50_ir +#endif -- 2.30.2