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
29namespace ir_builder {
30
31#ifndef WRITEMASK_X
32enum 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 */
49class operand {
50public:
51   operand(ir_rvalue *val)
52      : val(val)
53   {
54   }
55
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 */
69class deref {
70public:
71   deref(ir_dereference *val)
72      : val(val)
73   {
74   }
75
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
86class ir_factory {
87public:
88   ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL)
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*
99   constant(float f)
100   {
101      return new(mem_ctx) ir_constant(f);
102   }
103
104   ir_constant*
105   constant(int i)
106   {
107      return new(mem_ctx) ir_constant(i);
108   }
109
110   ir_constant*
111   constant(unsigned u)
112   {
113      return new(mem_ctx) ir_constant(u);
114   }
115
116   ir_constant*
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
126ir_assignment *assign(deref lhs, operand rhs);
127ir_assignment *assign(deref lhs, operand rhs, int writemask);
128
129ir_return *ret(operand retval);
130
131ir_expression *expr(ir_expression_operation op, operand a);
132ir_expression *expr(ir_expression_operation op, operand a, operand b);
133ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c);
134ir_expression *add(operand a, operand b);
135ir_expression *sub(operand a, operand b);
136ir_expression *mul(operand a, operand b);
137ir_expression *imul_high(operand a, operand b);
138ir_expression *div(operand a, operand b);
139ir_expression *carry(operand a, operand b);
140ir_expression *borrow(operand a, operand b);
141ir_expression *trunc(operand a);
142ir_expression *round_even(operand a);
143ir_expression *fract(operand a);
144ir_expression *dot(operand a, operand b);
145ir_expression *clamp(operand a, operand b, operand c);
146ir_expression *saturate(operand a);
147ir_expression *abs(operand a);
148ir_expression *neg(operand a);
149ir_expression *sin(operand a);
150ir_expression *cos(operand a);
151ir_expression *exp(operand a);
152ir_expression *rcp(operand a);
153ir_expression *rsq(operand a);
154ir_expression *sqrt(operand a);
155ir_expression *log(operand a);
156ir_expression *sign(operand a);
157
158ir_expression *subr_to_int(operand a);
159ir_expression *equal(operand a, operand b);
160ir_expression *nequal(operand a, operand b);
161ir_expression *less(operand a, operand b);
162ir_expression *greater(operand a, operand b);
163ir_expression *lequal(operand a, operand b);
164ir_expression *gequal(operand a, operand b);
165
166ir_expression *logic_not(operand a);
167ir_expression *logic_and(operand a, operand b);
168ir_expression *logic_or(operand a, operand b);
169
170ir_expression *bit_not(operand a);
171ir_expression *bit_or(operand a, operand b);
172ir_expression *bit_and(operand a, operand b);
173ir_expression *bit_xor(operand a, operand b);
174ir_expression *lshift(operand a, operand b);
175ir_expression *rshift(operand a, operand b);
176
177ir_expression *f2i(operand a);
178ir_expression *bitcast_f2i(operand a);
179ir_expression *i2f(operand a);
180ir_expression *bitcast_i2f(operand a);
181ir_expression *f2u(operand a);
182ir_expression *bitcast_f2u(operand a);
183ir_expression *u2f(operand a);
184ir_expression *bitcast_u2f(operand a);
185ir_expression *i2u(operand a);
186ir_expression *u2i(operand a);
187ir_expression *b2i(operand a);
188ir_expression *i2b(operand a);
189ir_expression *f2b(operand a);
190ir_expression *b2f(operand a);
191
192ir_expression *f2d(operand a);
193ir_expression *i2d(operand a);
194ir_expression *u2d(operand a);
195
196ir_expression *bitcast_d2i64(operand a);
197ir_expression *bitcast_d2u64(operand a);
198
199ir_expression *bitcast_i642d(operand a);
200ir_expression *bitcast_u642d(operand a);
201
202ir_expression *min2(operand a, operand b);
203ir_expression *max2(operand a, operand b);
204
205ir_expression *interpolate_at_centroid(operand a);
206ir_expression *interpolate_at_offset(operand a, operand b);
207ir_expression *interpolate_at_sample(operand a, operand b);
208
209ir_expression *fma(operand a, operand b, operand c);
210ir_expression *lrp(operand x, operand y, operand a);
211ir_expression *csel(operand a, operand b, operand c);
212ir_expression *bitfield_extract(operand a, operand b, operand c);
213ir_expression *bitfield_insert(operand a, operand b, operand c, operand d);
214
215ir_swizzle *swizzle(operand a, int swizzle, int components);
216/**
217 * Swizzle away later components, but preserve the ordering.
218 */
219ir_swizzle *swizzle_for_size(operand a, unsigned components);
220
221ir_swizzle *swizzle_xxxx(operand a);
222ir_swizzle *swizzle_yyyy(operand a);
223ir_swizzle *swizzle_zzzz(operand a);
224ir_swizzle *swizzle_wwww(operand a);
225ir_swizzle *swizzle_x(operand a);
226ir_swizzle *swizzle_y(operand a);
227ir_swizzle *swizzle_z(operand a);
228ir_swizzle *swizzle_w(operand a);
229ir_swizzle *swizzle_xy(operand a);
230ir_swizzle *swizzle_xyz(operand a);
231ir_swizzle *swizzle_xyzw(operand a);
232
233ir_if *if_tree(operand condition,
234               ir_instruction *then_branch);
235ir_if *if_tree(operand condition,
236               ir_instruction *then_branch,
237               ir_instruction *else_branch);
238
239} /* namespace ir_builder */
240
241#endif
242