From a976a509585e108f650af5c1c3a52041a6f14efc Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Tue, 2 Feb 2021 13:45:50 +0100 Subject: [PATCH] r600/sfn: Add skelton for visitor pattern Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_instruction_alu.h | 3 + .../drivers/r600/sfn/sfn_instruction_base.h | 5 +- .../drivers/r600/sfn/sfn_instruction_block.h | 3 + src/gallium/drivers/r600/sfn/sfn_instruction_cf.h | 29 +++++++ .../drivers/r600/sfn/sfn_instruction_export.h | 14 ++++ .../drivers/r600/sfn/sfn_instruction_fetch.h | 3 + src/gallium/drivers/r600/sfn/sfn_instruction_gds.h | 13 +++- src/gallium/drivers/r600/sfn/sfn_instruction_lds.h | 10 +++ .../drivers/r600/sfn/sfn_instruction_misc.h | 8 ++ src/gallium/drivers/r600/sfn/sfn_instruction_tex.h | 3 + .../drivers/r600/sfn/sfn_instructionvisitor.cpp | 0 .../drivers/r600/sfn/sfn_instructionvisitor.h | 91 ++++++++++++++++++++++ 12 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 src/gallium/drivers/r600/sfn/sfn_instructionvisitor.cpp create mode 100644 src/gallium/drivers/r600/sfn/sfn_instructionvisitor.h diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_alu.h b/src/gallium/drivers/r600/sfn/sfn_instruction_alu.h index 28c8501..383e176 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_alu.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_alu.h @@ -119,6 +119,9 @@ public: void replace_values(const ValueSet& candidates, PValue new_value) override; + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_base.h b/src/gallium/drivers/r600/sfn/sfn_instruction_base.h index 2672315..0689a47 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_base.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_base.h @@ -27,6 +27,7 @@ #ifndef sfn_r600_instr_h #define sfn_r600_instr_h +#include "sfn_instructionvisitor.h" #include "sfn_value_gpr.h" #include "sfn_defines.h" @@ -38,7 +39,6 @@ namespace r600 { - struct rename_reg_pair { bool valid; bool used; @@ -114,6 +114,9 @@ public: void remap_registers(ValueRemapper& map); + virtual bool accept(InstructionVisitor& visitor) = 0; + virtual bool accept(ConstInstructionVisitor& visitor) const = 0; + protected: void add_remappable_src_value(PValue *v); diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_block.h b/src/gallium/drivers/r600/sfn/sfn_instruction_block.h index f90579c..fe40cc1 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_block.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_block.h @@ -63,6 +63,9 @@ public: PInstruction last_instruction(); + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_cf.h b/src/gallium/drivers/r600/sfn/sfn_instruction_cf.h index 10da90f..a137948 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_cf.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_cf.h @@ -39,12 +39,17 @@ protected: class IfElseInstruction : public CFInstruction { public: IfElseInstruction(instr_type type); + }; class IfInstruction : public IfElseInstruction { public: IfInstruction(AluInstruction *pred); const AluInstruction& pred() const {return *m_pred;} + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -55,6 +60,10 @@ private: class ElseInstruction : public IfElseInstruction { public: ElseInstruction(IfInstruction *jump_src); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -66,6 +75,10 @@ private: class IfElseEndInstruction : public IfElseInstruction { public: IfElseEndInstruction(); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -75,6 +88,10 @@ private: class LoopBeginInstruction: public CFInstruction { public: LoopBeginInstruction(); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -84,6 +101,10 @@ private: class LoopEndInstruction: public CFInstruction { public: LoopEndInstruction(LoopBeginInstruction *start); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -94,6 +115,10 @@ private: class LoopBreakInstruction: public CFInstruction { public: LoopBreakInstruction(); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_evalue_liveness(LiverangeEvaluator& eval) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -103,6 +128,10 @@ private: class LoopContInstruction: public CFInstruction { public: LoopContInstruction(); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_export.h b/src/gallium/drivers/r600/sfn/sfn_instruction_export.h index 573f0fd..6d01408 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_export.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_export.h @@ -64,6 +64,10 @@ public: void update_output_map(OutputRegisterMap& map) const; + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; @@ -87,6 +91,9 @@ public: bool indirect() const { return !!m_address;} int array_size() const { return m_array_size;} + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; @@ -116,6 +123,9 @@ public: int comp_mask() const { return m_writemask;} unsigned op() const; + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; @@ -153,6 +163,10 @@ public: void remap_registers_child(std::vector& map, ValueMap& values) override; void patch_ring(int stream, PValue index); + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_fetch.h b/src/gallium/drivers/r600/sfn/sfn_instruction_fetch.h index a57c50a..71a3f69 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_fetch.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_fetch.h @@ -131,6 +131,9 @@ public: bool has_prelude() const {return !m_prelude.empty();} + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_gds.h b/src/gallium/drivers/r600/sfn/sfn_instruction_gds.h index 59d9289..6f8e0f2 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_gds.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_gds.h @@ -79,6 +79,9 @@ public: PValue uav_id() const {return m_uav_id;} int uav_base() const {return m_uav_base;} + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; @@ -172,6 +175,10 @@ public: void set_ack() {m_need_ack = true; } + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + + private: bool is_equal_to(const Instruction& lhs) const override; @@ -201,7 +208,11 @@ public: int sel() const {return m_value.sel();} int chan(int i ) const {return m_value.chan_i(i);} - void replace_values(const ValueSet& candidates, PValue new_value) override; + void replace_values(const ValueSet& candiates, PValue new_value) override; + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_lds.h b/src/gallium/drivers/r600/sfn/sfn_instruction_lds.h index f146083..96439a7 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_lds.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_lds.h @@ -13,6 +13,10 @@ public: unsigned num_values() const { return m_dest_value.size();} const Value& address(unsigned i) const { return *m_address[i];} const Value& dest(unsigned i) const { return *m_dest_value[i];} + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_print(std::ostream& os) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -32,6 +36,9 @@ public: const PValue& src1() const { return m_src1_value;} unsigned op() const {return m_opcode;} + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_print(std::ostream& os) const override; bool is_equal_to(const Instruction& lhs) const override; @@ -56,6 +63,9 @@ public: void replace_values(const ValueSet& candidates, PValue new_value) override; + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: void do_print(std::ostream& os) const override; bool is_equal_to(const Instruction& lhs) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_misc.h b/src/gallium/drivers/r600/sfn/sfn_instruction_misc.h index b7be590..d322b4a 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_misc.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_misc.h @@ -36,6 +36,10 @@ public: EmitVertex(int stream, bool cut); ECFOpCode op() const {return m_cut ? cf_cut_vertex: cf_emit_vertex;} int stream() const { return m_stream;} + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; @@ -49,6 +53,10 @@ public: WaitAck(int nack); ECFOpCode op() const {return cf_wait_ack;} int n_ack() const {return m_nack;} + + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h index 70f2e1a..2fe7cba 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h @@ -113,6 +113,9 @@ public: void set_gather_comp(int cmp); + bool accept(InstructionVisitor& visitor) override {return visitor.visit(*this);} + bool accept(ConstInstructionVisitor& visitor) const override {return visitor.visit(*this);} + private: bool is_equal_to(const Instruction& lhs) const override; void do_print(std::ostream& os) const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_instructionvisitor.cpp b/src/gallium/drivers/r600/sfn/sfn_instructionvisitor.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/gallium/drivers/r600/sfn/sfn_instructionvisitor.h b/src/gallium/drivers/r600/sfn/sfn_instructionvisitor.h new file mode 100644 index 0000000..9b34fcd --- /dev/null +++ b/src/gallium/drivers/r600/sfn/sfn_instructionvisitor.h @@ -0,0 +1,91 @@ +#ifndef INSTRUCTIONVISITOR_H +#define INSTRUCTIONVISITOR_H + +namespace r600 { + + +class AluInstruction; +class ExportInstruction; +class TexInstruction; +class FetchInstruction; +class IfInstruction; +class ElseInstruction; +class IfElseEndInstruction; +class LoopBeginInstruction; +class LoopEndInstruction; +class LoopBreakInstruction; +class LoopContInstruction; +class StreamOutIntruction; +class MemRingOutIntruction; +class EmitVertex; +class WaitAck; +class WriteScratchInstruction; +class GDSInstr; +class RatInstruction; +class LDSWriteInstruction; +class LDSReadInstruction; +class LDSAtomicInstruction; +class GDSStoreTessFactor; +class InstructionBlock; + +class InstructionVisitor +{ +public: + virtual ~InstructionVisitor() {}; + virtual bool visit(AluInstruction& i) = 0; + virtual bool visit(ExportInstruction& i) = 0; + virtual bool visit(TexInstruction& i) = 0; + virtual bool visit(FetchInstruction& i) = 0; + virtual bool visit(IfInstruction& i) = 0; + virtual bool visit(ElseInstruction& i) = 0; + virtual bool visit(IfElseEndInstruction& i) = 0; + virtual bool visit(LoopBeginInstruction& i) = 0; + virtual bool visit(LoopEndInstruction& i) = 0; + virtual bool visit(LoopBreakInstruction& i) = 0; + virtual bool visit(LoopContInstruction& i) = 0; + virtual bool visit(StreamOutIntruction& i) = 0; + virtual bool visit(MemRingOutIntruction& i) = 0; + virtual bool visit(EmitVertex& i) = 0; + virtual bool visit(WaitAck& i) = 0; + virtual bool visit(WriteScratchInstruction& i) = 0; + virtual bool visit(GDSInstr& i) = 0; + virtual bool visit(RatInstruction& i) = 0; + virtual bool visit(LDSWriteInstruction& i) = 0; + virtual bool visit(LDSReadInstruction& i) = 0; + virtual bool visit(LDSAtomicInstruction& i) = 0; + virtual bool visit(GDSStoreTessFactor& i) = 0; + virtual bool visit(InstructionBlock& i) = 0; +}; + +class ConstInstructionVisitor +{ +public: + virtual ~ConstInstructionVisitor() {}; + virtual bool visit(const AluInstruction& i) = 0; + virtual bool visit(const ExportInstruction& i) = 0; + virtual bool visit(const TexInstruction& i) = 0; + virtual bool visit(const FetchInstruction& i) = 0; + virtual bool visit(const IfInstruction& i) = 0; + virtual bool visit(const ElseInstruction& i) = 0; + virtual bool visit(const IfElseEndInstruction& i) = 0; + virtual bool visit(const LoopBeginInstruction& i) = 0; + virtual bool visit(const LoopEndInstruction& i) = 0; + virtual bool visit(const LoopBreakInstruction& i) = 0; + virtual bool visit(const LoopContInstruction& i) = 0; + virtual bool visit(const StreamOutIntruction& i) = 0; + virtual bool visit(const MemRingOutIntruction& i) = 0; + virtual bool visit(const EmitVertex& i) = 0; + virtual bool visit(const WaitAck& i) = 0; + virtual bool visit(const WriteScratchInstruction& i) = 0; + virtual bool visit(const GDSInstr& i) = 0; + virtual bool visit(const RatInstruction& i) = 0; + virtual bool visit(const LDSWriteInstruction& i) = 0; + virtual bool visit(const LDSReadInstruction& i) = 0; + virtual bool visit(const LDSAtomicInstruction& i) = 0; + virtual bool visit(const GDSStoreTessFactor& i) = 0; + virtual bool visit(const InstructionBlock& i) = 0; +}; + +} + +#endif // INSTRUCTIONVISITOR_H -- 2.7.4