1 /* -*- mesa-c++  -*-
2  *
3  * Copyright (c) 2018-2019 Collabora LTD
4  *
5  * Author: Gert Wollny <gert.wollny@collabora.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * on the rights to use, copy, modify, merge, publish, distribute, sub
11  * license, and/or sell copies of the Software, and to permit persons to whom
12  * the Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the next
15  * paragraph) shall be included in all copies or substantial portions of the
16  * Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25  */
26 
27 #ifndef SFN_GDSINSTR_H
28 #define SFN_GDSINSTR_H
29 
30 #include "sfn_instruction_base.h"
31 
32 #include <bitset>
33 
34 namespace r600 {
35 
36 class GDSInstr : public Instruction
37 {
38 public:
39    GDSInstr(ESDOp op, const GPRVector& dest,  const PValue& value,
40             const PValue &uav_id, int uav_base);
41    GDSInstr(ESDOp op, const GPRVector& dest,  const PValue& value,
42             const PValue& value2, const PValue &uav_id, int uav_base);
43    GDSInstr(ESDOp op, const GPRVector& dest,  const PValue &uav_id, int uav_base);
44 
op()45    ESDOp op() const {return m_op;}
46 
src_sel()47    int src_sel() const {
48       if (!m_src)
49          return 0;
50 
51       assert(m_src->type() == Value::gpr);
52       return m_src->sel();
53    }
54 
src2_chan()55    int src2_chan() const {
56       if (!m_src2)
57          return 0;
58 
59       assert(m_src->type() == Value::gpr);
60       return m_src->chan();
61    }
62 
src_swizzle(int idx)63    int src_swizzle(int idx) const {assert(idx < 3); return m_src_swizzle[idx];}
64 
dest_sel()65    int dest_sel() const {
66       return m_dest.sel();
67    }
68 
dest_swizzle(int i)69    int dest_swizzle(int i) const {
70       if (i < 4)
71          return m_dest_swizzle[i];
72       return 7;
73    }
74 
set_dest_swizzle(const std::array<int,4> & swz)75    void set_dest_swizzle(const std::array<int,4>& swz) {
76       m_dest_swizzle = swz;
77    }
78 
uav_id()79    PValue uav_id() const {return m_uav_id;}
uav_base()80    int uav_base() const {return m_uav_base;}
81 
82 private:
83 
84    bool is_equal_to(const Instruction& lhs) const override;
85    void do_print(std::ostream& os) const override;
86 
87    ESDOp m_op;
88 
89    PValue m_src;
90    PValue m_src2;
91    GPRVector m_dest;
92    std::array <int, 4> m_dest_swizzle;
93    std::array <int, 3> m_src_swizzle;
94 
95    EBufferIndexMode m_buffer_index_mode;
96    PValue m_uav_id;
97    int m_uav_base;
98    std::bitset<8> m_flags;
99 
100 };
101 
102 class RatInstruction : public Instruction {
103 
104 public:
105    enum ERatOp {
106       NOP,
107       STORE_TYPED,
108       STORE_RAW,
109       STORE_RAW_FDENORM,
110       CMPXCHG_INT,
111       CMPXCHG_FLT,
112       CMPXCHG_FDENORM,
113       ADD,
114       SUB,
115       RSUB,
116       MIN_INT,
117       MIN_UINT,
118       MAX_INT,
119       MAX_UINT,
120       AND,
121       OR,
122       XOR,
123       MSKOR,
124       INC_UINT,
125       DEC_UINT,
126       NOP_RTN = 32,
127       XCHG_RTN = 34,
128       XCHG_FDENORM_RTN,
129       CMPXCHG_INT_RTN,
130       CMPXCHG_FLT_RTN,
131       CMPXCHG_FDENORM_RTN,
132       ADD_RTN,
133       SUB_RTN,
134       RSUB_RTN,
135       MIN_INT_RTN,
136       MIN_UINT_RTN,
137       MAX_INT_RTN,
138       MAX_UINT_RTN,
139       AND_RTN,
140       OR_RTN,
141       XOR_RTN,
142       MSKOR_RTN,
143       UINT_RTN,
144       UNSUPPORTED
145    };
146 
147    RatInstruction(ECFOpCode cf_opcode, ERatOp rat_op,
148                   const GPRVector& data, const GPRVector& index,
149                   int rat_id, const PValue& rat_id_offset,
150                   int burst_count, int comp_mask, int element_size,
151                   bool ack);
152 
rat_id_offset()153    PValue rat_id_offset() const { return m_rat_id_offset;}
rat_id()154    int  rat_id() const { return m_rat_id;}
155 
rat_op()156    ERatOp rat_op() const {return m_rat_op;}
157 
data_gpr()158    int data_gpr() const {return m_data.sel();}
index_gpr()159    int index_gpr() const {return m_index.sel();}
elm_size()160    int elm_size() const {return m_element_size;}
161 
comp_mask()162    int comp_mask() const {return m_comp_mask;}
163 
need_ack()164    bool need_ack() const {return m_need_ack;}
burst_count()165    int burst_count() const {return m_burst_count;}
166 
167    static ERatOp opcode(nir_intrinsic_op opcode);
168 
data_swz(int chan)169    int data_swz(int chan) const {return m_data.chan_i(chan);}
170 
cf_opcode()171    ECFOpCode cf_opcode() const { return m_cf_opcode;}
172 
set_ack()173    void set_ack() {m_need_ack = true; }
174 
175 private:
176 
177    bool is_equal_to(const Instruction& lhs) const override;
178    void do_print(std::ostream& os) const override;
179 
180    ECFOpCode m_cf_opcode;
181    ERatOp m_rat_op;
182 
183    GPRVector m_data;
184    GPRVector m_index;
185 
186    int m_rat_id;
187    PValue m_rat_id_offset;
188    int m_burst_count;
189    int m_comp_mask;
190    int m_element_size;
191 
192    std::bitset<8> m_flags;
193 
194    bool m_need_ack;
195 
196 };
197 
198 class GDSStoreTessFactor : public Instruction {
199 public:
200       GDSStoreTessFactor(GPRVector& value);
sel()201       int sel() const {return m_value.sel();}
chan(int i)202       int chan(int i ) const {return m_value.chan_i(i);}
203 
204       void replace_values(const ValueSet& candiates, PValue new_value) override;
205 private:
206       bool is_equal_to(const Instruction& lhs) const override;
207       void do_print(std::ostream& os) const override;
208 
209       GPRVector m_value;
210 };
211 
212 }
213 
214 #endif // SFN_GDSINSTR_H
215