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