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