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 #include "ir.h"
25 
26 namespace ir_builder {
27 
28 #ifndef WRITEMASK_X
29 enum writemask {
30    WRITEMASK_X = 0x1,
31    WRITEMASK_Y = 0x2,
32    WRITEMASK_Z = 0x4,
33    WRITEMASK_W = 0x8,
34 };
35 #endif
36 
37 /**
38  * This little class exists to let the helper expression generators
39  * take either an ir_rvalue * or an ir_variable * to be automatically
40  * dereferenced, while still providing compile-time type checking.
41  *
42  * You don't have to explicitly call the constructor -- C++ will see
43  * that you passed an ir_variable, and silently call the
44  * operand(ir_variable *var) constructor behind your back.
45  */
46 class operand {
47 public:
operand(ir_rvalue * val)48    operand(ir_rvalue *val)
49       : val(val)
50    {
51    }
52 
operand(ir_variable * var)53    operand(ir_variable *var)
54    {
55       void *mem_ctx = ralloc_parent(var);
56       val = new(mem_ctx) ir_dereference_variable(var);
57    }
58 
59    ir_rvalue *val;
60 };
61 
62 /** Automatic generator for ir_dereference_variable on assignment LHS.
63  *
64  * \sa operand
65  */
66 class deref {
67 public:
deref(ir_dereference * val)68    deref(ir_dereference *val)
69       : val(val)
70    {
71    }
72 
deref(ir_variable * var)73    deref(ir_variable *var)
74    {
75       void *mem_ctx = ralloc_parent(var);
76       val = new(mem_ctx) ir_dereference_variable(var);
77    }
78 
79 
80    ir_dereference *val;
81 };
82 
83 class ir_factory {
84 public:
85    ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL)
instructions(instructions)86       : instructions(instructions),
87         mem_ctx(mem_ctx)
88    {
89       return;
90    }
91 
92    void emit(ir_instruction *ir);
93    ir_variable *make_temp(const glsl_type *type, const char *name, glsl_precision prec = glsl_precision_undefined);
94 
95    ir_constant*
constant(float f)96    constant(float f)
97    {
98       return new(mem_ctx) ir_constant(f);
99    }
100 
101    ir_constant*
constant(int i)102    constant(int i)
103    {
104       return new(mem_ctx) ir_constant(i);
105    }
106 
107    ir_constant*
constant(unsigned u)108    constant(unsigned u)
109    {
110       return new(mem_ctx) ir_constant(u);
111    }
112 
113    ir_constant*
constant(bool b)114    constant(bool b)
115    {
116       return new(mem_ctx) ir_constant(b);
117    }
118 
119    exec_list *instructions;
120    void *mem_ctx;
121 };
122 
123 ir_assignment *assign(deref lhs, operand rhs);
124 ir_assignment *assign(deref lhs, operand rhs, int writemask);
125 ir_assignment *assign(deref lhs, operand rhs, operand condition);
126 ir_assignment *assign(deref lhs, operand rhs, operand condition, int writemask);
127 
128 ir_return *ret(operand retval);
129 
130 ir_expression *expr(ir_expression_operation op, operand a);
131 ir_expression *expr(ir_expression_operation op, operand a, operand b);
132 ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c);
133 ir_expression *add(operand a, operand b);
134 ir_expression *sub(operand a, operand b);
135 ir_expression *mul(operand a, operand b);
136 ir_expression *imul_high(operand a, operand b);
137 ir_expression *div(operand a, operand b);
138 ir_expression *carry(operand a, operand b);
139 ir_expression *borrow(operand a, operand b);
140 ir_expression *round_even(operand a);
141 ir_expression *dot(operand a, operand b);
142 ir_expression *clamp(operand a, operand b, operand c);
143 ir_expression *saturate(operand a);
144 ir_expression *abs(operand a);
145 ir_expression *neg(operand a);
146 ir_expression *sin(operand a);
147 ir_expression *cos(operand a);
148 ir_expression *exp(operand a);
149 ir_expression *rsq(operand a);
150 ir_expression *sqrt(operand a);
151 ir_expression *log(operand a);
152 ir_expression *sign(operand a);
153 
154 ir_expression *equal(operand a, operand b);
155 ir_expression *nequal(operand a, operand b);
156 ir_expression *less(operand a, operand b);
157 ir_expression *greater(operand a, operand b);
158 ir_expression *lequal(operand a, operand b);
159 ir_expression *gequal(operand a, operand b);
160 
161 ir_expression *logic_not(operand a);
162 ir_expression *logic_and(operand a, operand b);
163 ir_expression *logic_or(operand a, operand b);
164 
165 ir_expression *bit_not(operand a);
166 ir_expression *bit_or(operand a, operand b);
167 ir_expression *bit_and(operand a, operand b);
168 ir_expression *lshift(operand a, operand b);
169 ir_expression *rshift(operand a, operand b);
170 
171 ir_expression *f2i(operand a);
172 ir_expression *bitcast_f2i(operand a);
173 ir_expression *i2f(operand a);
174 ir_expression *bitcast_i2f(operand a);
175 ir_expression *f2u(operand a);
176 ir_expression *bitcast_f2u(operand a);
177 ir_expression *u2f(operand a);
178 ir_expression *bitcast_u2f(operand a);
179 ir_expression *i2u(operand a);
180 ir_expression *u2i(operand a);
181 ir_expression *b2i(operand a);
182 ir_expression *i2b(operand a);
183 ir_expression *f2b(operand a);
184 ir_expression *b2f(operand a);
185 
186 ir_expression *min2(operand a, operand b);
187 ir_expression *max2(operand a, operand b);
188 
189 ir_expression *interpolate_at_centroid(operand a);
190 ir_expression *interpolate_at_offset(operand a, operand b);
191 ir_expression *interpolate_at_sample(operand a, operand b);
192 
193 ir_expression *fma(operand a, operand b, operand c);
194 ir_expression *lrp(operand x, operand y, operand a);
195 ir_expression *csel(operand a, operand b, operand c);
196 ir_expression *bitfield_insert(operand a, operand b, operand c, operand d);
197 
198 ir_swizzle *swizzle(operand a, int swizzle, int components);
199 /**
200  * Swizzle away later components, but preserve the ordering.
201  */
202 ir_swizzle *swizzle_for_size(operand a, unsigned components);
203 
204 ir_swizzle *swizzle_xxxx(operand a);
205 ir_swizzle *swizzle_yyyy(operand a);
206 ir_swizzle *swizzle_zzzz(operand a);
207 ir_swizzle *swizzle_wwww(operand a);
208 ir_swizzle *swizzle_x(operand a);
209 ir_swizzle *swizzle_y(operand a);
210 ir_swizzle *swizzle_z(operand a);
211 ir_swizzle *swizzle_w(operand a);
212 ir_swizzle *swizzle_xy(operand a);
213 ir_swizzle *swizzle_xyz(operand a);
214 ir_swizzle *swizzle_xyzw(operand a);
215 
216 ir_if *if_tree(operand condition,
217                ir_instruction *then_branch);
218 ir_if *if_tree(operand condition,
219                ir_instruction *then_branch,
220                ir_instruction *else_branch);
221 
222 } /* namespace ir_builder */
223