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