blob: 231fbfcdb3eb6ed8c0416ac74e0cff7226e05486 [file] [log] [blame]
Eric Anholt599aac92012-03-19 13:27:06 -07001/*
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
26namespace ir_builder {
27
Chad Versacea32bc532013-01-11 14:54:28 -080028#ifndef WRITEMASK_X
29enum writemask {
30 WRITEMASK_X = 0x1,
31 WRITEMASK_Y = 0x2,
32 WRITEMASK_Z = 0x4,
33 WRITEMASK_W = 0x8,
34};
35#endif
36
Eric Anholtd6e65662012-03-19 14:04:23 -070037/**
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 */
46class operand {
47public:
48 operand(ir_rvalue *val)
49 : val(val)
50 {
51 }
52
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
Eric Anholtd32780d2012-03-19 16:27:34 -070062/** Automatic generator for ir_dereference_variable on assignment LHS.
63 *
64 * \sa operand
65 */
66class deref {
67public:
68 deref(ir_dereference *val)
69 : val(val)
70 {
71 }
72
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
Eric Anholt7e88f8c2012-03-19 16:01:52 -070083class ir_factory {
84public:
Kenneth Graunke8d903282013-09-03 17:07:18 -070085 ir_factory(exec_list *instructions = NULL, void *mem_ctx = NULL)
86 : instructions(instructions),
87 mem_ctx(mem_ctx)
Chad Versacefafcbf52013-01-15 17:29:21 -080088 {
89 return;
90 }
91
Eric Anholt7e88f8c2012-03-19 16:01:52 -070092 void emit(ir_instruction *ir);
Eric Anholt8bb00912012-03-19 16:37:23 -070093 ir_variable *make_temp(const glsl_type *type, const char *name);
Eric Anholt7e88f8c2012-03-19 16:01:52 -070094
Chad Versacea6479ef2013-01-11 15:46:24 -080095 ir_constant*
96 constant(float f)
97 {
98 return new(mem_ctx) ir_constant(f);
99 }
100
101 ir_constant*
102 constant(int i)
103 {
104 return new(mem_ctx) ir_constant(i);
105 }
106
107 ir_constant*
108 constant(unsigned u)
109 {
110 return new(mem_ctx) ir_constant(u);
111 }
112
113 ir_constant*
114 constant(bool b)
115 {
116 return new(mem_ctx) ir_constant(b);
117 }
118
Eric Anholt7e88f8c2012-03-19 16:01:52 -0700119 exec_list *instructions;
120 void *mem_ctx;
121};
122
Eric Anholtd32780d2012-03-19 16:27:34 -0700123ir_assignment *assign(deref lhs, operand rhs);
124ir_assignment *assign(deref lhs, operand rhs, int writemask);
Kenneth Graunkef72a8492013-09-03 16:41:42 -0700125ir_assignment *assign(deref lhs, operand rhs, operand condition);
126ir_assignment *assign(deref lhs, operand rhs, operand condition, int writemask);
Eric Anholtd32780d2012-03-19 16:27:34 -0700127
Kenneth Graunked716b332013-09-03 16:44:25 -0700128ir_return *ret(operand retval);
129
Kenneth Graunke0bb3d4b2012-07-08 22:27:25 -0700130ir_expression *expr(ir_expression_operation op, operand a);
Eric Anholtd6e65662012-03-19 14:04:23 -0700131ir_expression *expr(ir_expression_operation op, operand a, operand b);
Kenneth Graunkeeff2ca12013-09-03 16:37:39 -0700132ir_expression *expr(ir_expression_operation op, operand a, operand b, operand c);
Eric Anholtd6e65662012-03-19 14:04:23 -0700133ir_expression *add(operand a, operand b);
134ir_expression *sub(operand a, operand b);
135ir_expression *mul(operand a, operand b);
Matt Turner06e41a02013-09-17 21:34:15 -0700136ir_expression *imul_high(operand a, operand b);
Chad Versace57901742013-01-11 09:53:21 -0800137ir_expression *div(operand a, operand b);
Matt Turner499d7a72013-09-19 12:56:10 -0700138ir_expression *carry(operand a, operand b);
139ir_expression *borrow(operand a, operand b);
Matt Turnera5455ab2015-01-30 13:50:28 -0800140ir_expression *trunc(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800141ir_expression *round_even(operand a);
Dave Airlie41e9adf2015-02-05 11:54:39 +0200142ir_expression *fract(operand a);
Eric Anholtd6e65662012-03-19 14:04:23 -0700143ir_expression *dot(operand a, operand b);
Chad Versace57901742013-01-11 09:53:21 -0800144ir_expression *clamp(operand a, operand b, operand c);
Eric Anholtd6e65662012-03-19 14:04:23 -0700145ir_expression *saturate(operand a);
Matt Turner16be6292013-08-04 14:09:09 -0700146ir_expression *abs(operand a);
Kenneth Graunke666df562013-09-03 17:02:07 -0700147ir_expression *neg(operand a);
148ir_expression *sin(operand a);
149ir_expression *cos(operand a);
150ir_expression *exp(operand a);
151ir_expression *rsq(operand a);
152ir_expression *sqrt(operand a);
153ir_expression *log(operand a);
154ir_expression *sign(operand a);
Eric Anholt599aac92012-03-19 13:27:06 -0700155
Dave Airlie57f24292015-04-20 10:16:55 +1000156ir_expression *subr_to_int(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800157ir_expression *equal(operand a, operand b);
Matt Turner1cf76c72013-08-04 14:09:35 -0700158ir_expression *nequal(operand a, operand b);
Chad Versace57901742013-01-11 09:53:21 -0800159ir_expression *less(operand a, operand b);
160ir_expression *greater(operand a, operand b);
161ir_expression *lequal(operand a, operand b);
162ir_expression *gequal(operand a, operand b);
163
164ir_expression *logic_not(operand a);
165ir_expression *logic_and(operand a, operand b);
166ir_expression *logic_or(operand a, operand b);
167
168ir_expression *bit_not(operand a);
169ir_expression *bit_or(operand a, operand b);
170ir_expression *bit_and(operand a, operand b);
Ian Romanick7f640412016-09-06 23:17:51 -0700171ir_expression *bit_xor(operand a, operand b);
Chad Versace57901742013-01-11 09:53:21 -0800172ir_expression *lshift(operand a, operand b);
173ir_expression *rshift(operand a, operand b);
174
175ir_expression *f2i(operand a);
Matt Turner6bfb1a82013-08-03 11:33:49 -0700176ir_expression *bitcast_f2i(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800177ir_expression *i2f(operand a);
Matt Turner6bfb1a82013-08-03 11:33:49 -0700178ir_expression *bitcast_i2f(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800179ir_expression *f2u(operand a);
Matt Turner6bfb1a82013-08-03 11:33:49 -0700180ir_expression *bitcast_f2u(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800181ir_expression *u2f(operand a);
Matt Turner6bfb1a82013-08-03 11:33:49 -0700182ir_expression *bitcast_u2f(operand a);
Chad Versace57901742013-01-11 09:53:21 -0800183ir_expression *i2u(operand a);
184ir_expression *u2i(operand a);
Matt Turner57a6bcd2013-08-07 13:00:48 -0700185ir_expression *b2i(operand a);
186ir_expression *i2b(operand a);
Kenneth Graunke666df562013-09-03 17:02:07 -0700187ir_expression *f2b(operand a);
188ir_expression *b2f(operand a);
189
Dave Airlie41e9adf2015-02-05 11:54:39 +0200190ir_expression *f2d(operand a);
191ir_expression *i2d(operand a);
192ir_expression *u2d(operand a);
193
Brian Paul8d1400f2014-01-06 16:11:21 -0700194ir_expression *min2(operand a, operand b);
195ir_expression *max2(operand a, operand b);
Maxence Le Doré61c450f2014-01-03 00:09:50 +0100196
Chris Forbes1d5b0662013-11-10 19:13:54 +1300197ir_expression *interpolate_at_centroid(operand a);
198ir_expression *interpolate_at_offset(operand a, operand b);
199ir_expression *interpolate_at_sample(operand a, operand b);
200
Kenneth Graunke666df562013-09-03 17:02:07 -0700201ir_expression *fma(operand a, operand b, operand c);
202ir_expression *lrp(operand x, operand y, operand a);
Matt Turner7aaa3872013-08-19 10:45:46 -0700203ir_expression *csel(operand a, operand b, operand c);
Ilia Mirkin275c5812015-08-20 21:55:52 -0400204ir_expression *bitfield_extract(operand a, operand b, operand c);
Kenneth Graunke666df562013-09-03 17:02:07 -0700205ir_expression *bitfield_insert(operand a, operand b, operand c, operand d);
Chad Versace57901742013-01-11 09:53:21 -0800206
Kenneth Graunke1a6c0ef2013-09-03 16:55:37 -0700207ir_swizzle *swizzle(operand a, int swizzle, int components);
Kenneth Graunked9da3502012-07-09 20:59:29 -0700208/**
209 * Swizzle away later components, but preserve the ordering.
210 */
Brian Paulc3466312012-11-04 16:43:44 -0700211ir_swizzle *swizzle_for_size(operand a, unsigned components);
Kenneth Graunked9da3502012-07-09 20:59:29 -0700212
Eric Anholtb7823522012-03-19 14:26:04 -0700213ir_swizzle *swizzle_xxxx(operand a);
214ir_swizzle *swizzle_yyyy(operand a);
215ir_swizzle *swizzle_zzzz(operand a);
216ir_swizzle *swizzle_wwww(operand a);
217ir_swizzle *swizzle_x(operand a);
218ir_swizzle *swizzle_y(operand a);
219ir_swizzle *swizzle_z(operand a);
220ir_swizzle *swizzle_w(operand a);
221ir_swizzle *swizzle_xy(operand a);
222ir_swizzle *swizzle_xyz(operand a);
223ir_swizzle *swizzle_xyzw(operand a);
224
Chad Versacef859e4f2013-01-11 15:53:11 -0800225ir_if *if_tree(operand condition,
226 ir_instruction *then_branch);
227ir_if *if_tree(operand condition,
228 ir_instruction *then_branch,
229 ir_instruction *else_branch);
230
Eric Anholt599aac92012-03-19 13:27:06 -0700231} /* namespace ir_builder */