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