1 /* -*- mesa-c++ -*- 2 * Copyright 2022 Collabora LTD 3 * Author: Gert Wollny <[email protected]> 4 * SPDX-License-Identifier: MIT 5 */ 6 7 #ifndef LDSINSTR_H 8 #define LDSINSTR_H 9 10 #include "sfn_instr_alu.h" 11 #include "sfn_valuefactory.h" 12 13 namespace r600 { 14 15 class LDSReadInstr : public Instr { 16 public: 17 LDSReadInstr(std::vector<PRegister, Allocator<PRegister>>& value, 18 AluInstr::SrcValues& address); 19 num_values()20 unsigned num_values() const { return m_dest_value.size(); } address(unsigned i)21 auto address(unsigned i) const { return m_address[i]; } dest(unsigned i)22 auto dest(unsigned i) const { return m_dest_value[i]; } 23 address(unsigned i)24 auto address(unsigned i) { return m_address[i]; } dest(unsigned i)25 auto dest(unsigned i) { return m_dest_value[i]; } 26 27 void accept(ConstInstrVisitor& visitor) const override; 28 void accept(InstrVisitor& visitor) override; 29 bool replace_dest(PRegister new_dest, AluInstr *move_instr) override; 30 31 AluInstr *split(std::vector<AluInstr *>& out_block, AluInstr *last_lds_instr); 32 33 bool is_equal_to(const LDSReadInstr& lhs) const; 34 35 static auto from_string(std::istream& is, ValueFactory& value_factory) -> Pointer; 36 37 bool remove_unused_components(); 38 39 private: 40 bool do_ready() const override; 41 42 void do_print(std::ostream& os) const override; 43 44 AluInstr::SrcValues m_address; 45 std::vector<PRegister, Allocator<PRegister>> m_dest_value; 46 }; 47 48 class LDSAtomicInstr : public Instr { 49 public: 50 using SrcValues = AluInstr::SrcValues; 51 52 LDSAtomicInstr(ESDOp op, PRegister dest, PVirtualValue address, const SrcValues& src); 53 address()54 auto address() const { return m_address; } dest()55 auto dest() const { return m_dest; } src0()56 auto src0() const { return m_srcs[0]; } src1()57 auto src1() const { return m_srcs.size() > 1 ? m_srcs[1] : nullptr; } 58 address()59 PVirtualValue address() { return m_address; } dest()60 PRegister dest() { return m_dest; } src0()61 PVirtualValue src0() { return m_srcs[0]; } src1()62 PVirtualValue src1() { return m_srcs.size() > 1 ? m_srcs[1] : nullptr; } 63 op()64 unsigned op() const { return m_opcode; } 65 66 void accept(ConstInstrVisitor& visitor) const override; 67 void accept(InstrVisitor& visitor) override; 68 69 AluInstr *split(std::vector<AluInstr *>& out_block, AluInstr *last_lds_instr); 70 bool is_equal_to(const LDSAtomicInstr& lhs) const; 71 72 static auto from_string(std::istream& is, ValueFactory& value_factory) -> Pointer; 73 bool replace_source(PRegister old_src, PVirtualValue new_src) override; 74 75 private: 76 bool do_ready() const override; 77 void do_print(std::ostream& os) const override; 78 79 ESDOp m_opcode; 80 PVirtualValue m_address{nullptr}; 81 PRegister m_dest{nullptr}; 82 SrcValues m_srcs; 83 }; 84 85 } // namespace r600 86 87 #endif // LDSINSTR_H 88