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