OSDN Git Service

glsl: remove unused helper
[android-x86/external-mesa.git] / src / compiler / 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 "compiler/glsl_types.h"
27
28 ir_rvalue::ir_rvalue(enum ir_node_type t)
29    : ir_instruction(t)
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
68 void
69 ir_assignment::set_lhs(ir_rvalue *lhs)
70 {
71    void *mem_ctx = this;
72    bool swizzled = false;
73
74    while (lhs != NULL) {
75       ir_swizzle *swiz = lhs->as_swizzle();
76
77       if (swiz == NULL)
78          break;
79
80       unsigned write_mask = 0;
81       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
82
83       for (unsigned i = 0; i < swiz->mask.num_components; i++) {
84          unsigned c = 0;
85
86          switch (i) {
87          case 0: c = swiz->mask.x; break;
88          case 1: c = swiz->mask.y; break;
89          case 2: c = swiz->mask.z; break;
90          case 3: c = swiz->mask.w; break;
91          default: assert(!"Should not get here.");
92          }
93
94          write_mask |= (((this->write_mask >> i) & 1) << c);
95          update_rhs_swizzle(rhs_swiz, i, c);
96          rhs_swiz.num_components = swiz->val->type->vector_elements;
97       }
98
99       this->write_mask = write_mask;
100       lhs = swiz->val;
101
102       this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
103       swizzled = true;
104    }
105
106    if (swizzled) {
107       /* Now, RHS channels line up with the LHS writemask.  Collapse it
108        * to just the channels that will be written.
109        */
110       ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 };
111       int rhs_chan = 0;
112       for (int i = 0; i < 4; i++) {
113          if (write_mask & (1 << i))
114             update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
115       }
116       rhs_swiz.num_components = rhs_chan;
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    : ir_instruction(ir_type_assignment)
152 {
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    : ir_instruction(ir_type_assignment)
172 {
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 ir_expression::ir_expression(int op, const struct glsl_type *type,
194                              ir_rvalue *op0, ir_rvalue *op1,
195                              ir_rvalue *op2, ir_rvalue *op3)
196    : ir_rvalue(ir_type_expression)
197 {
198    this->type = type;
199    this->operation = ir_expression_operation(op);
200    this->operands[0] = op0;
201    this->operands[1] = op1;
202    this->operands[2] = op2;
203    this->operands[3] = op3;
204 #ifndef NDEBUG
205    int num_operands = get_num_operands(this->operation);
206    for (int i = num_operands; i < 4; i++) {
207       assert(this->operands[i] == NULL);
208    }
209 #endif
210 }
211
212 ir_expression::ir_expression(int op, ir_rvalue *op0)
213    : ir_rvalue(ir_type_expression)
214 {
215    this->operation = ir_expression_operation(op);
216    this->operands[0] = op0;
217    this->operands[1] = NULL;
218    this->operands[2] = NULL;
219    this->operands[3] = NULL;
220
221    assert(op <= ir_last_unop);
222
223    switch (this->operation) {
224    case ir_unop_bit_not:
225    case ir_unop_logic_not:
226    case ir_unop_neg:
227    case ir_unop_abs:
228    case ir_unop_sign:
229    case ir_unop_rcp:
230    case ir_unop_rsq:
231    case ir_unop_sqrt:
232    case ir_unop_exp:
233    case ir_unop_log:
234    case ir_unop_exp2:
235    case ir_unop_log2:
236    case ir_unop_trunc:
237    case ir_unop_ceil:
238    case ir_unop_floor:
239    case ir_unop_fract:
240    case ir_unop_round_even:
241    case ir_unop_sin:
242    case ir_unop_cos:
243    case ir_unop_dFdx:
244    case ir_unop_dFdx_coarse:
245    case ir_unop_dFdx_fine:
246    case ir_unop_dFdy:
247    case ir_unop_dFdy_coarse:
248    case ir_unop_dFdy_fine:
249    case ir_unop_bitfield_reverse:
250    case ir_unop_interpolate_at_centroid:
251    case ir_unop_saturate:
252       this->type = op0->type;
253       break;
254
255    case ir_unop_f2i:
256    case ir_unop_b2i:
257    case ir_unop_u2i:
258    case ir_unop_d2i:
259    case ir_unop_bitcast_f2i:
260    case ir_unop_bit_count:
261    case ir_unop_find_msb:
262    case ir_unop_find_lsb:
263    case ir_unop_subroutine_to_int:
264       this->type = glsl_type::get_instance(GLSL_TYPE_INT,
265                                            op0->type->vector_elements, 1);
266       break;
267
268    case ir_unop_b2f:
269    case ir_unop_i2f:
270    case ir_unop_u2f:
271    case ir_unop_d2f:
272    case ir_unop_bitcast_i2f:
273    case ir_unop_bitcast_u2f:
274       this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
275                                            op0->type->vector_elements, 1);
276       break;
277
278    case ir_unop_f2b:
279    case ir_unop_i2b:
280    case ir_unop_d2b:
281       this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
282                                            op0->type->vector_elements, 1);
283       break;
284
285    case ir_unop_f2d:
286    case ir_unop_i2d:
287    case ir_unop_u2d:
288       this->type = glsl_type::get_instance(GLSL_TYPE_DOUBLE,
289                                            op0->type->vector_elements, 1);
290       break;
291
292    case ir_unop_i2u:
293    case ir_unop_f2u:
294    case ir_unop_d2u:
295    case ir_unop_bitcast_f2u:
296       this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
297                                            op0->type->vector_elements, 1);
298       break;
299
300    case ir_unop_noise:
301       this->type = glsl_type::float_type;
302       break;
303
304    case ir_unop_unpack_double_2x32:
305       this->type = glsl_type::uvec2_type;
306       break;
307
308    case ir_unop_pack_snorm_2x16:
309    case ir_unop_pack_snorm_4x8:
310    case ir_unop_pack_unorm_2x16:
311    case ir_unop_pack_unorm_4x8:
312    case ir_unop_pack_half_2x16:
313       this->type = glsl_type::uint_type;
314       break;
315
316    case ir_unop_pack_double_2x32:
317       this->type = glsl_type::double_type;
318       break;
319
320    case ir_unop_unpack_snorm_2x16:
321    case ir_unop_unpack_unorm_2x16:
322    case ir_unop_unpack_half_2x16:
323       this->type = glsl_type::vec2_type;
324       break;
325
326    case ir_unop_unpack_snorm_4x8:
327    case ir_unop_unpack_unorm_4x8:
328       this->type = glsl_type::vec4_type;
329       break;
330
331    case ir_unop_frexp_sig:
332       this->type = op0->type;
333       break;
334    case ir_unop_frexp_exp:
335       this->type = glsl_type::get_instance(GLSL_TYPE_INT,
336                                            op0->type->vector_elements, 1);
337       break;
338
339    case ir_unop_get_buffer_size:
340    case ir_unop_ssbo_unsized_array_length:
341       this->type = glsl_type::int_type;
342       break;
343
344    default:
345       assert(!"not reached: missing automatic type setup for ir_expression");
346       this->type = op0->type;
347       break;
348    }
349 }
350
351 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
352    : ir_rvalue(ir_type_expression)
353 {
354    this->operation = ir_expression_operation(op);
355    this->operands[0] = op0;
356    this->operands[1] = op1;
357    this->operands[2] = NULL;
358    this->operands[3] = NULL;
359
360    assert(op > ir_last_unop);
361
362    switch (this->operation) {
363    case ir_binop_all_equal:
364    case ir_binop_any_nequal:
365       this->type = glsl_type::bool_type;
366       break;
367
368    case ir_binop_add:
369    case ir_binop_sub:
370    case ir_binop_min:
371    case ir_binop_max:
372    case ir_binop_pow:
373    case ir_binop_mul:
374    case ir_binop_div:
375    case ir_binop_mod:
376       if (op0->type->is_scalar()) {
377          this->type = op1->type;
378       } else if (op1->type->is_scalar()) {
379          this->type = op0->type;
380       } else {
381          if (this->operation == ir_binop_mul) {
382             this->type = glsl_type::get_mul_type(op0->type, op1->type);
383          } else {
384             assert(op0->type == op1->type);
385             this->type = op0->type;
386          }
387       }
388       break;
389
390    case ir_binop_logic_and:
391    case ir_binop_logic_xor:
392    case ir_binop_logic_or:
393    case ir_binop_bit_and:
394    case ir_binop_bit_xor:
395    case ir_binop_bit_or:
396        assert(!op0->type->is_matrix());
397        assert(!op1->type->is_matrix());
398       if (op0->type->is_scalar()) {
399          this->type = op1->type;
400       } else if (op1->type->is_scalar()) {
401          this->type = op0->type;
402       } else {
403           assert(op0->type->vector_elements == op1->type->vector_elements);
404           this->type = op0->type;
405       }
406       break;
407
408    case ir_binop_equal:
409    case ir_binop_nequal:
410    case ir_binop_lequal:
411    case ir_binop_gequal:
412    case ir_binop_less:
413    case ir_binop_greater:
414       assert(op0->type == op1->type);
415       this->type = glsl_type::get_instance(GLSL_TYPE_BOOL,
416                                            op0->type->vector_elements, 1);
417       break;
418
419    case ir_binop_dot:
420       this->type = op0->type->get_base_type();
421       break;
422
423    case ir_binop_imul_high:
424    case ir_binop_carry:
425    case ir_binop_borrow:
426    case ir_binop_lshift:
427    case ir_binop_rshift:
428    case ir_binop_ldexp:
429    case ir_binop_interpolate_at_offset:
430    case ir_binop_interpolate_at_sample:
431       this->type = op0->type;
432       break;
433
434    case ir_binop_vector_extract:
435       this->type = op0->type->get_scalar_type();
436       break;
437
438    default:
439       assert(!"not reached: missing automatic type setup for ir_expression");
440       this->type = glsl_type::float_type;
441    }
442 }
443
444 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
445                              ir_rvalue *op2)
446    : ir_rvalue(ir_type_expression)
447 {
448    this->operation = ir_expression_operation(op);
449    this->operands[0] = op0;
450    this->operands[1] = op1;
451    this->operands[2] = op2;
452    this->operands[3] = NULL;
453
454    assert(op > ir_last_binop && op <= ir_last_triop);
455
456    switch (this->operation) {
457    case ir_triop_fma:
458    case ir_triop_lrp:
459    case ir_triop_bitfield_extract:
460    case ir_triop_vector_insert:
461       this->type = op0->type;
462       break;
463
464    case ir_triop_csel:
465       this->type = op1->type;
466       break;
467
468    default:
469       assert(!"not reached: missing automatic type setup for ir_expression");
470       this->type = glsl_type::float_type;
471    }
472 }
473
474 unsigned int
475 ir_expression::get_num_operands(ir_expression_operation op)
476 {
477    assert(op <= ir_last_opcode);
478
479    if (op <= ir_last_unop)
480       return 1;
481
482    if (op <= ir_last_binop)
483       return 2;
484
485    if (op <= ir_last_triop)
486       return 3;
487
488    if (op <= ir_last_quadop)
489       return 4;
490
491    assert(false);
492    return 0;
493 }
494
495 static const char *const operator_strs[] = {
496    "~",
497    "!",
498    "neg",
499    "abs",
500    "sign",
501    "rcp",
502    "rsq",
503    "sqrt",
504    "exp",
505    "log",
506    "exp2",
507    "log2",
508    "f2i",
509    "f2u",
510    "i2f",
511    "f2b",
512    "b2f",
513    "i2b",
514    "b2i",
515    "u2f",
516    "i2u",
517    "u2i",
518    "d2f",
519    "f2d",
520    "d2i",
521    "i2d",
522    "d2u",
523    "u2d",
524    "d2b",
525    "bitcast_i2f",
526    "bitcast_f2i",
527    "bitcast_u2f",
528    "bitcast_f2u",
529    "trunc",
530    "ceil",
531    "floor",
532    "fract",
533    "round_even",
534    "sin",
535    "cos",
536    "dFdx",
537    "dFdxCoarse",
538    "dFdxFine",
539    "dFdy",
540    "dFdyCoarse",
541    "dFdyFine",
542    "packSnorm2x16",
543    "packSnorm4x8",
544    "packUnorm2x16",
545    "packUnorm4x8",
546    "packHalf2x16",
547    "unpackSnorm2x16",
548    "unpackSnorm4x8",
549    "unpackUnorm2x16",
550    "unpackUnorm4x8",
551    "unpackHalf2x16",
552    "bitfield_reverse",
553    "bit_count",
554    "find_msb",
555    "find_lsb",
556    "sat",
557    "packDouble2x32",
558    "unpackDouble2x32",
559    "frexp_sig",
560    "frexp_exp",
561    "noise",
562    "subroutine_to_int",
563    "interpolate_at_centroid",
564    "get_buffer_size",
565    "ssbo_unsized_array_length",
566    "+",
567    "-",
568    "*",
569    "imul_high",
570    "/",
571    "carry",
572    "borrow",
573    "%",
574    "<",
575    ">",
576    "<=",
577    ">=",
578    "==",
579    "!=",
580    "all_equal",
581    "any_nequal",
582    "<<",
583    ">>",
584    "&",
585    "^",
586    "|",
587    "&&",
588    "^^",
589    "||",
590    "dot",
591    "min",
592    "max",
593    "pow",
594    "ubo_load",
595    "ldexp",
596    "vector_extract",
597    "interpolate_at_offset",
598    "interpolate_at_sample",
599    "fma",
600    "lrp",
601    "csel",
602    "bitfield_extract",
603    "vector_insert",
604    "bitfield_insert",
605    "vector",
606 };
607
608 const char *ir_expression::operator_string(ir_expression_operation op)
609 {
610    assert((unsigned int) op < ARRAY_SIZE(operator_strs));
611    assert(ARRAY_SIZE(operator_strs) == (ir_quadop_vector + 1));
612    return operator_strs[op];
613 }
614
615 const char *ir_expression::operator_string()
616 {
617    return operator_string(this->operation);
618 }
619
620 const char*
621 depth_layout_string(ir_depth_layout layout)
622 {
623    switch(layout) {
624    case ir_depth_layout_none:      return "";
625    case ir_depth_layout_any:       return "depth_any";
626    case ir_depth_layout_greater:   return "depth_greater";
627    case ir_depth_layout_less:      return "depth_less";
628    case ir_depth_layout_unchanged: return "depth_unchanged";
629
630    default:
631       assert(0);
632       return "";
633    }
634 }
635
636 ir_expression_operation
637 ir_expression::get_operator(const char *str)
638 {
639    const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]);
640    for (int op = 0; op < operator_count; op++) {
641       if (strcmp(str, operator_strs[op]) == 0)
642          return (ir_expression_operation) op;
643    }
644    return (ir_expression_operation) -1;
645 }
646
647 ir_variable *
648 ir_expression::variable_referenced() const
649 {
650    switch (operation) {
651       case ir_binop_vector_extract:
652       case ir_triop_vector_insert:
653          /* We get these for things like a[0] where a is a vector type. In these
654           * cases we want variable_referenced() to return the actual vector
655           * variable this is wrapping.
656           */
657          return operands[0]->variable_referenced();
658       default:
659          return ir_rvalue::variable_referenced();
660    }
661 }
662
663 ir_constant::ir_constant()
664    : ir_rvalue(ir_type_constant)
665 {
666 }
667
668 ir_constant::ir_constant(const struct glsl_type *type,
669                          const ir_constant_data *data)
670    : ir_rvalue(ir_type_constant)
671 {
672    assert((type->base_type >= GLSL_TYPE_UINT)
673           && (type->base_type <= GLSL_TYPE_BOOL));
674
675    this->type = type;
676    memcpy(& this->value, data, sizeof(this->value));
677 }
678
679 ir_constant::ir_constant(float f, unsigned vector_elements)
680    : ir_rvalue(ir_type_constant)
681 {
682    assert(vector_elements <= 4);
683    this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, vector_elements, 1);
684    for (unsigned i = 0; i < vector_elements; i++) {
685       this->value.f[i] = f;
686    }
687    for (unsigned i = vector_elements; i < 16; i++)  {
688       this->value.f[i] = 0;
689    }
690 }
691
692 ir_constant::ir_constant(double d, unsigned vector_elements)
693    : ir_rvalue(ir_type_constant)
694 {
695    assert(vector_elements <= 4);
696    this->type = glsl_type::get_instance(GLSL_TYPE_DOUBLE, vector_elements, 1);
697    for (unsigned i = 0; i < vector_elements; i++) {
698       this->value.d[i] = d;
699    }
700    for (unsigned i = vector_elements; i < 16; i++)  {
701       this->value.d[i] = 0.0;
702    }
703 }
704
705 ir_constant::ir_constant(unsigned int u, unsigned vector_elements)
706    : ir_rvalue(ir_type_constant)
707 {
708    assert(vector_elements <= 4);
709    this->type = glsl_type::get_instance(GLSL_TYPE_UINT, vector_elements, 1);
710    for (unsigned i = 0; i < vector_elements; i++) {
711       this->value.u[i] = u;
712    }
713    for (unsigned i = vector_elements; i < 16; i++) {
714       this->value.u[i] = 0;
715    }
716 }
717
718 ir_constant::ir_constant(int integer, unsigned vector_elements)
719    : ir_rvalue(ir_type_constant)
720 {
721    assert(vector_elements <= 4);
722    this->type = glsl_type::get_instance(GLSL_TYPE_INT, vector_elements, 1);
723    for (unsigned i = 0; i < vector_elements; i++) {
724       this->value.i[i] = integer;
725    }
726    for (unsigned i = vector_elements; i < 16; i++) {
727       this->value.i[i] = 0;
728    }
729 }
730
731 ir_constant::ir_constant(bool b, unsigned vector_elements)
732    : ir_rvalue(ir_type_constant)
733 {
734    assert(vector_elements <= 4);
735    this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, vector_elements, 1);
736    for (unsigned i = 0; i < vector_elements; i++) {
737       this->value.b[i] = b;
738    }
739    for (unsigned i = vector_elements; i < 16; i++) {
740       this->value.b[i] = false;
741    }
742 }
743
744 ir_constant::ir_constant(const ir_constant *c, unsigned i)
745    : ir_rvalue(ir_type_constant)
746 {
747    this->type = c->type->get_base_type();
748
749    switch (this->type->base_type) {
750    case GLSL_TYPE_UINT:  this->value.u[0] = c->value.u[i]; break;
751    case GLSL_TYPE_INT:   this->value.i[0] = c->value.i[i]; break;
752    case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break;
753    case GLSL_TYPE_BOOL:  this->value.b[0] = c->value.b[i]; break;
754    case GLSL_TYPE_DOUBLE: this->value.d[0] = c->value.d[i]; break;
755    default:              assert(!"Should not get here."); break;
756    }
757 }
758
759 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list)
760    : ir_rvalue(ir_type_constant)
761 {
762    this->type = type;
763
764    assert(type->is_scalar() || type->is_vector() || type->is_matrix()
765           || type->is_record() || type->is_array());
766
767    if (type->is_array()) {
768       this->array_elements = ralloc_array(this, ir_constant *, type->length);
769       unsigned i = 0;
770       foreach_in_list(ir_constant, value, value_list) {
771          assert(value->as_constant() != NULL);
772
773          this->array_elements[i++] = value;
774       }
775       return;
776    }
777
778    /* If the constant is a record, the types of each of the entries in
779     * value_list must be a 1-for-1 match with the structure components.  Each
780     * entry must also be a constant.  Just move the nodes from the value_list
781     * to the list in the ir_constant.
782     */
783    /* FINISHME: Should there be some type checking and / or assertions here? */
784    /* FINISHME: Should the new constant take ownership of the nodes from
785     * FINISHME: value_list, or should it make copies?
786     */
787    if (type->is_record()) {
788       value_list->move_nodes_to(& this->components);
789       return;
790    }
791
792    for (unsigned i = 0; i < 16; i++) {
793       this->value.u[i] = 0;
794    }
795
796    ir_constant *value = (ir_constant *) (value_list->head);
797
798    /* Constructors with exactly one scalar argument are special for vectors
799     * and matrices.  For vectors, the scalar value is replicated to fill all
800     * the components.  For matrices, the scalar fills the components of the
801     * diagonal while the rest is filled with 0.
802     */
803    if (value->type->is_scalar() && value->next->is_tail_sentinel()) {
804       if (type->is_matrix()) {
805          /* Matrix - fill diagonal (rest is already set to 0) */
806          assert(type->base_type == GLSL_TYPE_FLOAT ||
807                 type->base_type == GLSL_TYPE_DOUBLE);
808          for (unsigned i = 0; i < type->matrix_columns; i++) {
809             if (type->base_type == GLSL_TYPE_FLOAT)
810                this->value.f[i * type->vector_elements + i] =
811                   value->value.f[0];
812             else
813                this->value.d[i * type->vector_elements + i] =
814                   value->value.d[0];
815          }
816       } else {
817          /* Vector or scalar - fill all components */
818          switch (type->base_type) {
819          case GLSL_TYPE_UINT:
820          case GLSL_TYPE_INT:
821             for (unsigned i = 0; i < type->components(); i++)
822                this->value.u[i] = value->value.u[0];
823             break;
824          case GLSL_TYPE_FLOAT:
825             for (unsigned i = 0; i < type->components(); i++)
826                this->value.f[i] = value->value.f[0];
827             break;
828          case GLSL_TYPE_DOUBLE:
829             for (unsigned i = 0; i < type->components(); i++)
830                this->value.d[i] = value->value.d[0];
831             break;
832          case GLSL_TYPE_BOOL:
833             for (unsigned i = 0; i < type->components(); i++)
834                this->value.b[i] = value->value.b[0];
835             break;
836          default:
837             assert(!"Should not get here.");
838             break;
839          }
840       }
841       return;
842    }
843
844    if (type->is_matrix() && value->type->is_matrix()) {
845       assert(value->next->is_tail_sentinel());
846
847       /* From section 5.4.2 of the GLSL 1.20 spec:
848        * "If a matrix is constructed from a matrix, then each component
849        *  (column i, row j) in the result that has a corresponding component
850        *  (column i, row j) in the argument will be initialized from there."
851        */
852       unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns);
853       unsigned rows = MIN2(type->vector_elements, value->type->vector_elements);
854       for (unsigned i = 0; i < cols; i++) {
855          for (unsigned j = 0; j < rows; j++) {
856             const unsigned src = i * value->type->vector_elements + j;
857             const unsigned dst = i * type->vector_elements + j;
858             this->value.f[dst] = value->value.f[src];
859          }
860       }
861
862       /* "All other components will be initialized to the identity matrix." */
863       for (unsigned i = cols; i < type->matrix_columns; i++)
864          this->value.f[i * type->vector_elements + i] = 1.0;
865
866       return;
867    }
868
869    /* Use each component from each entry in the value_list to initialize one
870     * component of the constant being constructed.
871     */
872    for (unsigned i = 0; i < type->components(); /* empty */) {
873       assert(value->as_constant() != NULL);
874       assert(!value->is_tail_sentinel());
875
876       for (unsigned j = 0; j < value->type->components(); j++) {
877          switch (type->base_type) {
878          case GLSL_TYPE_UINT:
879             this->value.u[i] = value->get_uint_component(j);
880             break;
881          case GLSL_TYPE_INT:
882             this->value.i[i] = value->get_int_component(j);
883             break;
884          case GLSL_TYPE_FLOAT:
885             this->value.f[i] = value->get_float_component(j);
886             break;
887          case GLSL_TYPE_BOOL:
888             this->value.b[i] = value->get_bool_component(j);
889             break;
890          case GLSL_TYPE_DOUBLE:
891             this->value.d[i] = value->get_double_component(j);
892             break;
893          default:
894             /* FINISHME: What to do?  Exceptions are not the answer.
895              */
896             break;
897          }
898
899          i++;
900          if (i >= type->components())
901             break;
902       }
903
904       value = (ir_constant *) value->next;
905    }
906 }
907
908 ir_constant *
909 ir_constant::zero(void *mem_ctx, const glsl_type *type)
910 {
911    assert(type->is_scalar() || type->is_vector() || type->is_matrix()
912           || type->is_record() || type->is_array());
913
914    ir_constant *c = new(mem_ctx) ir_constant;
915    c->type = type;
916    memset(&c->value, 0, sizeof(c->value));
917
918    if (type->is_array()) {
919       c->array_elements = ralloc_array(c, ir_constant *, type->length);
920
921       for (unsigned i = 0; i < type->length; i++)
922          c->array_elements[i] = ir_constant::zero(c, type->fields.array);
923    }
924
925    if (type->is_record()) {
926       for (unsigned i = 0; i < type->length; i++) {
927          ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type);
928          c->components.push_tail(comp);
929       }
930    }
931
932    return c;
933 }
934
935 bool
936 ir_constant::get_bool_component(unsigned i) const
937 {
938    switch (this->type->base_type) {
939    case GLSL_TYPE_UINT:  return this->value.u[i] != 0;
940    case GLSL_TYPE_INT:   return this->value.i[i] != 0;
941    case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0;
942    case GLSL_TYPE_BOOL:  return this->value.b[i];
943    case GLSL_TYPE_DOUBLE: return this->value.d[i] != 0.0;
944    default:              assert(!"Should not get here."); break;
945    }
946
947    /* Must return something to make the compiler happy.  This is clearly an
948     * error case.
949     */
950    return false;
951 }
952
953 float
954 ir_constant::get_float_component(unsigned i) const
955 {
956    switch (this->type->base_type) {
957    case GLSL_TYPE_UINT:  return (float) this->value.u[i];
958    case GLSL_TYPE_INT:   return (float) this->value.i[i];
959    case GLSL_TYPE_FLOAT: return this->value.f[i];
960    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1.0f : 0.0f;
961    case GLSL_TYPE_DOUBLE: return (float) this->value.d[i];
962    default:              assert(!"Should not get here."); break;
963    }
964
965    /* Must return something to make the compiler happy.  This is clearly an
966     * error case.
967     */
968    return 0.0;
969 }
970
971 double
972 ir_constant::get_double_component(unsigned i) const
973 {
974    switch (this->type->base_type) {
975    case GLSL_TYPE_UINT:  return (double) this->value.u[i];
976    case GLSL_TYPE_INT:   return (double) this->value.i[i];
977    case GLSL_TYPE_FLOAT: return (double) this->value.f[i];
978    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1.0 : 0.0;
979    case GLSL_TYPE_DOUBLE: return this->value.d[i];
980    default:              assert(!"Should not get here."); break;
981    }
982
983    /* Must return something to make the compiler happy.  This is clearly an
984     * error case.
985     */
986    return 0.0;
987 }
988
989 int
990 ir_constant::get_int_component(unsigned i) const
991 {
992    switch (this->type->base_type) {
993    case GLSL_TYPE_UINT:  return this->value.u[i];
994    case GLSL_TYPE_INT:   return this->value.i[i];
995    case GLSL_TYPE_FLOAT: return (int) this->value.f[i];
996    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
997    case GLSL_TYPE_DOUBLE: return (int) this->value.d[i];
998    default:              assert(!"Should not get here."); break;
999    }
1000
1001    /* Must return something to make the compiler happy.  This is clearly an
1002     * error case.
1003     */
1004    return 0;
1005 }
1006
1007 unsigned
1008 ir_constant::get_uint_component(unsigned i) const
1009 {
1010    switch (this->type->base_type) {
1011    case GLSL_TYPE_UINT:  return this->value.u[i];
1012    case GLSL_TYPE_INT:   return this->value.i[i];
1013    case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i];
1014    case GLSL_TYPE_BOOL:  return this->value.b[i] ? 1 : 0;
1015    case GLSL_TYPE_DOUBLE: return (unsigned) this->value.d[i];
1016    default:              assert(!"Should not get here."); break;
1017    }
1018
1019    /* Must return something to make the compiler happy.  This is clearly an
1020     * error case.
1021     */
1022    return 0;
1023 }
1024
1025 ir_constant *
1026 ir_constant::get_array_element(unsigned i) const
1027 {
1028    assert(this->type->is_array());
1029
1030    /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
1031     *
1032     *     "Behavior is undefined if a shader subscripts an array with an index
1033     *     less than 0 or greater than or equal to the size the array was
1034     *     declared with."
1035     *
1036     * Most out-of-bounds accesses are removed before things could get this far.
1037     * There are cases where non-constant array index values can get constant
1038     * folded.
1039     */
1040    if (int(i) < 0)
1041       i = 0;
1042    else if (i >= this->type->length)
1043       i = this->type->length - 1;
1044
1045    return array_elements[i];
1046 }
1047
1048 ir_constant *
1049 ir_constant::get_record_field(const char *name)
1050 {
1051    int idx = this->type->field_index(name);
1052
1053    if (idx < 0)
1054       return NULL;
1055
1056    if (this->components.is_empty())
1057       return NULL;
1058
1059    exec_node *node = this->components.head;
1060    for (int i = 0; i < idx; i++) {
1061       node = node->next;
1062
1063       /* If the end of the list is encountered before the element matching the
1064        * requested field is found, return NULL.
1065        */
1066       if (node->is_tail_sentinel())
1067          return NULL;
1068    }
1069
1070    return (ir_constant *) node;
1071 }
1072
1073 void
1074 ir_constant::copy_offset(ir_constant *src, int offset)
1075 {
1076    switch (this->type->base_type) {
1077    case GLSL_TYPE_UINT:
1078    case GLSL_TYPE_INT:
1079    case GLSL_TYPE_FLOAT:
1080    case GLSL_TYPE_DOUBLE:
1081    case GLSL_TYPE_BOOL: {
1082       unsigned int size = src->type->components();
1083       assert (size <= this->type->components() - offset);
1084       for (unsigned int i=0; i<size; i++) {
1085          switch (this->type->base_type) {
1086          case GLSL_TYPE_UINT:
1087             value.u[i+offset] = src->get_uint_component(i);
1088             break;
1089          case GLSL_TYPE_INT:
1090             value.i[i+offset] = src->get_int_component(i);
1091             break;
1092          case GLSL_TYPE_FLOAT:
1093             value.f[i+offset] = src->get_float_component(i);
1094             break;
1095          case GLSL_TYPE_BOOL:
1096             value.b[i+offset] = src->get_bool_component(i);
1097             break;
1098          case GLSL_TYPE_DOUBLE:
1099             value.d[i+offset] = src->get_double_component(i);
1100             break;
1101          default: // Shut up the compiler
1102             break;
1103          }
1104       }
1105       break;
1106    }
1107
1108    case GLSL_TYPE_STRUCT: {
1109       assert (src->type == this->type);
1110       this->components.make_empty();
1111       foreach_in_list(ir_constant, orig, &src->components) {
1112          this->components.push_tail(orig->clone(this, NULL));
1113       }
1114       break;
1115    }
1116
1117    case GLSL_TYPE_ARRAY: {
1118       assert (src->type == this->type);
1119       for (unsigned i = 0; i < this->type->length; i++) {
1120          this->array_elements[i] = src->array_elements[i]->clone(this, NULL);
1121       }
1122       break;
1123    }
1124
1125    default:
1126       assert(!"Should not get here.");
1127       break;
1128    }
1129 }
1130
1131 void
1132 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask)
1133 {
1134    assert (!type->is_array() && !type->is_record());
1135
1136    if (!type->is_vector() && !type->is_matrix()) {
1137       offset = 0;
1138       mask = 1;
1139    }
1140
1141    int id = 0;
1142    for (int i=0; i<4; i++) {
1143       if (mask & (1 << i)) {
1144          switch (this->type->base_type) {
1145          case GLSL_TYPE_UINT:
1146             value.u[i+offset] = src->get_uint_component(id++);
1147             break;
1148          case GLSL_TYPE_INT:
1149             value.i[i+offset] = src->get_int_component(id++);
1150             break;
1151          case GLSL_TYPE_FLOAT:
1152             value.f[i+offset] = src->get_float_component(id++);
1153             break;
1154          case GLSL_TYPE_BOOL:
1155             value.b[i+offset] = src->get_bool_component(id++);
1156             break;
1157          case GLSL_TYPE_DOUBLE:
1158             value.d[i+offset] = src->get_double_component(id++);
1159             break;
1160          default:
1161             assert(!"Should not get here.");
1162             return;
1163          }
1164       }
1165    }
1166 }
1167
1168 bool
1169 ir_constant::has_value(const ir_constant *c) const
1170 {
1171    if (this->type != c->type)
1172       return false;
1173
1174    if (this->type->is_array()) {
1175       for (unsigned i = 0; i < this->type->length; i++) {
1176          if (!this->array_elements[i]->has_value(c->array_elements[i]))
1177             return false;
1178       }
1179       return true;
1180    }
1181
1182    if (this->type->base_type == GLSL_TYPE_STRUCT) {
1183       const exec_node *a_node = this->components.head;
1184       const exec_node *b_node = c->components.head;
1185
1186       while (!a_node->is_tail_sentinel()) {
1187          assert(!b_node->is_tail_sentinel());
1188
1189          const ir_constant *const a_field = (ir_constant *) a_node;
1190          const ir_constant *const b_field = (ir_constant *) b_node;
1191
1192          if (!a_field->has_value(b_field))
1193             return false;
1194
1195          a_node = a_node->next;
1196          b_node = b_node->next;
1197       }
1198
1199       return true;
1200    }
1201
1202    for (unsigned i = 0; i < this->type->components(); i++) {
1203       switch (this->type->base_type) {
1204       case GLSL_TYPE_UINT:
1205          if (this->value.u[i] != c->value.u[i])
1206             return false;
1207          break;
1208       case GLSL_TYPE_INT:
1209          if (this->value.i[i] != c->value.i[i])
1210             return false;
1211          break;
1212       case GLSL_TYPE_FLOAT:
1213          if (this->value.f[i] != c->value.f[i])
1214             return false;
1215          break;
1216       case GLSL_TYPE_BOOL:
1217          if (this->value.b[i] != c->value.b[i])
1218             return false;
1219          break;
1220       case GLSL_TYPE_DOUBLE:
1221          if (this->value.d[i] != c->value.d[i])
1222             return false;
1223          break;
1224       default:
1225          assert(!"Should not get here.");
1226          return false;
1227       }
1228    }
1229
1230    return true;
1231 }
1232
1233 bool
1234 ir_constant::is_value(float f, int i) const
1235 {
1236    if (!this->type->is_scalar() && !this->type->is_vector())
1237       return false;
1238
1239    /* Only accept boolean values for 0/1. */
1240    if (int(bool(i)) != i && this->type->is_boolean())
1241       return false;
1242
1243    for (unsigned c = 0; c < this->type->vector_elements; c++) {
1244       switch (this->type->base_type) {
1245       case GLSL_TYPE_FLOAT:
1246          if (this->value.f[c] != f)
1247             return false;
1248          break;
1249       case GLSL_TYPE_INT:
1250          if (this->value.i[c] != i)
1251             return false;
1252          break;
1253       case GLSL_TYPE_UINT:
1254          if (this->value.u[c] != unsigned(i))
1255             return false;
1256          break;
1257       case GLSL_TYPE_BOOL:
1258          if (this->value.b[c] != bool(i))
1259             return false;
1260          break;
1261       case GLSL_TYPE_DOUBLE:
1262          if (this->value.d[c] != double(f))
1263             return false;
1264          break;
1265       default:
1266          /* The only other base types are structures, arrays, and samplers.
1267           * Samplers cannot be constants, and the others should have been
1268           * filtered out above.
1269           */
1270          assert(!"Should not get here.");
1271          return false;
1272       }
1273    }
1274
1275    return true;
1276 }
1277
1278 bool
1279 ir_constant::is_zero() const
1280 {
1281    return is_value(0.0, 0);
1282 }
1283
1284 bool
1285 ir_constant::is_one() const
1286 {
1287    return is_value(1.0, 1);
1288 }
1289
1290 bool
1291 ir_constant::is_negative_one() const
1292 {
1293    return is_value(-1.0, -1);
1294 }
1295
1296 bool
1297 ir_constant::is_uint16_constant() const
1298 {
1299    if (!type->is_integer())
1300       return false;
1301
1302    return value.u[0] < (1 << 16);
1303 }
1304
1305 ir_loop::ir_loop()
1306    : ir_instruction(ir_type_loop)
1307 {
1308 }
1309
1310
1311 ir_dereference_variable::ir_dereference_variable(ir_variable *var)
1312    : ir_dereference(ir_type_dereference_variable)
1313 {
1314    assert(var != NULL);
1315
1316    this->var = var;
1317    this->type = var->type;
1318 }
1319
1320
1321 ir_dereference_array::ir_dereference_array(ir_rvalue *value,
1322                                            ir_rvalue *array_index)
1323    : ir_dereference(ir_type_dereference_array)
1324 {
1325    this->array_index = array_index;
1326    this->set_array(value);
1327 }
1328
1329
1330 ir_dereference_array::ir_dereference_array(ir_variable *var,
1331                                            ir_rvalue *array_index)
1332    : ir_dereference(ir_type_dereference_array)
1333 {
1334    void *ctx = ralloc_parent(var);
1335
1336    this->array_index = array_index;
1337    this->set_array(new(ctx) ir_dereference_variable(var));
1338 }
1339
1340
1341 void
1342 ir_dereference_array::set_array(ir_rvalue *value)
1343 {
1344    assert(value != NULL);
1345
1346    this->array = value;
1347
1348    const glsl_type *const vt = this->array->type;
1349
1350    if (vt->is_array()) {
1351       type = vt->fields.array;
1352    } else if (vt->is_matrix()) {
1353       type = vt->column_type();
1354    } else if (vt->is_vector()) {
1355       type = vt->get_base_type();
1356    }
1357 }
1358
1359
1360 ir_dereference_record::ir_dereference_record(ir_rvalue *value,
1361                                              const char *field)
1362    : ir_dereference(ir_type_dereference_record)
1363 {
1364    assert(value != NULL);
1365
1366    this->record = value;
1367    this->field = ralloc_strdup(this, field);
1368    this->type = this->record->type->field_type(field);
1369 }
1370
1371
1372 ir_dereference_record::ir_dereference_record(ir_variable *var,
1373                                              const char *field)
1374    : ir_dereference(ir_type_dereference_record)
1375 {
1376    void *ctx = ralloc_parent(var);
1377
1378    this->record = new(ctx) ir_dereference_variable(var);
1379    this->field = ralloc_strdup(this, field);
1380    this->type = this->record->type->field_type(field);
1381 }
1382
1383 bool
1384 ir_dereference::is_lvalue() const
1385 {
1386    ir_variable *var = this->variable_referenced();
1387
1388    /* Every l-value derference chain eventually ends in a variable.
1389     */
1390    if ((var == NULL) || var->data.read_only)
1391       return false;
1392
1393    /* From section 4.1.7 of the GLSL 4.40 spec:
1394     *
1395     *   "Opaque variables cannot be treated as l-values; hence cannot
1396     *    be used as out or inout function parameters, nor can they be
1397     *    assigned into."
1398     */
1399    if (this->type->contains_opaque())
1400       return false;
1401
1402    return true;
1403 }
1404
1405
1406 static const char * const tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4", "query_levels", "texture_samples", "samples_identical" };
1407
1408 const char *ir_texture::opcode_string()
1409 {
1410    assert((unsigned int) op < ARRAY_SIZE(tex_opcode_strs));
1411    return tex_opcode_strs[op];
1412 }
1413
1414 ir_texture_opcode
1415 ir_texture::get_opcode(const char *str)
1416 {
1417    const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]);
1418    for (int op = 0; op < count; op++) {
1419       if (strcmp(str, tex_opcode_strs[op]) == 0)
1420          return (ir_texture_opcode) op;
1421    }
1422    return (ir_texture_opcode) -1;
1423 }
1424
1425
1426 void
1427 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type)
1428 {
1429    assert(sampler != NULL);
1430    assert(type != NULL);
1431    this->sampler = sampler;
1432    this->type = type;
1433
1434    if (this->op == ir_txs || this->op == ir_query_levels ||
1435        this->op == ir_texture_samples) {
1436       assert(type->base_type == GLSL_TYPE_INT);
1437    } else if (this->op == ir_lod) {
1438       assert(type->vector_elements == 2);
1439       assert(type->base_type == GLSL_TYPE_FLOAT);
1440    } else if (this->op == ir_samples_identical) {
1441       assert(type == glsl_type::bool_type);
1442       assert(sampler->type->base_type == GLSL_TYPE_SAMPLER);
1443       assert(sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS);
1444    } else {
1445       assert(sampler->type->sampled_type == (int) type->base_type);
1446       if (sampler->type->sampler_shadow)
1447          assert(type->vector_elements == 4 || type->vector_elements == 1);
1448       else
1449          assert(type->vector_elements == 4);
1450    }
1451 }
1452
1453
1454 void
1455 ir_swizzle::init_mask(const unsigned *comp, unsigned count)
1456 {
1457    assert((count >= 1) && (count <= 4));
1458
1459    memset(&this->mask, 0, sizeof(this->mask));
1460    this->mask.num_components = count;
1461
1462    unsigned dup_mask = 0;
1463    switch (count) {
1464    case 4:
1465       assert(comp[3] <= 3);
1466       dup_mask |= (1U << comp[3])
1467          & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2]));
1468       this->mask.w = comp[3];
1469
1470    case 3:
1471       assert(comp[2] <= 3);
1472       dup_mask |= (1U << comp[2])
1473          & ((1U << comp[0]) | (1U << comp[1]));
1474       this->mask.z = comp[2];
1475
1476    case 2:
1477       assert(comp[1] <= 3);
1478       dup_mask |= (1U << comp[1])
1479          & ((1U << comp[0]));
1480       this->mask.y = comp[1];
1481
1482    case 1:
1483       assert(comp[0] <= 3);
1484       this->mask.x = comp[0];
1485    }
1486
1487    this->mask.has_duplicates = dup_mask != 0;
1488
1489    /* Based on the number of elements in the swizzle and the base type
1490     * (i.e., float, int, unsigned, or bool) of the vector being swizzled,
1491     * generate the type of the resulting value.
1492     */
1493    type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1);
1494 }
1495
1496 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
1497                        unsigned w, unsigned count)
1498    : ir_rvalue(ir_type_swizzle), val(val)
1499 {
1500    const unsigned components[4] = { x, y, z, w };
1501    this->init_mask(components, count);
1502 }
1503
1504 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp,
1505                        unsigned count)
1506    : ir_rvalue(ir_type_swizzle), val(val)
1507 {
1508    this->init_mask(comp, count);
1509 }
1510
1511 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask)
1512    : ir_rvalue(ir_type_swizzle)
1513 {
1514    this->val = val;
1515    this->mask = mask;
1516    this->type = glsl_type::get_instance(val->type->base_type,
1517                                         mask.num_components, 1);
1518 }
1519
1520 #define X 1
1521 #define R 5
1522 #define S 9
1523 #define I 13
1524
1525 ir_swizzle *
1526 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length)
1527 {
1528    void *ctx = ralloc_parent(val);
1529
1530    /* For each possible swizzle character, this table encodes the value in
1531     * \c idx_map that represents the 0th element of the vector.  For invalid
1532     * swizzle characters (e.g., 'k'), a special value is used that will allow
1533     * detection of errors.
1534     */
1535    static const unsigned char base_idx[26] = {
1536    /* a  b  c  d  e  f  g  h  i  j  k  l  m */
1537       R, R, I, I, I, I, R, I, I, I, I, I, I,
1538    /* n  o  p  q  r  s  t  u  v  w  x  y  z */
1539       I, I, S, S, R, S, S, I, I, X, X, X, X
1540    };
1541
1542    /* Each valid swizzle character has an entry in the previous table.  This
1543     * table encodes the base index encoded in the previous table plus the actual
1544     * index of the swizzle character.  When processing swizzles, the first
1545     * character in the string is indexed in the previous table.  Each character
1546     * in the string is indexed in this table, and the value found there has the
1547     * value form the first table subtracted.  The result must be on the range
1548     * [0,3].
1549     *
1550     * For example, the string "wzyx" will get X from the first table.  Each of
1551     * the charcaters will get X+3, X+2, X+1, and X+0 from this table.  After
1552     * subtraction, the swizzle values are { 3, 2, 1, 0 }.
1553     *
1554     * The string "wzrg" will get X from the first table.  Each of the characters
1555     * will get X+3, X+2, R+0, and R+1 from this table.  After subtraction, the
1556     * swizzle values are { 3, 2, 4, 5 }.  Since 4 and 5 are outside the range
1557     * [0,3], the error is detected.
1558     */
1559    static const unsigned char idx_map[26] = {
1560    /* a    b    c    d    e    f    g    h    i    j    k    l    m */
1561       R+3, R+2, 0,   0,   0,   0,   R+1, 0,   0,   0,   0,   0,   0,
1562    /* n    o    p    q    r    s    t    u    v    w    x    y    z */
1563       0,   0,   S+2, S+3, R+0, S+0, S+1, 0,   0,   X+3, X+0, X+1, X+2
1564    };
1565
1566    int swiz_idx[4] = { 0, 0, 0, 0 };
1567    unsigned i;
1568
1569
1570    /* Validate the first character in the swizzle string and look up the base
1571     * index value as described above.
1572     */
1573    if ((str[0] < 'a') || (str[0] > 'z'))
1574       return NULL;
1575
1576    const unsigned base = base_idx[str[0] - 'a'];
1577
1578
1579    for (i = 0; (i < 4) && (str[i] != '\0'); i++) {
1580       /* Validate the next character, and, as described above, convert it to a
1581        * swizzle index.
1582        */
1583       if ((str[i] < 'a') || (str[i] > 'z'))
1584          return NULL;
1585
1586       swiz_idx[i] = idx_map[str[i] - 'a'] - base;
1587       if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length))
1588          return NULL;
1589    }
1590
1591    if (str[i] != '\0')
1592          return NULL;
1593
1594    return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2],
1595                               swiz_idx[3], i);
1596 }
1597
1598 #undef X
1599 #undef R
1600 #undef S
1601 #undef I
1602
1603 ir_variable *
1604 ir_swizzle::variable_referenced() const
1605 {
1606    return this->val->variable_referenced();
1607 }
1608
1609
1610 bool ir_variable::temporaries_allocate_names = false;
1611
1612 const char ir_variable::tmp_name[] = "compiler_temp";
1613
1614 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
1615                          ir_variable_mode mode)
1616    : ir_instruction(ir_type_variable)
1617 {
1618    this->type = type;
1619
1620    if (mode == ir_var_temporary && !ir_variable::temporaries_allocate_names)
1621       name = NULL;
1622
1623    /* The ir_variable clone method may call this constructor with name set to
1624     * tmp_name.
1625     */
1626    assert(name != NULL
1627           || mode == ir_var_temporary
1628           || mode == ir_var_function_in
1629           || mode == ir_var_function_out
1630           || mode == ir_var_function_inout);
1631    assert(name != ir_variable::tmp_name
1632           || mode == ir_var_temporary);
1633    if (mode == ir_var_temporary
1634        && (name == NULL || name == ir_variable::tmp_name)) {
1635       this->name = ir_variable::tmp_name;
1636    } else {
1637       this->name = ralloc_strdup(this, name);
1638    }
1639
1640    this->u.max_ifc_array_access = NULL;
1641
1642    this->data.explicit_location = false;
1643    this->data.has_initializer = false;
1644    this->data.location = -1;
1645    this->data.location_frac = 0;
1646    this->data.binding = 0;
1647    this->data.warn_extension_index = 0;
1648    this->constant_value = NULL;
1649    this->constant_initializer = NULL;
1650    this->data.origin_upper_left = false;
1651    this->data.pixel_center_integer = false;
1652    this->data.depth_layout = ir_depth_layout_none;
1653    this->data.used = false;
1654    this->data.always_active_io = false;
1655    this->data.read_only = false;
1656    this->data.centroid = false;
1657    this->data.sample = false;
1658    this->data.patch = false;
1659    this->data.invariant = false;
1660    this->data.how_declared = ir_var_declared_normally;
1661    this->data.mode = mode;
1662    this->data.interpolation = INTERP_QUALIFIER_NONE;
1663    this->data.max_array_access = 0;
1664    this->data.offset = 0;
1665    this->data.precision = GLSL_PRECISION_NONE;
1666    this->data.image_read_only = false;
1667    this->data.image_write_only = false;
1668    this->data.image_coherent = false;
1669    this->data.image_volatile = false;
1670    this->data.image_restrict = false;
1671    this->data.from_ssbo_unsized_array = false;
1672
1673    if (type != NULL) {
1674       if (type->base_type == GLSL_TYPE_SAMPLER)
1675          this->data.read_only = true;
1676
1677       if (type->is_interface())
1678          this->init_interface_type(type);
1679       else if (type->without_array()->is_interface())
1680          this->init_interface_type(type->without_array());
1681    }
1682 }
1683
1684
1685 const char *
1686 interpolation_string(unsigned interpolation)
1687 {
1688    switch (interpolation) {
1689    case INTERP_QUALIFIER_NONE:          return "no";
1690    case INTERP_QUALIFIER_SMOOTH:        return "smooth";
1691    case INTERP_QUALIFIER_FLAT:          return "flat";
1692    case INTERP_QUALIFIER_NOPERSPECTIVE: return "noperspective";
1693    }
1694
1695    assert(!"Should not get here.");
1696    return "";
1697 }
1698
1699 const char *const ir_variable::warn_extension_table[] = {
1700    "",
1701    "GL_ARB_shader_stencil_export",
1702    "GL_AMD_shader_stencil_export",
1703 };
1704
1705 void
1706 ir_variable::enable_extension_warning(const char *extension)
1707 {
1708    for (unsigned i = 0; i < ARRAY_SIZE(warn_extension_table); i++) {
1709       if (strcmp(warn_extension_table[i], extension) == 0) {
1710          this->data.warn_extension_index = i;
1711          return;
1712       }
1713    }
1714
1715    assert(!"Should not get here.");
1716    this->data.warn_extension_index = 0;
1717 }
1718
1719 const char *
1720 ir_variable::get_extension_warning() const
1721 {
1722    return this->data.warn_extension_index == 0
1723       ? NULL : warn_extension_table[this->data.warn_extension_index];
1724 }
1725
1726 ir_function_signature::ir_function_signature(const glsl_type *return_type,
1727                                              builtin_available_predicate b)
1728    : ir_instruction(ir_type_function_signature),
1729      return_type(return_type), is_defined(false), is_intrinsic(false),
1730      builtin_avail(b), _function(NULL)
1731 {
1732    this->origin = NULL;
1733 }
1734
1735
1736 bool
1737 ir_function_signature::is_builtin() const
1738 {
1739    return builtin_avail != NULL;
1740 }
1741
1742
1743 bool
1744 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const
1745 {
1746    /* We can't call the predicate without a state pointer, so just say that
1747     * the signature is available.  At compile time, we need the filtering,
1748     * but also receive a valid state pointer.  At link time, we're resolving
1749     * imported built-in prototypes to their definitions, which will always
1750     * be an exact match.  So we can skip the filtering.
1751     */
1752    if (state == NULL)
1753       return true;
1754
1755    assert(builtin_avail != NULL);
1756    return builtin_avail(state);
1757 }
1758
1759
1760 static bool
1761 modes_match(unsigned a, unsigned b)
1762 {
1763    if (a == b)
1764       return true;
1765
1766    /* Accept "in" vs. "const in" */
1767    if ((a == ir_var_const_in && b == ir_var_function_in) ||
1768        (b == ir_var_const_in && a == ir_var_function_in))
1769       return true;
1770
1771    return false;
1772 }
1773
1774
1775 const char *
1776 ir_function_signature::qualifiers_match(exec_list *params)
1777 {
1778    /* check that the qualifiers match. */
1779    foreach_two_lists(a_node, &this->parameters, b_node, params) {
1780       ir_variable *a = (ir_variable *) a_node;
1781       ir_variable *b = (ir_variable *) b_node;
1782
1783       if (a->data.read_only != b->data.read_only ||
1784           !modes_match(a->data.mode, b->data.mode) ||
1785           a->data.interpolation != b->data.interpolation ||
1786           a->data.centroid != b->data.centroid ||
1787           a->data.sample != b->data.sample ||
1788           a->data.patch != b->data.patch ||
1789           a->data.image_read_only != b->data.image_read_only ||
1790           a->data.image_write_only != b->data.image_write_only ||
1791           a->data.image_coherent != b->data.image_coherent ||
1792           a->data.image_volatile != b->data.image_volatile ||
1793           a->data.image_restrict != b->data.image_restrict) {
1794
1795          /* parameter a's qualifiers don't match */
1796          return a->name;
1797       }
1798    }
1799    return NULL;
1800 }
1801
1802
1803 void
1804 ir_function_signature::replace_parameters(exec_list *new_params)
1805 {
1806    /* Destroy all of the previous parameter information.  If the previous
1807     * parameter information comes from the function prototype, it may either
1808     * specify incorrect parameter names or not have names at all.
1809     */
1810    new_params->move_nodes_to(&parameters);
1811 }
1812
1813
1814 ir_function::ir_function(const char *name)
1815    : ir_instruction(ir_type_function)
1816 {
1817    this->subroutine_index = -1;
1818    this->name = ralloc_strdup(this, name);
1819 }
1820
1821
1822 bool
1823 ir_function::has_user_signature()
1824 {
1825    foreach_in_list(ir_function_signature, sig, &this->signatures) {
1826       if (!sig->is_builtin())
1827          return true;
1828    }
1829    return false;
1830 }
1831
1832
1833 ir_rvalue *
1834 ir_rvalue::error_value(void *mem_ctx)
1835 {
1836    ir_rvalue *v = new(mem_ctx) ir_rvalue(ir_type_unset);
1837
1838    v->type = glsl_type::error_type;
1839    return v;
1840 }
1841
1842
1843 void
1844 visit_exec_list(exec_list *list, ir_visitor *visitor)
1845 {
1846    foreach_in_list_safe(ir_instruction, node, list) {
1847       node->accept(visitor);
1848    }
1849 }
1850
1851
1852 static void
1853 steal_memory(ir_instruction *ir, void *new_ctx)
1854 {
1855    ir_variable *var = ir->as_variable();
1856    ir_function *fn = ir->as_function();
1857    ir_constant *constant = ir->as_constant();
1858    if (var != NULL && var->constant_value != NULL)
1859       steal_memory(var->constant_value, ir);
1860
1861    if (var != NULL && var->constant_initializer != NULL)
1862       steal_memory(var->constant_initializer, ir);
1863
1864    if (fn != NULL && fn->subroutine_types)
1865       ralloc_steal(new_ctx, fn->subroutine_types);
1866
1867    /* The components of aggregate constants are not visited by the normal
1868     * visitor, so steal their values by hand.
1869     */
1870    if (constant != NULL) {
1871       if (constant->type->is_record()) {
1872          foreach_in_list(ir_constant, field, &constant->components) {
1873             steal_memory(field, ir);
1874          }
1875       } else if (constant->type->is_array()) {
1876          for (unsigned int i = 0; i < constant->type->length; i++) {
1877             steal_memory(constant->array_elements[i], ir);
1878          }
1879       }
1880    }
1881
1882    ralloc_steal(new_ctx, ir);
1883 }
1884
1885
1886 void
1887 reparent_ir(exec_list *list, void *mem_ctx)
1888 {
1889    foreach_in_list(ir_instruction, node, list) {
1890       visit_tree(node, steal_memory, mem_ctx);
1891    }
1892 }
1893
1894
1895 static ir_rvalue *
1896 try_min_one(ir_rvalue *ir)
1897 {
1898    ir_expression *expr = ir->as_expression();
1899
1900    if (!expr || expr->operation != ir_binop_min)
1901       return NULL;
1902
1903    if (expr->operands[0]->is_one())
1904       return expr->operands[1];
1905
1906    if (expr->operands[1]->is_one())
1907       return expr->operands[0];
1908
1909    return NULL;
1910 }
1911
1912 static ir_rvalue *
1913 try_max_zero(ir_rvalue *ir)
1914 {
1915    ir_expression *expr = ir->as_expression();
1916
1917    if (!expr || expr->operation != ir_binop_max)
1918       return NULL;
1919
1920    if (expr->operands[0]->is_zero())
1921       return expr->operands[1];
1922
1923    if (expr->operands[1]->is_zero())
1924       return expr->operands[0];
1925
1926    return NULL;
1927 }
1928
1929 ir_rvalue *
1930 ir_rvalue::as_rvalue_to_saturate()
1931 {
1932    ir_expression *expr = this->as_expression();
1933
1934    if (!expr)
1935       return NULL;
1936
1937    ir_rvalue *max_zero = try_max_zero(expr);
1938    if (max_zero) {
1939       return try_min_one(max_zero);
1940    } else {
1941       ir_rvalue *min_one = try_min_one(expr);
1942       if (min_one) {
1943          return try_max_zero(min_one);
1944       }
1945    }
1946
1947    return NULL;
1948 }
1949
1950
1951 unsigned
1952 vertices_per_prim(GLenum prim)
1953 {
1954    switch (prim) {
1955    case GL_POINTS:
1956       return 1;
1957    case GL_LINES:
1958       return 2;
1959    case GL_TRIANGLES:
1960       return 3;
1961    case GL_LINES_ADJACENCY:
1962       return 4;
1963    case GL_TRIANGLES_ADJACENCY:
1964       return 6;
1965    default:
1966       assert(!"Bad primitive");
1967       return 3;
1968    }
1969 }
1970
1971 /**
1972  * Generate a string describing the mode of a variable
1973  */
1974 const char *
1975 mode_string(const ir_variable *var)
1976 {
1977    switch (var->data.mode) {
1978    case ir_var_auto:
1979       return (var->data.read_only) ? "global constant" : "global variable";
1980
1981    case ir_var_uniform:
1982       return "uniform";
1983
1984    case ir_var_shader_storage:
1985       return "buffer";
1986
1987    case ir_var_shader_in:
1988       return "shader input";
1989
1990    case ir_var_shader_out:
1991       return "shader output";
1992
1993    case ir_var_function_in:
1994    case ir_var_const_in:
1995       return "function input";
1996
1997    case ir_var_function_out:
1998       return "function output";
1999
2000    case ir_var_function_inout:
2001       return "function inout";
2002
2003    case ir_var_system_value:
2004       return "shader input";
2005
2006    case ir_var_temporary:
2007       return "compiler temporary";
2008
2009    case ir_var_mode_count:
2010       break;
2011    }
2012
2013    assert(!"Should not get here.");
2014    return "invalid variable";
2015 }