xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/sfn_instr_lds.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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