460d43b02e1361f2532ea3db63ebdb794d0d54b4
[profile/ivi/mesa.git] / src / glsl / ir.cpp
1 /*
2  * Copyright © 2010 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
21  * DEALINGS IN THE SOFTWARE.
22  */
23 #include <string.h>
24 #include "main/core.h" /* for MAX2 */
25 #include "ir.h"
26 #include "ir_visitor.h"
27 #include "glsl_types.h"
28
29 ir_rvalue::ir_rvalue()
30 {
31    this->type = glsl_type::error_type;
32 }
33
34 bool ir_rvalue::is_zero() const
35 {
36    return false;
37 }
38
39 bool ir_rvalue::is_one() const
40 {
41    return false;
42 }
43
44 bool ir_rvalue::is_negative_one() const
45 {
46    return false;
47 }
48
49 /**
50  * Modify the swizzle make to move one component to another
51  *
52  * \param m    IR swizzle to be modified
53  * \param from Component in the RHS that is to be swizzled
54  * \param to   Desired swizzle location of \c from
55  */
56 static void
57 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
58 {
59    switch (to) {
60    case 0: m.x = from; break;
61    case 1: m.y = from; break;
62    case 2: m.z = from; break;
63    case 3: m.w = from; break;
64    default: assert(!"Should not get here.");
65    }
66
67    m.num_components = MAX2(m.num_components, (to + 1));
68 }
69
70 void
71 ir_assignment::set_lhs(ir_rvalue *lhs)
72 {
73    void *mem_ctx = this;
74    bool swizzled = false;
75
76    while (lhs != NULL) {
77       ir_swizzle *swiz = lhs->as_swizzle();
78
79       if (swiz == NULL)
80          break;
81
82       unsigned write_mask = 0;
83       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
84
85       for (unsigned i = 0; i < swiz->mask.num_components; i++) {
86          unsigned c = 0;
87
88          switch (i) {
89          case 0: c = swiz->mask.x; break;
90          case 1: c = swiz->mask.y; break;
91          case 2: c = swiz->mask.z; break;
92          case 3: c = swiz->mask.w; break;
93          default: assert(!"Should not get here.");
94          }
95
96          write_mask |= (((this->write_mask >> i) & 1) << c);
97          update_rhs_swizzle(rhs_swiz, i, c);
98       }
99
100       this->write_mask = write_mask;
101       lhs = swiz->val;
102
103       this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
104       swizzled = true;
105    }
106
107    if (swizzled) {
108       /* Now, RHS channels line up with the LHS writemask.  Collapse it
109        * to just the channels that will be written.
110        */
111       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
112       int rhs_chan = 0;
113       for (int i = 0; i < 4; i++) {
114          if (write_mask & (1 << i))
115             update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
116       }
117       this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
118    }
119
120    assert((lhs == NULL) || lhs->as_dereference());
121
122    this->lhs = (ir_dereference *) lhs;
123 }
124
125 ir_variable *
126 ir_assignment::whole_variable_written()
127 {
128    ir_variable *v = this->lhs->whole_variable_referenced();
129
130    if (v == NULL)
131       return NULL;
132
133    if (v->type->is_scalar())
134       return v;
135
136    if (v->type->is_vector()) {
137       const unsigned mask = (1U << v->type->vector_elements) - 1;
138
139       if (mask != this->write_mask)
140          return NULL;
141    }
142
143    /* Either all the vector components are assigned or the variable is some
144     * composite type (and the whole thing is assigned.
145     */
146    return v;
147 }
148
149 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs,
150                              ir_rvalue *condition, unsigned write_mask)
151 {
152    this->ir_type = ir_type_assignment;
153    this->condition = condition;
154    this->rhs = rhs;
155    this->lhs = lhs;
156    this->write_mask = write_mask;
157
158    if (lhs->type->is_scalar() || lhs->type->is_vector()) {
159       int lhs_components = 0;
160       for (int i = 0; i < 4; i++) {
161          if (write_mask & (1 << i))
162             lhs_components++;
163       }
164
165       assert(lhs_components == this->rhs->type->vector_elements);
166    }
167 }
168
169 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs,
170                              ir_rvalue *condition)
171 {
172    this->ir_type = ir_type_assignment;
173    this->condition = condition;
174    this->rhs = rhs;
175
176    /* If the RHS is a vector type, assume that all components of the vector
177     * type are being written to the LHS.  The write mask comes from the RHS
178     * because we can have a case where the LHS is a vec4 and the RHS is a
179     * vec3.  In that case, the assignment is:
180     *
181     *     (assign (...) (xyz) (var_ref lhs) (var_ref rhs))
182     */
183    if (rhs->type->is_vector())
184       this->write_mask = (1U << rhs->type->vector_elements) - 1;
185    else if (rhs->type->is_scalar())
186       this->write_mask = 1;
187    else
188       this->write_mask = 0;
189
190    this->set_lhs(lhs);
191 }
192
193
194 ir_expression::ir_expression(int op, const struct glsl_type *type,
195                              ir_rvalue *op0)
196 {
197    assert(get_num_operands(ir_expression_operation(op)) == 1);
198    this->ir_type = ir_type_expression;
199    this->type = type;
200    this->operation = ir_expression_operation(op);
201    this->operands[0] = op0;
202    this->operands[1] = NULL;
203    this->operands[2] = NULL;
204    this->operands[3] = NULL;
205 }
206
207 ir_expression::ir_expression(int op, const struct glsl_type *type,
208                              ir_rvalue *op0, ir_rvalue *op1)
209 {
210    assert(((op1 == NULL) && (get_num_operands(ir_expression_operation(op)) == 1))
211           || (get_num_operands(ir_expression_operation(op)) == 2));
212    this->ir_type = ir_type_expression;
213    this->type = type;
214    this->operation = ir_expression_operation(op);
215    this->operands[0] = op0;
216    this->operands[1] = op1;
217    this->operands[2] = NULL;
218    this->operands[3] = NULL;
219 }
220
221 ir_expression::ir_expression(int op, const struct glsl_type *type,
222                              ir_rvalue *op0, ir_rvalue *op1,
223                              ir_rvalue *op2, ir_rvalue *op3)
224 {
225    this->ir_type = ir_type_expression;
226    this->type = type;
227    this->operation = ir_expression_operation(op);
228    this->operands[0] = op0;
229    this->operands[1] = op1;
230    this->operands[2] = op2;
231    this->operands[3] = op3;
232 }
233
234 ir_expression::ir_expression(int op, ir_rvalue *op0)
235 {
236    this->ir_type = ir_type_expression;
237
238    this->operation = ir_expression_operation(op);
239    this->operands[0] = op0;
240    this->operands[1] = NULL;
241    this->operands[2] = NULL;
242    this->operands[3] = NULL;
243
244    assert(op <= ir_last_unop);
245
246    switch (this->operation) {
247    case ir_unop_bit_not:
248    case ir_unop_logic_not:
249    case ir_unop_neg:
250    case ir_unop_abs:
251    case ir_unop_sign:
252    case ir_unop_rcp:
253    case ir_unop_rsq:
254    case ir_unop_sqrt:
255    case ir_unop_exp:
256    case ir_unop_log:
257    case ir_unop_exp2:
258    case ir_unop_log2:
259    case ir_unop_trunc:
260    case ir_unop_ceil:
261    case ir_unop_floor:
262    case ir_unop_fract:
263    case ir_unop_round_even:
264    case ir_unop_sin:
265    case ir_unop_cos:
266    case ir_unop_sin_reduced:
267    case ir_unop_cos_reduced:
268    case ir_unop_dFdx:
269    case ir_unop_dFdy:
270       this->type = op0->type;
271       break;
272
273    case ir_unop_f2i:
274    case ir_unop_b2i:
275       this->type = glsl_type::get_instance(GLSL_TYPE_INT,
276                                            op0->type->vector_elements, 1);
277       break;
278
279    case ir_unop_b2f:
280    case ir_unop_i2f:
281    case ir_unop_u2f:
282       this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
283                                            op0->type->vector_elements, 1);
284       break;
285
286    case ir_unop_f2b:
287    case ir_unop_i2b:
288       this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
289                                            op0->type->vector_elements, 1);
290       break;
291
292    case ir_unop_noise:
293       this->type = glsl_type::float_type;
294       break;
295
296    case ir_unop_any:
297       this->type = glsl_type::bool_type;
298       break;
299
300    default:
301       assert(!"not reached: missing automatic type setup for ir_expression");
302       this->type = op0->type;
303       break;
304    }
305 }
306
307 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
308 {
309    this->ir_type = ir_type_expression;
310
311    this->operation = ir_expression_operation(op);
312    this->operands[0] = op0;
313    this->operands[1] = op1;
314    this->operands[2] = NULL;
315    this->operands[3] = NULL;
316
317    assert(op > ir_last_unop);
318
319    switch (this->operation) {
320    case ir_binop_all_equal:
321    case ir_binop_any_nequal:
322       this->type = glsl_type::bool_type;
323       break;
324
325    case ir_binop_add:
326    case ir_binop_sub:
327    case ir_binop_min:
328    case ir_binop_max:
329    case ir_binop_pow:
330    case ir_binop_mul:
331    case ir_binop_div:
332    case ir_binop_mod:
333       if (op0->type->is_scalar()) {
334          this->type = op1->type;
335       } else if (op1->type->is_scalar()) {
336          this->type = op0->type;
337       } else {
338          /* FINISHME: matrix types */
339          assert(!op0->type->is_matrix() && !op1->type->is_matrix());
340          assert(op0->type == op1->type);
341          this->type = op0->type;
342       }
343       break;
344
345    case ir_binop_logic_and:
346    case ir_binop_logic_xor:
347    case ir_binop_logic_or:
348    case ir_binop_bit_and:
349    case ir_binop_bit_xor:
350    case ir_binop_bit_or:
351       if (op0->type->is_scalar()) {
352          this->type = op1->type;
353       } else if (op1->type->is_scalar()) {
354          this->type = op0->type;
355       }
356       break;
357
358    case ir_binop_equal:
359    case ir_binop_nequal:
360    case ir_binop_lequal:
361    case ir_binop_gequal:
362    case ir_binop_less:
363    case ir_binop_greater:
364       assert(op0->type == op1->type);
365       this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
366                                            op0->type->vector_elements, 1);
367       break;
368
369    case ir_binop_dot:
370       this->type = glsl_type::float_type;
371       break;
372
373    case ir_binop_lshift:
374    case ir_binop_rshift:
375       this->type = op0->type;
376       break;
377
378    default:
379       assert(!"not reached: missing automatic type setup for ir_expression");
380       this->type = glsl_type::float_type;
381    }
382 }
383
384 unsigned int
385 ir_expression::get_num_operands(ir_expression_operation op)
386 {
387    assert(op <= ir_last_opcode);
388
389    if (op <= ir_last_unop)
390       return 1;
391
392    if (op <= ir_last_binop)
393       return 2;
394
395    if (op == ir_quadop_vector)
396       return 4;
397
398    assert(false);
399    return 0;
400 }
401
402 static const char *const operator_strs[] = {
403    "~",
404    "!",
405    "neg",
406    "abs",
407    "sign",
408    "rcp",
409    "rsq",
410    "sqrt",
411    "exp",
412    "log",
413    "exp2",
414    "log2",
415    "f2i",
416    "i2f",
417    "f2b",
418    "b2f",
419    "i2b",
420    "b2i",
421    "u2f",
422    "any",
423    "trunc",
424    "ceil",
425    "floor",
426    "fract",
427    "round_even",
428    "sin",
429    "cos",
430    "sin_reduced",
431    "cos_reduced",
432    "dFdx",
433    "dFdy",
434    "noise",
435    "+",
436    "-",
437    "*",
438    "/",
439    "%",
440    "<",
441    ">",
442    "<=",
443    ">=",
444    "==",
445    "!=",
446    "all_equal",
447    "any_nequal",
448    "<<",
449    ">>",
450    "&",
451    "^",
452    "|",
453    "&&",
454    "^^",
455    "||",
456    "dot",
457    "min",
458    "max",
459    "pow",
460    "vector",
461 };
462
463 const char *ir_expression::operator_string(ir_expression_operation op)
464 {
465    assert((unsigned int) op < Elements(operator_strs));
466    assert(Elements(operator_strs) == (ir_quadop_vector + 1));
467    return operator_strs[op];
468 }
469
470 const char *ir_expression::operator_string()
471 {
472    return operator_string(this->operation);
473 }
474
475 ir_expression_operation
476 ir_expression::get_operator(const char *str)
477 {
478    const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
479    for (int op = 0; op < operator_count; op++) {
480       if (strcmp(str, operator_strs[op]) == 0)
481          return (ir_expression_operation) op;
482    }
483    return (ir_expression_operation) -1;
484 }
485
486 ir_constant::ir_constant()
487 {
488    this->ir_type = ir_type_constant;
489 }
490
491 ir_constant::ir_constant(const struct glsl_type *type,
492                          const ir_constant_data *data)
493 {
494    assert((type->base_type >= GLSL_TYPE_UINT)
495           && (type->base_type <= GLSL_TYPE_BOOL));
496
497    this->ir_type = ir_type_constant;
498    this->type = type;
499    memcpy(& this->value, data, sizeof(this->value));
500 }
501
502 ir_constant::ir_constant(float f)
503 {
504    this->ir_type = ir_type_constant;
505    this->type = glsl_type::float_type;
506    this->value.f[0] = f;
507    for (int i = 1; i < 16; i++)  {
508       this->value.f[i] = 0;
509    }
510 }
511
512 ir_constant::ir_constant(unsigned int u)
513 {
514    this->ir_type = ir_type_constant;
515    this->type = glsl_type::uint_type;
516    this->value.u[0] = u;
517    for (int i = 1; i < 16; i++) {
518       this->value.u[i] = 0;
519    }
520 }
521
522 ir_constant::ir_constant(int i)
523 {
524    this->ir_type = ir_type_constant;
525    this->type = glsl_type::int_type;
526    this->value.i[0] = i;
527    for (int i = 1; i < 16; i++) {
528       this->value.i[i] = 0;
529    }
530 }
531
532 ir_constant::ir_constant(bool b)
533 {
534    this->ir_type = ir_type_constant;
535    this->type = glsl_type::bool_type;
536    this->value.b[0] = b;
537    for (int i = 1; i < 16; i++) {
538       this->value.b[i] = false;
539    }
540 }
541
542 ir_constant::ir_constant(const ir_constant *c, unsigned i)
543 {
544    this->ir_type = ir_type_constant;
545    this->type = c->type->get_base_type();
546
547    switch (this->type->base_type) {
548    case GLSL_TYPE_UINT:  this->value.u[0] = c->value.u[i]; break;
549    case GLSL_TYPE_INT:   this->value.i[0] = c->value.i[i]; break;
550    case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
551    case GLSL_TYPE_BOOL:  this->value.b[0] = c->value.b[i]; break;
552    default:              assert(!"Should not get here."); break;
553    }
554 }
555
556 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
557 {
558    this->ir_type = ir_type_constant;
559    this->type = type;
560
561    assert(type->is_scalar() || type->is_vector() || type->is_matrix()
562           || type->is_record() || type->is_array());
563
564    if (type->is_array()) {
565       this->array_elements = talloc_array(this, ir_constant *, type->length);
566       unsigned i = 0;
567       foreach_list(node, value_list) {
568          ir_constant *value = (ir_constant *) node;
569          assert(value->as_constant() != NULL);
570
571          this->array_elements[i++] = value;
572       }
573       return;
574    }
575
576    /* If the constant is a record, the types of each of the entries in
577     * value_list must be a 1-for-1 match with the structure components.  Each
578     * entry must also be a constant.  Just move the nodes from the value_list
579     * to the list in the ir_constant.
580     */
581    /* FINISHME: Should there be some type checking and / or assertions here? */
582    /* FINISHME: Should the new constant take ownership of the nodes from
583     * FINISHME: value_list, or should it make copies?
584     */
585    if (type->is_record()) {
586       value_list->move_nodes_to(& this->components);
587       return;
588    }
589
590    for (unsigned i = 0; i < 16; i++) {
591       this->value.u[i] = 0;
592    }
593
594    ir_constant *value = (ir_constant *) (value_list->head);
595
596    /* Constructors with exactly one scalar argument are special for vectors
597     * and matrices.  For vectors, the scalar value is replicated to fill all
598     * the components.  For matrices, the scalar fills the components of the
599     * diagonal while the rest is filled with 0.
600     */
601    if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
602       if (type->is_matrix()) {
603          /* Matrix - fill diagonal (rest is already set to 0) */
604          assert(type->base_type == GLSL_TYPE_FLOAT);
605          for (unsigned i = 0; i < type->matrix_columns; i++)
606             this->value.f[i * type->vector_elements + i] = value->value.f[0];
607       } else {
608          /* Vector or scalar - fill all components */
609          switch (type->base_type) {
610          case GLSL_TYPE_UINT:
611          case GLSL_TYPE_INT:
612             for (unsigned i = 0; i < type->components(); i++)
613                this->value.u[i] = value->value.u[0];
614             break;
615          case GLSL_TYPE_FLOAT:
616             for (unsigned i = 0; i < type->components(); i++)
617                this->value.f[i] = value->value.f[0];
618             break;
619          case GLSL_TYPE_BOOL:
620             for (unsigned i = 0; i < type->components(); i++)
621                this->value.b[i] = value->value.b[0];
622             break;
623          default:
624             assert(!"Should not get here.");
625             break;
626          }
627       }
628       return;
629    }
630
631    if (type->is_matrix() && value->type->is_matrix()) {
632       assert(value->next->is_tail_sentinel());
633
634       /* From section 5.4.2 of the GLSL 1.20 spec:
635        * "If a matrix is constructed from a matrix, then each component
636        *  (column i, row j) in the result that has a corresponding component
637        *  (column i, row j) in the argument will be initialized from there."
638        */
639       unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
640       unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
641       for (unsigned i = 0; i < cols; i++) {
642          for (unsigned j = 0; j < rows; j++) {
643             const unsigned src = i * value->type->vector_elements + j;
644             const unsigned dst = i * type->vector_elements + j;
645             this->value.f[dst] = value->value.f[src];
646          }
647       }
648
649       /* "All other components will be initialized to the identity matrix." */
650       for (unsigned i = cols; i < type->matrix_columns; i++)
651          this->value.f[i * type->vector_elements + i] = 1.0;
652
653       return;
654    }
655
656    /* Use each component from each entry in the value_list to initialize one
657     * component of the constant being constructed.
658     */
659    for (unsigned i = 0; i < type->components(); /* empty */) {
660       assert(value->as_constant() != NULL);
661       assert(!value->is_tail_sentinel());
662
663       for (unsigned j = 0; j < value->type->components(); j++) {
664          switch (type->base_type) {
665          case GLSL_TYPE_UINT:
666             this->value.u[i] = value->get_uint_component(j);
667             break;
668          case GLSL_TYPE_INT:
669             this->value.i[i] = value->get_int_component(j);
670             break;
671          case GLSL_TYPE_FLOAT:
672             this->value.f[i] = value->get_float_component(j);
673             break;
674          case GLSL_TYPE_BOOL:
675             this->value.b[i] = value->get_bool_component(j);
676             break;
677          default:
678             /* FINISHME: What to do?  Exceptions are not the answer.
679              */
680             break;
681          }
682
683          i++;
684          if (i >= type->components())
685             break;
686       }
687
688       value = (ir_constant *) value->next;
689    }
690 }
691
692 ir_constant *
693 ir_constant::zero(void *mem_ctx, const glsl_type *type)
694 {
695    assert(type->is_numeric() || type->is_boolean());
696
697    ir_constant *c = new(mem_ctx) ir_constant;
698    c->type = type;
699    memset(&c->value, 0, sizeof(c->value));
700
701    return c;
702 }
703
704 bool
705 ir_constant::get_bool_component(unsigned i) const
706 {
707    switch (this->type->base_type) {
708    case GLSL_TYPE_UINT:  return this->value.u[i] != 0;
709    case GLSL_TYPE_INT:   return this->value.i[i] != 0;
710    case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
711    case GLSL_TYPE_BOOL:  return this->value.b[i];
712    default:              assert(!"Should not get here."); break;
713    }
714
715    /* Must return something to make the compiler happy.  This is clearly an
716     * error case.
717     */
718    return false;
719 }
720
721 float
722 ir_constant::get_float_component(unsigned i) const
723 {
724    switch (this->type->base_type) {
725    case GLSL_TYPE_UINT:  return (float) this->value.u[i];
726    case GLSL_TYPE_INT:   return (float) this->value.i[i];
727    case GLSL_TYPE_FLOAT: return this->value.f[i];
728    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1.0 : 0.0;
729    default:              assert(!"Should not get here."); break;
730    }
731
732    /* Must return something to make the compiler happy.  This is clearly an
733     * error case.
734     */
735    return 0.0;
736 }
737
738 int
739 ir_constant::get_int_component(unsigned i) const
740 {
741    switch (this->type->base_type) {
742    case GLSL_TYPE_UINT:  return this->value.u[i];
743    case GLSL_TYPE_INT:   return this->value.i[i];
744    case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
745    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
746    default:              assert(!"Should not get here."); break;
747    }
748
749    /* Must return something to make the compiler happy.  This is clearly an
750     * error case.
751     */
752    return 0;
753 }
754
755 unsigned
756 ir_constant::get_uint_component(unsigned i) const
757 {
758    switch (this->type->base_type) {
759    case GLSL_TYPE_UINT:  return this->value.u[i];
760    case GLSL_TYPE_INT:   return this->value.i[i];
761    case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
762    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
763    default:              assert(!"Should not get here."); break;
764    }
765
766    /* Must return something to make the compiler happy.  This is clearly an
767     * error case.
768     */
769    return 0;
770 }
771
772 ir_constant *
773 ir_constant::get_array_element(unsigned i) const
774 {
775    assert(this->type->is_array());
776
777    /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
778     *
779     *     "Behavior is undefined if a shader subscripts an array with an index
780     *     less than 0 or greater than or equal to the size the array was
781     *     declared with."
782     *
783     * Most out-of-bounds accesses are removed before things could get this far.
784     * There are cases where non-constant array index values can get constant
785     * folded.
786     */
787    if (int(i) < 0)
788       i = 0;
789    else if (i >= this->type->length)
790       i = this->type->length - 1;
791
792    return array_elements[i];
793 }
794
795 ir_constant *
796 ir_constant::get_record_field(const char *name)
797 {
798    int idx = this->type->field_index(name);
799
800    if (idx < 0)
801       return NULL;
802
803    if (this->components.is_empty())
804       return NULL;
805
806    exec_node *node = this->components.head;
807    for (int i = 0; i < idx; i++) {
808       node = node->next;
809
810       /* If the end of the list is encountered before the element matching the
811        * requested field is found, return NULL.
812        */
813       if (node->is_tail_sentinel())
814          return NULL;
815    }
816
817    return (ir_constant *) node;
818 }
819
820
821 bool
822 ir_constant::has_value(const ir_constant *c) const
823 {
824    if (this->type != c->type)
825       return false;
826
827    if (this->type->is_array()) {
828       for (unsigned i = 0; i < this->type->length; i++) {
829          if (!this->array_elements[i]->has_value(c->array_elements[i]))
830             return false;
831       }
832       return true;
833    }
834
835    if (this->type->base_type == GLSL_TYPE_STRUCT) {
836       const exec_node *a_node = this->components.head;
837       const exec_node *b_node = c->components.head;
838
839       while (!a_node->is_tail_sentinel()) {
840          assert(!b_node->is_tail_sentinel());
841
842          const ir_constant *const a_field = (ir_constant *) a_node;
843          const ir_constant *const b_field = (ir_constant *) b_node;
844
845          if (!a_field->has_value(b_field))
846             return false;
847
848          a_node = a_node->next;
849          b_node = b_node->next;
850       }
851
852       return true;
853    }
854
855    for (unsigned i = 0; i < this->type->components(); i++) {
856       switch (this->type->base_type) {
857       case GLSL_TYPE_UINT:
858          if (this->value.u[i] != c->value.u[i])
859             return false;
860          break;
861       case GLSL_TYPE_INT:
862          if (this->value.i[i] != c->value.i[i])
863             return false;
864          break;
865       case GLSL_TYPE_FLOAT:
866          if (this->value.f[i] != c->value.f[i])
867             return false;
868          break;
869       case GLSL_TYPE_BOOL:
870          if (this->value.b[i] != c->value.b[i])
871             return false;
872          break;
873       default:
874          assert(!"Should not get here.");
875          return false;
876       }
877    }
878
879    return true;
880 }
881
882 bool
883 ir_constant::is_zero() const
884 {
885    if (!this->type->is_scalar() && !this->type->is_vector())
886       return false;
887
888    for (unsigned c = 0; c < this->type->vector_elements; c++) {
889       switch (this->type->base_type) {
890       case GLSL_TYPE_FLOAT:
891          if (this->value.f[c] != 0.0)
892             return false;
893          break;
894       case GLSL_TYPE_INT:
895          if (this->value.i[c] != 0)
896             return false;
897          break;
898       case GLSL_TYPE_UINT:
899          if (this->value.u[c] != 0)
900             return false;
901          break;
902       case GLSL_TYPE_BOOL:
903          if (this->value.b[c] != false)
904             return false;
905          break;
906       default:
907          /* The only other base types are structures, arrays, and samplers.
908           * Samplers cannot be constants, and the others should have been
909           * filtered out above.
910           */
911          assert(!"Should not get here.");
912          return false;
913       }
914    }
915
916    return true;
917 }
918
919 bool
920 ir_constant::is_one() const
921 {
922    if (!this->type->is_scalar() && !this->type->is_vector())
923       return false;
924
925    for (unsigned c = 0; c < this->type->vector_elements; c++) {
926       switch (this->type->base_type) {
927       case GLSL_TYPE_FLOAT:
928          if (this->value.f[c] != 1.0)
929             return false;
930          break;
931       case GLSL_TYPE_INT:
932          if (this->value.i[c] != 1)
933             return false;
934          break;
935       case GLSL_TYPE_UINT:
936          if (this->value.u[c] != 1)
937             return false;
938          break;
939       case GLSL_TYPE_BOOL:
940          if (this->value.b[c] != true)
941             return false;
942          break;
943       default:
944          /* The only other base types are structures, arrays, and samplers.
945           * Samplers cannot be constants, and the others should have been
946           * filtered out above.
947           */
948          assert(!"Should not get here.");
949          return false;
950       }
951    }
952
953    return true;
954 }
955
956 bool
957 ir_constant::is_negative_one() const
958 {
959    if (!this->type->is_scalar() && !this->type->is_vector())
960       return false;
961
962    if (this->type->is_boolean())
963       return false;
964
965    for (unsigned c = 0; c < this->type->vector_elements; c++) {
966       switch (this->type->base_type) {
967       case GLSL_TYPE_FLOAT:
968          if (this->value.f[c] != -1.0)
969             return false;
970          break;
971       case GLSL_TYPE_INT:
972          if (this->value.i[c] != -1)
973             return false;
974          break;
975       case GLSL_TYPE_UINT:
976          if (int(this->value.u[c]) != -1)
977             return false;
978          break;
979       default:
980          /* The only other base types are structures, arrays, samplers, and
981           * booleans.  Samplers cannot be constants, and the others should
982           * have been filtered out above.
983           */
984          assert(!"Should not get here.");
985          return false;
986       }
987    }
988
989    return true;
990 }
991
992 ir_loop::ir_loop()
993 {
994    this->ir_type = ir_type_loop;
995    this->cmp = ir_unop_neg;
996    this->from = NULL;
997    this->to = NULL;
998    this->increment = NULL;
999    this->counter = NULL;
1000 }
1001
1002
1003 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1004 {
1005    this->ir_type = ir_type_dereference_variable;
1006    this->var = var;
1007    this->type = (var != NULL) ? var->type : glsl_type::error_type;
1008 }
1009
1010
1011 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1012                                            ir_rvalue *array_index)
1013 {
1014    this->ir_type = ir_type_dereference_array;
1015    this->array_index = array_index;
1016    this->set_array(value);
1017 }
1018
1019
1020 ir_dereference_array::ir_dereference_array(ir_variable *var,
1021                                            ir_rvalue *array_index)
1022 {
1023    void *ctx = talloc_parent(var);
1024
1025    this->ir_type = ir_type_dereference_array;
1026    this->array_index = array_index;
1027    this->set_array(new(ctx) ir_dereference_variable(var));
1028 }
1029
1030
1031 void
1032 ir_dereference_array::set_array(ir_rvalue *value)
1033 {
1034    this->array = value;
1035    this->type = glsl_type::error_type;
1036
1037    if (this->array != NULL) {
1038       const glsl_type *const vt = this->array->type;
1039
1040       if (vt->is_array()) {
1041          type = vt->element_type();
1042       } else if (vt->is_matrix()) {
1043          type = vt->column_type();
1044       } else if (vt->is_vector()) {
1045          type = vt->get_base_type();
1046       }
1047    }
1048 }
1049
1050
1051 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1052                                              const char *field)
1053 {
1054    this->ir_type = ir_type_dereference_record;
1055    this->record = value;
1056    this->field = talloc_strdup(this, field);
1057    this->type = (this->record != NULL)
1058       ? this->record->type->field_type(field) : glsl_type::error_type;
1059 }
1060
1061
1062 ir_dereference_record::ir_dereference_record(ir_variable *var,
1063                                              const char *field)
1064 {
1065    void *ctx = talloc_parent(var);
1066
1067    this->ir_type = ir_type_dereference_record;
1068    this->record = new(ctx) ir_dereference_variable(var);
1069    this->field = talloc_strdup(this, field);
1070    this->type = (this->record != NULL)
1071       ? this->record->type->field_type(field) : glsl_type::error_type;
1072 }
1073
1074 bool type_contains_sampler(const glsl_type *type)
1075 {
1076    if (type->is_array()) {
1077       return type_contains_sampler(type->fields.array);
1078    } else if (type->is_record()) {
1079       for (unsigned int i = 0; i < type->length; i++) {
1080          if (type_contains_sampler(type->fields.structure[i].type))
1081             return true;
1082       }
1083       return false;
1084    } else {
1085       return type->is_sampler();
1086    }
1087 }
1088
1089 bool
1090 ir_dereference::is_lvalue()
1091 {
1092    ir_variable *var = this->variable_referenced();
1093
1094    /* Every l-value derference chain eventually ends in a variable.
1095     */
1096    if ((var == NULL) || var->read_only)
1097       return false;
1098
1099    if (this->type->is_array() && !var->array_lvalue)
1100       return false;
1101
1102    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
1103     *
1104     *    "Samplers cannot be treated as l-values; hence cannot be used
1105     *     as out or inout function parameters, nor can they be
1106     *     assigned into."
1107     */
1108    if (type_contains_sampler(this->type))
1109       return false;
1110
1111    return true;
1112 }
1113
1114
1115 const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf" };
1116
1117 const char *ir_texture::opcode_string()
1118 {
1119    assert((unsigned int) op <=
1120           sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]));
1121    return tex_opcode_strs[op];
1122 }
1123
1124 ir_texture_opcode
1125 ir_texture::get_opcode(const char *str)
1126 {
1127    const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1128    for (int op = 0; op < count; op++) {
1129       if (strcmp(str, tex_opcode_strs[op]) == 0)
1130          return (ir_texture_opcode) op;
1131    }
1132    return (ir_texture_opcode) -1;
1133 }
1134
1135
1136 void
1137 ir_texture::set_sampler(ir_dereference *sampler)
1138 {
1139    assert(sampler != NULL);
1140    this->sampler = sampler;
1141
1142    switch (sampler->type->sampler_type) {
1143    case GLSL_TYPE_FLOAT:
1144       this->type = glsl_type::vec4_type;
1145       break;
1146    case GLSL_TYPE_INT:
1147       this->type = glsl_type::ivec4_type;
1148       break;
1149    case GLSL_TYPE_UINT:
1150       this->type = glsl_type::uvec4_type;
1151       break;
1152    }
1153 }
1154
1155
1156 void
1157 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1158 {
1159    assert((count >= 1) && (count <= 4));
1160
1161    memset(&this->mask, 0, sizeof(this->mask));
1162    this->mask.num_components = count;
1163
1164    unsigned dup_mask = 0;
1165    switch (count) {
1166    case 4:
1167       assert(comp[3] <= 3);
1168       dup_mask |= (1U << comp[3])
1169          & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1170       this->mask.w = comp[3];
1171
1172    case 3:
1173       assert(comp[2] <= 3);
1174       dup_mask |= (1U << comp[2])
1175          & ((1U << comp[0]) | (1U << comp[1]));
1176       this->mask.z = comp[2];
1177
1178    case 2:
1179       assert(comp[1] <= 3);
1180       dup_mask |= (1U << comp[1])
1181          & ((1U << comp[0]));
1182       this->mask.y = comp[1];
1183
1184    case 1:
1185       assert(comp[0] <= 3);
1186       this->mask.x = comp[0];
1187    }
1188
1189    this->mask.has_duplicates = dup_mask != 0;
1190
1191    /* Based on the number of elements in the swizzle and the base type
1192     * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1193     * generate the type of the resulting value.
1194     */
1195    type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1196 }
1197
1198 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1199                        unsigned w, unsigned count)
1200    : val(val)
1201 {
1202    const unsigned components[4] = { x, y, z, w };
1203    this->ir_type = ir_type_swizzle;
1204    this->init_mask(components, count);
1205 }
1206
1207 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1208                        unsigned count)
1209    : val(val)
1210 {
1211    this->ir_type = ir_type_swizzle;
1212    this->init_mask(comp, count);
1213 }
1214
1215 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1216 {
1217    this->ir_type = ir_type_swizzle;
1218    this->val = val;
1219    this->mask = mask;
1220    this->type = glsl_type::get_instance(val->type->base_type,
1221                                         mask.num_components, 1);
1222 }
1223
1224 #define X 1
1225 #define R 5
1226 #define S 9
1227 #define I 13
1228
1229 ir_swizzle *
1230 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1231 {
1232    void *ctx = talloc_parent(val);
1233
1234    /* For each possible swizzle character, this table encodes the value in
1235     * \c idx_map that represents the 0th element of the vector.  For invalid
1236     * swizzle characters (e.g., 'k'), a special value is used that will allow
1237     * detection of errors.
1238     */
1239    static const unsigned char base_idx[26] = {
1240    /* a  b  c  d  e  f  g  h  i  j  k  l  m */
1241       R, R, I, I, I, I, R, I, I, I, I, I, I,
1242    /* n  o  p  q  r  s  t  u  v  w  x  y  z */
1243       I, I, S, S, R, S, S, I, I, X, X, X, X
1244    };
1245
1246    /* Each valid swizzle character has an entry in the previous table.  This
1247     * table encodes the base index encoded in the previous table plus the actual
1248     * index of the swizzle character.  When processing swizzles, the first
1249     * character in the string is indexed in the previous table.  Each character
1250     * in the string is indexed in this table, and the value found there has the
1251     * value form the first table subtracted.  The result must be on the range
1252     * [0,3].
1253     *
1254     * For example, the string "wzyx" will get X from the first table.  Each of
1255     * the charcaters will get X+3, X+2, X+1, and X+0 from this table.  After
1256     * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1257     *
1258     * The string "wzrg" will get X from the first table.  Each of the characters
1259     * will get X+3, X+2, R+0, and R+1 from this table.  After subtraction, the
1260     * swizzle values are { 3, 2, 4, 5 }.  Since 4 and 5 are outside the range
1261     * [0,3], the error is detected.
1262     */
1263    static const unsigned char idx_map[26] = {
1264    /* a    b    c    d    e    f    g    h    i    j    k    l    m */
1265       R+3, R+2, 0,   0,   0,   0,   R+1, 0,   0,   0,   0,   0,   0,
1266    /* n    o    p    q    r    s    t    u    v    w    x    y    z */
1267       0,   0,   S+2, S+3, R+0, S+0, S+1, 0,   0,   X+3, X+0, X+1, X+2
1268    };
1269
1270    int swiz_idx[4] = { 0, 0, 0, 0 };
1271    unsigned i;
1272
1273
1274    /* Validate the first character in the swizzle string and look up the base
1275     * index value as described above.
1276     */
1277    if ((str[0] < 'a') || (str[0] > 'z'))
1278       return NULL;
1279
1280    const unsigned base = base_idx[str[0] - 'a'];
1281
1282
1283    for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1284       /* Validate the next character, and, as described above, convert it to a
1285        * swizzle index.
1286        */
1287       if ((str[i] < 'a') || (str[i] > 'z'))
1288          return NULL;
1289
1290       swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1291       if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1292          return NULL;
1293    }
1294
1295    if (str[i] != '\0')
1296          return NULL;
1297
1298    return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1299                               swiz_idx[3], i);
1300 }
1301
1302 #undef X
1303 #undef R
1304 #undef S
1305 #undef I
1306
1307 ir_variable *
1308 ir_swizzle::variable_referenced()
1309 {
1310    return this->val->variable_referenced();
1311 }
1312
1313
1314 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1315                          ir_variable_mode mode)
1316    : max_array_access(0), read_only(false), centroid(false), invariant(false),
1317      mode(mode), interpolation(ir_var_smooth), array_lvalue(false)
1318 {
1319    this->ir_type = ir_type_variable;
1320    this->type = type;
1321    this->name = talloc_strdup(this, name);
1322    this->explicit_location = false;
1323    this->location = -1;
1324    this->warn_extension = NULL;
1325    this->constant_value = NULL;
1326    this->origin_upper_left = false;
1327    this->pixel_center_integer = false;
1328    this->used = false;
1329
1330    if (type && type->base_type == GLSL_TYPE_SAMPLER)
1331       this->read_only = true;
1332 }
1333
1334
1335 const char *
1336 ir_variable::interpolation_string() const
1337 {
1338    switch (this->interpolation) {
1339    case ir_var_smooth:        return "smooth";
1340    case ir_var_flat:          return "flat";
1341    case ir_var_noperspective: return "noperspective";
1342    }
1343
1344    assert(!"Should not get here.");
1345    return "";
1346 }
1347
1348
1349 unsigned
1350 ir_variable::component_slots() const
1351 {
1352    /* FINISHME: Sparsely accessed arrays require fewer slots. */
1353    return this->type->component_slots();
1354 }
1355
1356
1357 ir_function_signature::ir_function_signature(const glsl_type *return_type)
1358    : return_type(return_type), is_defined(false), _function(NULL)
1359 {
1360    this->ir_type = ir_type_function_signature;
1361    this->is_builtin = false;
1362 }
1363
1364
1365 const char *
1366 ir_function_signature::qualifiers_match(exec_list *params)
1367 {
1368    exec_list_iterator iter_a = parameters.iterator();
1369    exec_list_iterator iter_b = params->iterator();
1370
1371    /* check that the qualifiers match. */
1372    while (iter_a.has_next()) {
1373       ir_variable *a = (ir_variable *)iter_a.get();
1374       ir_variable *b = (ir_variable *)iter_b.get();
1375
1376       if (a->read_only != b->read_only ||
1377           a->mode != b->mode ||
1378           a->interpolation != b->interpolation ||
1379           a->centroid != b->centroid) {
1380
1381          /* parameter a's qualifiers don't match */
1382          return a->name;
1383       }
1384
1385       iter_a.next();
1386       iter_b.next();
1387    }
1388    return NULL;
1389 }
1390
1391
1392 void
1393 ir_function_signature::replace_parameters(exec_list *new_params)
1394 {
1395    /* Destroy all of the previous parameter information.  If the previous
1396     * parameter information comes from the function prototype, it may either
1397     * specify incorrect parameter names or not have names at all.
1398     */
1399    foreach_iter(exec_list_iterator, iter, parameters) {
1400       assert(((ir_instruction *) iter.get())->as_variable() != NULL);
1401
1402       iter.remove();
1403    }
1404
1405    new_params->move_nodes_to(&parameters);
1406 }
1407
1408
1409 ir_function::ir_function(const char *name)
1410 {
1411    this->ir_type = ir_type_function;
1412    this->name = talloc_strdup(this, name);
1413 }
1414
1415
1416 bool
1417 ir_function::has_user_signature()
1418 {
1419    foreach_list(n, &this->signatures) {
1420       ir_function_signature *const sig = (ir_function_signature *) n;
1421       if (!sig->is_builtin)
1422          return true;
1423    }
1424    return false;
1425 }
1426
1427
1428 ir_call *
1429 ir_call::get_error_instruction(void *ctx)
1430 {
1431    ir_call *call = new(ctx) ir_call;
1432
1433    call->type = glsl_type::error_type;
1434    return call;
1435 }
1436
1437 void
1438 ir_call::set_callee(ir_function_signature *sig)
1439 {
1440    assert((this->type == NULL) || (this->type == sig->return_type));
1441
1442    this->callee = sig;
1443 }
1444
1445 void
1446 visit_exec_list(exec_list *list, ir_visitor *visitor)
1447 {
1448    foreach_iter(exec_list_iterator, iter, *list) {
1449       ((ir_instruction *)iter.get())->accept(visitor);
1450    }
1451 }
1452
1453
1454 static void
1455 steal_memory(ir_instruction *ir, void *new_ctx)
1456 {
1457    ir_variable *var = ir->as_variable();
1458    ir_constant *constant = ir->as_constant();
1459    if (var != NULL && var->constant_value != NULL)
1460       steal_memory(var->constant_value, ir);
1461
1462    /* The components of aggregate constants are not visited by the normal
1463     * visitor, so steal their values by hand.
1464     */
1465    if (constant != NULL) {
1466       if (constant->type->is_record()) {
1467          foreach_iter(exec_list_iterator, iter, constant->components) {
1468             ir_constant *field = (ir_constant *)iter.get();
1469             steal_memory(field, ir);
1470          }
1471       } else if (constant->type->is_array()) {
1472          for (unsigned int i = 0; i < constant->type->length; i++) {
1473             steal_memory(constant->array_elements[i], ir);
1474          }
1475       }
1476    }
1477
1478    talloc_steal(new_ctx, ir);
1479 }
1480
1481
1482 void
1483 reparent_ir(exec_list *list, void *mem_ctx)
1484 {
1485    foreach_list(node, list) {
1486       visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
1487    }
1488 }
1489
1490
1491 static ir_rvalue *
1492 try_min_one(ir_rvalue *ir)
1493 {
1494    ir_expression *expr = ir->as_expression();
1495
1496    if (!expr || expr->operation != ir_binop_min)
1497       return NULL;
1498
1499    if (expr->operands[0]->is_one())
1500       return expr->operands[1];
1501
1502    if (expr->operands[1]->is_one())
1503       return expr->operands[0];
1504
1505    return NULL;
1506 }
1507
1508 static ir_rvalue *
1509 try_max_zero(ir_rvalue *ir)
1510 {
1511    ir_expression *expr = ir->as_expression();
1512
1513    if (!expr || expr->operation != ir_binop_max)
1514       return NULL;
1515
1516    if (expr->operands[0]->is_zero())
1517       return expr->operands[1];
1518
1519    if (expr->operands[1]->is_zero())
1520       return expr->operands[0];
1521
1522    return NULL;
1523 }
1524
1525 ir_rvalue *
1526 ir_rvalue::as_rvalue_to_saturate()
1527 {
1528    ir_expression *expr = this->as_expression();
1529
1530    if (!expr)
1531       return NULL;
1532
1533    ir_rvalue *max_zero = try_max_zero(expr);
1534    if (max_zero) {
1535       return try_min_one(max_zero);
1536    } else {
1537       ir_rvalue *min_one = try_min_one(expr);
1538       if (min_one) {
1539          return try_max_zero(min_one);
1540       }
1541    }
1542
1543    return NULL;
1544 }