xref: /aosp_15_r20/external/mesa3d/src/compiler/glsl/ir_builder.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2012 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef IR_BUILDER_H
25*61046927SAndroid Build Coastguard Worker #define IR_BUILDER_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "ir.h"
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker namespace ir_builder {
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker /**
32*61046927SAndroid Build Coastguard Worker  * This little class exists to let the helper expression generators
33*61046927SAndroid Build Coastguard Worker  * take either an ir_rvalue * or an ir_variable * to be automatically
34*61046927SAndroid Build Coastguard Worker  * dereferenced, while still providing compile-time type checking.
35*61046927SAndroid Build Coastguard Worker  *
36*61046927SAndroid Build Coastguard Worker  * You don't have to explicitly call the constructor -- C++ will see
37*61046927SAndroid Build Coastguard Worker  * that you passed an ir_variable, and silently call the
38*61046927SAndroid Build Coastguard Worker  * operand(ir_variable *var) constructor behind your back.
39*61046927SAndroid Build Coastguard Worker  */
40*61046927SAndroid Build Coastguard Worker class operand {
41*61046927SAndroid Build Coastguard Worker public:
operand(ir_rvalue * val)42*61046927SAndroid Build Coastguard Worker    operand(ir_rvalue *val)
43*61046927SAndroid Build Coastguard Worker       : val(val)
44*61046927SAndroid Build Coastguard Worker    {
45*61046927SAndroid Build Coastguard Worker    }
46*61046927SAndroid Build Coastguard Worker 
operand(ir_variable * var)47*61046927SAndroid Build Coastguard Worker    operand(ir_variable *var)
48*61046927SAndroid Build Coastguard Worker    {
49*61046927SAndroid Build Coastguard Worker       void *mem_ctx = ralloc_parent(var);
50*61046927SAndroid Build Coastguard Worker       val = new(mem_ctx) ir_dereference_variable(var);
51*61046927SAndroid Build Coastguard Worker    }
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    ir_rvalue *val;
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker /** Automatic generator for ir_dereference_variable on assignment LHS.
57*61046927SAndroid Build Coastguard Worker  *
58*61046927SAndroid Build Coastguard Worker  * \sa operand
59*61046927SAndroid Build Coastguard Worker  */
60*61046927SAndroid Build Coastguard Worker class deref {
61*61046927SAndroid Build Coastguard Worker public:
deref(ir_dereference * val)62*61046927SAndroid Build Coastguard Worker    deref(ir_dereference *val)
63*61046927SAndroid Build Coastguard Worker       : val(val)
64*61046927SAndroid Build Coastguard Worker    {
65*61046927SAndroid Build Coastguard Worker    }
66*61046927SAndroid Build Coastguard Worker 
deref(ir_variable * var)67*61046927SAndroid Build Coastguard Worker    deref(ir_variable *var)
68*61046927SAndroid Build Coastguard Worker    {
69*61046927SAndroid Build Coastguard Worker       void *mem_ctx = ralloc_parent(var);
70*61046927SAndroid Build Coastguard Worker       val = new(mem_ctx) ir_dereference_variable(var);
71*61046927SAndroid Build Coastguard Worker    }
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    ir_dereference *val;
75*61046927SAndroid Build Coastguard Worker };
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker class ir_factory {
78*61046927SAndroid Build Coastguard Worker public:
79*61046927SAndroid Build Coastguard Worker    ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL)
instructions(instructions)80*61046927SAndroid Build Coastguard Worker       : instructions(instructions),
81*61046927SAndroid Build Coastguard Worker         mem_ctx(mem_ctx)
82*61046927SAndroid Build Coastguard Worker    {
83*61046927SAndroid Build Coastguard Worker       return;
84*61046927SAndroid Build Coastguard Worker    }
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    void emit(ir_instruction *ir);
87*61046927SAndroid Build Coastguard Worker    ir_variable *make_temp(const glsl_type *type, const char *name);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    ir_constant*
constant(float f)90*61046927SAndroid Build Coastguard Worker    constant(float f)
91*61046927SAndroid Build Coastguard Worker    {
92*61046927SAndroid Build Coastguard Worker       return new(mem_ctx) ir_constant(f);
93*61046927SAndroid Build Coastguard Worker    }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    ir_constant*
constant(int i)96*61046927SAndroid Build Coastguard Worker    constant(int i)
97*61046927SAndroid Build Coastguard Worker    {
98*61046927SAndroid Build Coastguard Worker       return new(mem_ctx) ir_constant(i);
99*61046927SAndroid Build Coastguard Worker    }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    ir_constant*
constant(unsigned u)102*61046927SAndroid Build Coastguard Worker    constant(unsigned u)
103*61046927SAndroid Build Coastguard Worker    {
104*61046927SAndroid Build Coastguard Worker       return new(mem_ctx) ir_constant(u);
105*61046927SAndroid Build Coastguard Worker    }
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    ir_constant*
constant(bool b)108*61046927SAndroid Build Coastguard Worker    constant(bool b)
109*61046927SAndroid Build Coastguard Worker    {
110*61046927SAndroid Build Coastguard Worker       return new(mem_ctx) ir_constant(b);
111*61046927SAndroid Build Coastguard Worker    }
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    exec_list *instructions;
114*61046927SAndroid Build Coastguard Worker    void *mem_ctx;
115*61046927SAndroid Build Coastguard Worker };
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker ir_assignment *assign(deref lhs, operand rhs);
118*61046927SAndroid Build Coastguard Worker ir_assignment *assign(deref lhs, operand rhs, int writemask);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker ir_return *ret(operand retval);
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a);
123*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a, operand b);
124*61046927SAndroid Build Coastguard Worker ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c);
125*61046927SAndroid Build Coastguard Worker ir_expression *add(operand a, operand b);
126*61046927SAndroid Build Coastguard Worker ir_expression *sub(operand a, operand b);
127*61046927SAndroid Build Coastguard Worker ir_expression *mul(operand a, operand b);
128*61046927SAndroid Build Coastguard Worker ir_expression *imul_high(operand a, operand b);
129*61046927SAndroid Build Coastguard Worker ir_expression *div(operand a, operand b);
130*61046927SAndroid Build Coastguard Worker ir_expression *carry(operand a, operand b);
131*61046927SAndroid Build Coastguard Worker ir_expression *borrow(operand a, operand b);
132*61046927SAndroid Build Coastguard Worker ir_expression *trunc(operand a);
133*61046927SAndroid Build Coastguard Worker ir_expression *round_even(operand a);
134*61046927SAndroid Build Coastguard Worker ir_expression *fract(operand a);
135*61046927SAndroid Build Coastguard Worker ir_expression *dot(operand a, operand b);
136*61046927SAndroid Build Coastguard Worker ir_expression *clamp(operand a, operand b, operand c);
137*61046927SAndroid Build Coastguard Worker ir_expression *saturate(operand a);
138*61046927SAndroid Build Coastguard Worker ir_expression *abs(operand a);
139*61046927SAndroid Build Coastguard Worker ir_expression *neg(operand a);
140*61046927SAndroid Build Coastguard Worker ir_expression *sin(operand a);
141*61046927SAndroid Build Coastguard Worker ir_expression *cos(operand a);
142*61046927SAndroid Build Coastguard Worker ir_expression *exp(operand a);
143*61046927SAndroid Build Coastguard Worker ir_expression *rcp(operand a);
144*61046927SAndroid Build Coastguard Worker ir_expression *rsq(operand a);
145*61046927SAndroid Build Coastguard Worker ir_expression *sqrt(operand a);
146*61046927SAndroid Build Coastguard Worker ir_expression *log(operand a);
147*61046927SAndroid Build Coastguard Worker ir_expression *sign(operand a);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker ir_expression *subr_to_int(operand a);
150*61046927SAndroid Build Coastguard Worker ir_expression *equal(operand a, operand b);
151*61046927SAndroid Build Coastguard Worker ir_expression *nequal(operand a, operand b);
152*61046927SAndroid Build Coastguard Worker ir_expression *less(operand a, operand b);
153*61046927SAndroid Build Coastguard Worker ir_expression *greater(operand a, operand b);
154*61046927SAndroid Build Coastguard Worker ir_expression *lequal(operand a, operand b);
155*61046927SAndroid Build Coastguard Worker ir_expression *gequal(operand a, operand b);
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker ir_expression *logic_not(operand a);
158*61046927SAndroid Build Coastguard Worker ir_expression *logic_and(operand a, operand b);
159*61046927SAndroid Build Coastguard Worker ir_expression *logic_or(operand a, operand b);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker ir_expression *bit_not(operand a);
162*61046927SAndroid Build Coastguard Worker ir_expression *bit_or(operand a, operand b);
163*61046927SAndroid Build Coastguard Worker ir_expression *bit_and(operand a, operand b);
164*61046927SAndroid Build Coastguard Worker ir_expression *bit_xor(operand a, operand b);
165*61046927SAndroid Build Coastguard Worker ir_expression *lshift(operand a, operand b);
166*61046927SAndroid Build Coastguard Worker ir_expression *rshift(operand a, operand b);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker ir_expression *f2i(operand a);
169*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_f2i(operand a);
170*61046927SAndroid Build Coastguard Worker ir_expression *i2f(operand a);
171*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_i2f(operand a);
172*61046927SAndroid Build Coastguard Worker ir_expression *f2u(operand a);
173*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_f2u(operand a);
174*61046927SAndroid Build Coastguard Worker ir_expression *u2f(operand a);
175*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_u2f(operand a);
176*61046927SAndroid Build Coastguard Worker ir_expression *i2u(operand a);
177*61046927SAndroid Build Coastguard Worker ir_expression *u2i(operand a);
178*61046927SAndroid Build Coastguard Worker ir_expression *b2i(operand a);
179*61046927SAndroid Build Coastguard Worker ir_expression *i2b(operand a);
180*61046927SAndroid Build Coastguard Worker ir_expression *f2b(operand a);
181*61046927SAndroid Build Coastguard Worker ir_expression *b2f(operand a);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker ir_expression *f2f16(operand a);
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker ir_expression *f2d(operand a);
186*61046927SAndroid Build Coastguard Worker ir_expression *i2d(operand a);
187*61046927SAndroid Build Coastguard Worker ir_expression *u2d(operand a);
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_d2i64(operand a);
190*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_d2u64(operand a);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_i642d(operand a);
193*61046927SAndroid Build Coastguard Worker ir_expression *bitcast_u642d(operand a);
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker ir_expression *min2(operand a, operand b);
196*61046927SAndroid Build Coastguard Worker ir_expression *max2(operand a, operand b);
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_centroid(operand a);
199*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_offset(operand a, operand b);
200*61046927SAndroid Build Coastguard Worker ir_expression *interpolate_at_sample(operand a, operand b);
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker ir_expression *fma(operand a, operand b, operand c);
203*61046927SAndroid Build Coastguard Worker ir_expression *lrp(operand x, operand y, operand a);
204*61046927SAndroid Build Coastguard Worker ir_expression *csel(operand a, operand b, operand c);
205*61046927SAndroid Build Coastguard Worker ir_expression *bitfield_extract(operand a, operand b, operand c);
206*61046927SAndroid Build Coastguard Worker ir_expression *bitfield_insert(operand a, operand b, operand c, operand d);
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle(operand a, int swizzle, int components);
209*61046927SAndroid Build Coastguard Worker /**
210*61046927SAndroid Build Coastguard Worker  * Swizzle away later components, but preserve the ordering.
211*61046927SAndroid Build Coastguard Worker  */
212*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_for_size(operand a, unsigned components);
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xxxx(operand a);
215*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_yyyy(operand a);
216*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_zzzz(operand a);
217*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_wwww(operand a);
218*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_x(operand a);
219*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_y(operand a);
220*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_z(operand a);
221*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_w(operand a);
222*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xy(operand a);
223*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xyz(operand a);
224*61046927SAndroid Build Coastguard Worker ir_swizzle *swizzle_xyzw(operand a);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker ir_if *if_tree(operand condition,
227*61046927SAndroid Build Coastguard Worker                ir_instruction *then_branch);
228*61046927SAndroid Build Coastguard Worker ir_if *if_tree(operand condition,
229*61046927SAndroid Build Coastguard Worker                ir_instruction *then_branch,
230*61046927SAndroid Build Coastguard Worker                ir_instruction *else_branch);
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker } /* namespace ir_builder */
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker #endif
235