ir_builder.cpp revision b8e80941
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_builder.h"
25#include "program/prog_instruction.h"
26
27using namespace ir_builder;
28
29namespace ir_builder {
30
31void
32ir_factory::emit(ir_instruction *ir)
33{
34   instructions->push_tail(ir);
35}
36
37ir_variable *
38ir_factory::make_temp(const glsl_type *type, const char *name)
39{
40   ir_variable *var;
41
42   var = new(mem_ctx) ir_variable(type, name, ir_var_temporary);
43   emit(var);
44
45   return var;
46}
47
48ir_assignment *
49assign(deref lhs, operand rhs, operand condition, int writemask)
50{
51   void *mem_ctx = ralloc_parent(lhs.val);
52
53   ir_assignment *assign = new(mem_ctx) ir_assignment(lhs.val,
54                                                      rhs.val,
55                                                      condition.val,
56                                                      writemask);
57
58   return assign;
59}
60
61ir_assignment *
62assign(deref lhs, operand rhs)
63{
64   return assign(lhs, rhs, (1 << lhs.val->type->vector_elements) - 1);
65}
66
67ir_assignment *
68assign(deref lhs, operand rhs, int writemask)
69{
70   return assign(lhs, rhs, (ir_rvalue *) NULL, writemask);
71}
72
73ir_assignment *
74assign(deref lhs, operand rhs, operand condition)
75{
76   return assign(lhs, rhs, condition, (1 << lhs.val->type->vector_elements) - 1);
77}
78
79ir_return *
80ret(operand retval)
81{
82   void *mem_ctx = ralloc_parent(retval.val);
83   return new(mem_ctx) ir_return(retval.val);
84}
85
86ir_swizzle *
87swizzle(operand a, int swizzle, int components)
88{
89   void *mem_ctx = ralloc_parent(a.val);
90
91   return new(mem_ctx) ir_swizzle(a.val,
92                                  GET_SWZ(swizzle, 0),
93                                  GET_SWZ(swizzle, 1),
94                                  GET_SWZ(swizzle, 2),
95                                  GET_SWZ(swizzle, 3),
96                                  components);
97}
98
99ir_swizzle *
100swizzle_for_size(operand a, unsigned components)
101{
102   void *mem_ctx = ralloc_parent(a.val);
103
104   if (a.val->type->vector_elements < components)
105      components = a.val->type->vector_elements;
106
107   unsigned s[4] = { 0, 1, 2, 3 };
108   for (int i = components; i < 4; i++)
109      s[i] = components - 1;
110
111   return new(mem_ctx) ir_swizzle(a.val, s, components);
112}
113
114ir_swizzle *
115swizzle_xxxx(operand a)
116{
117   return swizzle(a, SWIZZLE_XXXX, 4);
118}
119
120ir_swizzle *
121swizzle_yyyy(operand a)
122{
123   return swizzle(a, SWIZZLE_YYYY, 4);
124}
125
126ir_swizzle *
127swizzle_zzzz(operand a)
128{
129   return swizzle(a, SWIZZLE_ZZZZ, 4);
130}
131
132ir_swizzle *
133swizzle_wwww(operand a)
134{
135   return swizzle(a, SWIZZLE_WWWW, 4);
136}
137
138ir_swizzle *
139swizzle_x(operand a)
140{
141   return swizzle(a, SWIZZLE_XXXX, 1);
142}
143
144ir_swizzle *
145swizzle_y(operand a)
146{
147   return swizzle(a, SWIZZLE_YYYY, 1);
148}
149
150ir_swizzle *
151swizzle_z(operand a)
152{
153   return swizzle(a, SWIZZLE_ZZZZ, 1);
154}
155
156ir_swizzle *
157swizzle_w(operand a)
158{
159   return swizzle(a, SWIZZLE_WWWW, 1);
160}
161
162ir_swizzle *
163swizzle_xy(operand a)
164{
165   return swizzle(a, SWIZZLE_XYZW, 2);
166}
167
168ir_swizzle *
169swizzle_xyz(operand a)
170{
171   return swizzle(a, SWIZZLE_XYZW, 3);
172}
173
174ir_swizzle *
175swizzle_xyzw(operand a)
176{
177   return swizzle(a, SWIZZLE_XYZW, 4);
178}
179
180ir_expression *
181expr(ir_expression_operation op, operand a)
182{
183   void *mem_ctx = ralloc_parent(a.val);
184
185   return new(mem_ctx) ir_expression(op, a.val);
186}
187
188ir_expression *
189expr(ir_expression_operation op, operand a, operand b)
190{
191   void *mem_ctx = ralloc_parent(a.val);
192
193   return new(mem_ctx) ir_expression(op, a.val, b.val);
194}
195
196ir_expression *
197expr(ir_expression_operation op, operand a, operand b, operand c)
198{
199   void *mem_ctx = ralloc_parent(a.val);
200
201   return new(mem_ctx) ir_expression(op, a.val, b.val, c.val);
202}
203
204ir_expression *add(operand a, operand b)
205{
206   return expr(ir_binop_add, a, b);
207}
208
209ir_expression *sub(operand a, operand b)
210{
211   return expr(ir_binop_sub, a, b);
212}
213
214ir_expression *min2(operand a, operand b)
215{
216   return expr(ir_binop_min, a, b);
217}
218
219ir_expression *max2(operand a, operand b)
220{
221   return expr(ir_binop_max, a, b);
222}
223
224ir_expression *mul(operand a, operand b)
225{
226   return expr(ir_binop_mul, a, b);
227}
228
229ir_expression *imul_high(operand a, operand b)
230{
231   return expr(ir_binop_imul_high, a, b);
232}
233
234ir_expression *div(operand a, operand b)
235{
236   return expr(ir_binop_div, a, b);
237}
238
239ir_expression *carry(operand a, operand b)
240{
241   return expr(ir_binop_carry, a, b);
242}
243
244ir_expression *borrow(operand a, operand b)
245{
246   return expr(ir_binop_borrow, a, b);
247}
248
249ir_expression *trunc(operand a)
250{
251   return expr(ir_unop_trunc, a);
252}
253
254ir_expression *round_even(operand a)
255{
256   return expr(ir_unop_round_even, a);
257}
258
259ir_expression *fract(operand a)
260{
261   return expr(ir_unop_fract, a);
262}
263
264/* dot for vectors, mul for scalars */
265ir_expression *dot(operand a, operand b)
266{
267   assert(a.val->type == b.val->type);
268
269   if (a.val->type->vector_elements == 1)
270      return expr(ir_binop_mul, a, b);
271
272   return expr(ir_binop_dot, a, b);
273}
274
275ir_expression*
276clamp(operand a, operand b, operand c)
277{
278   return expr(ir_binop_min, expr(ir_binop_max, a, b), c);
279}
280
281ir_expression *
282saturate(operand a)
283{
284   return expr(ir_unop_saturate, a);
285}
286
287ir_expression *
288abs(operand a)
289{
290   return expr(ir_unop_abs, a);
291}
292
293ir_expression *
294neg(operand a)
295{
296   return expr(ir_unop_neg, a);
297}
298
299ir_expression *
300sin(operand a)
301{
302   return expr(ir_unop_sin, a);
303}
304
305ir_expression *
306cos(operand a)
307{
308   return expr(ir_unop_cos, a);
309}
310
311ir_expression *
312exp(operand a)
313{
314   return expr(ir_unop_exp, a);
315}
316
317ir_expression *
318rcp(operand a)
319{
320   return expr(ir_unop_rcp, a);
321}
322
323ir_expression *
324rsq(operand a)
325{
326   return expr(ir_unop_rsq, a);
327}
328
329ir_expression *
330sqrt(operand a)
331{
332   return expr(ir_unop_sqrt, a);
333}
334
335ir_expression *
336log(operand a)
337{
338   return expr(ir_unop_log, a);
339}
340
341ir_expression *
342sign(operand a)
343{
344   return expr(ir_unop_sign, a);
345}
346
347ir_expression *
348subr_to_int(operand a)
349{
350   return expr(ir_unop_subroutine_to_int, a);
351}
352
353ir_expression*
354equal(operand a, operand b)
355{
356   return expr(ir_binop_equal, a, b);
357}
358
359ir_expression*
360nequal(operand a, operand b)
361{
362   return expr(ir_binop_nequal, a, b);
363}
364
365ir_expression*
366less(operand a, operand b)
367{
368   return expr(ir_binop_less, a, b);
369}
370
371ir_expression*
372greater(operand a, operand b)
373{
374   return expr(ir_binop_less, b, a);
375}
376
377ir_expression*
378lequal(operand a, operand b)
379{
380   return expr(ir_binop_gequal, b, a);
381}
382
383ir_expression*
384gequal(operand a, operand b)
385{
386   return expr(ir_binop_gequal, a, b);
387}
388
389ir_expression*
390logic_not(operand a)
391{
392   return expr(ir_unop_logic_not, a);
393}
394
395ir_expression*
396logic_and(operand a, operand b)
397{
398   return expr(ir_binop_logic_and, a, b);
399}
400
401ir_expression*
402logic_or(operand a, operand b)
403{
404   return expr(ir_binop_logic_or, a, b);
405}
406
407ir_expression*
408bit_not(operand a)
409{
410   return expr(ir_unop_bit_not, a);
411}
412
413ir_expression*
414bit_and(operand a, operand b)
415{
416   return expr(ir_binop_bit_and, a, b);
417}
418
419ir_expression*
420bit_or(operand a, operand b)
421{
422   return expr(ir_binop_bit_or, a, b);
423}
424
425ir_expression*
426bit_xor(operand a, operand b)
427{
428   return expr(ir_binop_bit_xor, a, b);
429}
430
431ir_expression*
432lshift(operand a, operand b)
433{
434   return expr(ir_binop_lshift, a, b);
435}
436
437ir_expression*
438rshift(operand a, operand b)
439{
440   return expr(ir_binop_rshift, a, b);
441}
442
443ir_expression*
444f2i(operand a)
445{
446   return expr(ir_unop_f2i, a);
447}
448
449ir_expression*
450bitcast_f2i(operand a)
451{
452   return expr(ir_unop_bitcast_f2i, a);
453}
454
455ir_expression*
456i2f(operand a)
457{
458   return expr(ir_unop_i2f, a);
459}
460
461ir_expression*
462bitcast_i2f(operand a)
463{
464   return expr(ir_unop_bitcast_i2f, a);
465}
466
467ir_expression*
468i2u(operand a)
469{
470   return expr(ir_unop_i2u, a);
471}
472
473ir_expression*
474u2i(operand a)
475{
476   return expr(ir_unop_u2i, a);
477}
478
479ir_expression*
480f2u(operand a)
481{
482   return expr(ir_unop_f2u, a);
483}
484
485ir_expression*
486bitcast_f2u(operand a)
487{
488   return expr(ir_unop_bitcast_f2u, a);
489}
490
491ir_expression*
492u2f(operand a)
493{
494   return expr(ir_unop_u2f, a);
495}
496
497ir_expression*
498bitcast_u2f(operand a)
499{
500   return expr(ir_unop_bitcast_u2f, a);
501}
502
503ir_expression*
504i2b(operand a)
505{
506   return expr(ir_unop_i2b, a);
507}
508
509ir_expression*
510b2i(operand a)
511{
512   return expr(ir_unop_b2i, a);
513}
514
515ir_expression *
516f2b(operand a)
517{
518   return expr(ir_unop_f2b, a);
519}
520
521ir_expression *
522b2f(operand a)
523{
524   return expr(ir_unop_b2f, a);
525}
526
527ir_expression*
528bitcast_d2i64(operand a)
529{
530   return expr(ir_unop_bitcast_d2i64, a);
531}
532
533ir_expression*
534bitcast_d2u64(operand a)
535{
536   return expr(ir_unop_bitcast_d2u64, a);
537}
538
539ir_expression*
540bitcast_i642d(operand a)
541{
542   return expr(ir_unop_bitcast_i642d, a);
543}
544
545ir_expression*
546bitcast_u642d(operand a)
547{
548   return expr(ir_unop_bitcast_u642d, a);
549}
550
551ir_expression *
552interpolate_at_centroid(operand a)
553{
554   return expr(ir_unop_interpolate_at_centroid, a);
555}
556
557ir_expression *
558interpolate_at_offset(operand a, operand b)
559{
560   return expr(ir_binop_interpolate_at_offset, a, b);
561}
562
563ir_expression *
564interpolate_at_sample(operand a, operand b)
565{
566   return expr(ir_binop_interpolate_at_sample, a, b);
567}
568
569ir_expression *
570f2d(operand a)
571{
572   return expr(ir_unop_f2d, a);
573}
574
575ir_expression *
576i2d(operand a)
577{
578   return expr(ir_unop_i2d, a);
579}
580
581ir_expression *
582u2d(operand a)
583{
584   return expr(ir_unop_u2d, a);
585}
586
587ir_expression *
588fma(operand a, operand b, operand c)
589{
590   return expr(ir_triop_fma, a, b, c);
591}
592
593ir_expression *
594lrp(operand x, operand y, operand a)
595{
596   return expr(ir_triop_lrp, x, y, a);
597}
598
599ir_expression *
600csel(operand a, operand b, operand c)
601{
602   return expr(ir_triop_csel, a, b, c);
603}
604
605ir_expression *
606bitfield_extract(operand a, operand b, operand c)
607{
608   return expr(ir_triop_bitfield_extract, a, b, c);
609}
610
611ir_expression *
612bitfield_insert(operand a, operand b, operand c, operand d)
613{
614   void *mem_ctx = ralloc_parent(a.val);
615   return new(mem_ctx) ir_expression(ir_quadop_bitfield_insert,
616                                     a.val->type, a.val, b.val, c.val, d.val);
617}
618
619ir_if*
620if_tree(operand condition,
621        ir_instruction *then_branch)
622{
623   assert(then_branch != NULL);
624
625   void *mem_ctx = ralloc_parent(condition.val);
626
627   ir_if *result = new(mem_ctx) ir_if(condition.val);
628   result->then_instructions.push_tail(then_branch);
629   return result;
630}
631
632ir_if*
633if_tree(operand condition,
634        ir_instruction *then_branch,
635        ir_instruction *else_branch)
636{
637   assert(then_branch != NULL);
638   assert(else_branch != NULL);
639
640   void *mem_ctx = ralloc_parent(condition.val);
641
642   ir_if *result = new(mem_ctx) ir_if(condition.val);
643   result->then_instructions.push_tail(then_branch);
644   result->else_instructions.push_tail(else_branch);
645   return result;
646}
647
648} /* namespace ir_builder */
649