110e230b6Smaya   switch (this->operation) {
210e230b6Smaya   case ir_unop_bit_not:
310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
410e230b6Smaya         switch (op[0]->type->base_type) {
510e230b6Smaya         case GLSL_TYPE_UINT:
610e230b6Smaya            data.u[c] = ~ op[0]->value.u[c];
710e230b6Smaya            break;
810e230b6Smaya         case GLSL_TYPE_INT:
910e230b6Smaya            data.i[c] = ~ op[0]->value.i[c];
1010e230b6Smaya            break;
1110e230b6Smaya         case GLSL_TYPE_UINT64:
1210e230b6Smaya            data.u64[c] = ~ op[0]->value.u64[c];
1310e230b6Smaya            break;
1410e230b6Smaya         case GLSL_TYPE_INT64:
1510e230b6Smaya            data.i64[c] = ~ op[0]->value.i64[c];
1610e230b6Smaya            break;
1710e230b6Smaya         default:
1810e230b6Smaya            unreachable("invalid type");
1910e230b6Smaya         }
2010e230b6Smaya      }
2110e230b6Smaya      break;
2210e230b6Smaya
2310e230b6Smaya   case ir_unop_logic_not:
2410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
2510e230b6Smaya         switch (op[0]->type->base_type) {
2610e230b6Smaya         case GLSL_TYPE_BOOL:
2710e230b6Smaya            data.b[c] = !op[0]->value.b[c];
2810e230b6Smaya            break;
2910e230b6Smaya         default:
3010e230b6Smaya            unreachable("invalid type");
3110e230b6Smaya         }
3210e230b6Smaya      }
3310e230b6Smaya      break;
3410e230b6Smaya
3510e230b6Smaya   case ir_unop_neg:
3610e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
3710e230b6Smaya         switch (op[0]->type->base_type) {
3810e230b6Smaya         case GLSL_TYPE_UINT:
3910e230b6Smaya            data.u[c] = -((int) op[0]->value.u[c]);
4010e230b6Smaya            break;
4110e230b6Smaya         case GLSL_TYPE_INT:
4210e230b6Smaya            data.i[c] = -op[0]->value.i[c];
4310e230b6Smaya            break;
4410e230b6Smaya         case GLSL_TYPE_FLOAT:
4510e230b6Smaya            data.f[c] = -op[0]->value.f[c];
4610e230b6Smaya            break;
4710e230b6Smaya         case GLSL_TYPE_DOUBLE:
4810e230b6Smaya            data.d[c] = -op[0]->value.d[c];
4910e230b6Smaya            break;
5010e230b6Smaya         case GLSL_TYPE_UINT64:
5196c5ddc4Srjs            data.u64[c] = -((int64_t) op[0]->value.u64[c]);
5210e230b6Smaya            break;
5310e230b6Smaya         case GLSL_TYPE_INT64:
5410e230b6Smaya            data.i64[c] = -op[0]->value.i64[c];
5510e230b6Smaya            break;
5610e230b6Smaya         default:
5710e230b6Smaya            unreachable("invalid type");
5810e230b6Smaya         }
5910e230b6Smaya      }
6010e230b6Smaya      break;
6110e230b6Smaya
6210e230b6Smaya   case ir_unop_abs:
6310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
6410e230b6Smaya         switch (op[0]->type->base_type) {
6510e230b6Smaya         case GLSL_TYPE_INT:
6610e230b6Smaya            data.i[c] = op[0]->value.i[c] < 0 ? -op[0]->value.i[c] : op[0]->value.i[c];
6710e230b6Smaya            break;
6810e230b6Smaya         case GLSL_TYPE_FLOAT:
6910e230b6Smaya            data.f[c] = fabsf(op[0]->value.f[c]);
7010e230b6Smaya            break;
7110e230b6Smaya         case GLSL_TYPE_DOUBLE:
7210e230b6Smaya            data.d[c] = fabs(op[0]->value.d[c]);
7310e230b6Smaya            break;
7410e230b6Smaya         case GLSL_TYPE_INT64:
7510e230b6Smaya            data.i64[c] = op[0]->value.i64[c] < 0 ? -op[0]->value.i64[c] : op[0]->value.i64[c];
7610e230b6Smaya            break;
7710e230b6Smaya         default:
7810e230b6Smaya            unreachable("invalid type");
7910e230b6Smaya         }
8010e230b6Smaya      }
8110e230b6Smaya      break;
8210e230b6Smaya
8310e230b6Smaya   case ir_unop_sign:
8410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
8510e230b6Smaya         switch (op[0]->type->base_type) {
8610e230b6Smaya         case GLSL_TYPE_INT:
8710e230b6Smaya            data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0);
8810e230b6Smaya            break;
8910e230b6Smaya         case GLSL_TYPE_FLOAT:
9010e230b6Smaya            data.f[c] = float((op[0]->value.f[c] > 0.0F) - (op[0]->value.f[c] < 0.0F));
9110e230b6Smaya            break;
9210e230b6Smaya         case GLSL_TYPE_DOUBLE:
9310e230b6Smaya            data.d[c] = double((op[0]->value.d[c] > 0.0) - (op[0]->value.d[c] < 0.0));
9410e230b6Smaya            break;
9510e230b6Smaya         case GLSL_TYPE_INT64:
9610e230b6Smaya            data.i64[c] = (op[0]->value.i64[c] > 0) - (op[0]->value.i64[c] < 0);
9710e230b6Smaya            break;
9810e230b6Smaya         default:
9910e230b6Smaya            unreachable("invalid type");
10010e230b6Smaya         }
10110e230b6Smaya      }
10210e230b6Smaya      break;
10310e230b6Smaya
10410e230b6Smaya   case ir_unop_rcp:
10510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
10610e230b6Smaya         switch (op[0]->type->base_type) {
10710e230b6Smaya         case GLSL_TYPE_FLOAT:
10810e230b6Smaya            data.f[c] = 1.0F / op[0]->value.f[c];
10910e230b6Smaya            break;
11010e230b6Smaya         case GLSL_TYPE_DOUBLE:
11110e230b6Smaya            data.d[c] = 1.0 / op[0]->value.d[c];
11210e230b6Smaya            break;
11310e230b6Smaya         default:
11410e230b6Smaya            unreachable("invalid type");
11510e230b6Smaya         }
11610e230b6Smaya      }
11710e230b6Smaya      break;
11810e230b6Smaya
11910e230b6Smaya   case ir_unop_rsq:
12010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
12110e230b6Smaya         switch (op[0]->type->base_type) {
12210e230b6Smaya         case GLSL_TYPE_FLOAT:
12310e230b6Smaya            data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]);
12410e230b6Smaya            break;
12510e230b6Smaya         case GLSL_TYPE_DOUBLE:
12610e230b6Smaya            data.d[c] = 1.0 / sqrt(op[0]->value.d[c]);
12710e230b6Smaya            break;
12810e230b6Smaya         default:
12910e230b6Smaya            unreachable("invalid type");
13010e230b6Smaya         }
13110e230b6Smaya      }
13210e230b6Smaya      break;
13310e230b6Smaya
13410e230b6Smaya   case ir_unop_sqrt:
13510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
13610e230b6Smaya         switch (op[0]->type->base_type) {
13710e230b6Smaya         case GLSL_TYPE_FLOAT:
13810e230b6Smaya            data.f[c] = sqrtf(op[0]->value.f[c]);
13910e230b6Smaya            break;
14010e230b6Smaya         case GLSL_TYPE_DOUBLE:
14110e230b6Smaya            data.d[c] = sqrt(op[0]->value.d[c]);
14210e230b6Smaya            break;
14310e230b6Smaya         default:
14410e230b6Smaya            unreachable("invalid type");
14510e230b6Smaya         }
14610e230b6Smaya      }
14710e230b6Smaya      break;
14810e230b6Smaya
14910e230b6Smaya   case ir_unop_exp:
15010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
15110e230b6Smaya         switch (op[0]->type->base_type) {
15210e230b6Smaya         case GLSL_TYPE_FLOAT:
15310e230b6Smaya            data.f[c] = expf(op[0]->value.f[c]);
15410e230b6Smaya            break;
15510e230b6Smaya         default:
15610e230b6Smaya            unreachable("invalid type");
15710e230b6Smaya         }
15810e230b6Smaya      }
15910e230b6Smaya      break;
16010e230b6Smaya
16110e230b6Smaya   case ir_unop_log:
16210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
16310e230b6Smaya         switch (op[0]->type->base_type) {
16410e230b6Smaya         case GLSL_TYPE_FLOAT:
16510e230b6Smaya            data.f[c] = logf(op[0]->value.f[c]);
16610e230b6Smaya            break;
16710e230b6Smaya         default:
16810e230b6Smaya            unreachable("invalid type");
16910e230b6Smaya         }
17010e230b6Smaya      }
17110e230b6Smaya      break;
17210e230b6Smaya
17310e230b6Smaya   case ir_unop_exp2:
17410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
17510e230b6Smaya         switch (op[0]->type->base_type) {
17610e230b6Smaya         case GLSL_TYPE_FLOAT:
17710e230b6Smaya            data.f[c] = exp2f(op[0]->value.f[c]);
17810e230b6Smaya            break;
17910e230b6Smaya         default:
18010e230b6Smaya            unreachable("invalid type");
18110e230b6Smaya         }
18210e230b6Smaya      }
18310e230b6Smaya      break;
18410e230b6Smaya
18510e230b6Smaya   case ir_unop_log2:
18610e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
18710e230b6Smaya         switch (op[0]->type->base_type) {
18810e230b6Smaya         case GLSL_TYPE_FLOAT:
18910e230b6Smaya            data.f[c] = log2f(op[0]->value.f[c]);
19010e230b6Smaya            break;
19110e230b6Smaya         default:
19210e230b6Smaya            unreachable("invalid type");
19310e230b6Smaya         }
19410e230b6Smaya      }
19510e230b6Smaya      break;
19610e230b6Smaya
19710e230b6Smaya   case ir_unop_f2i:
19810e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
19910e230b6Smaya         switch (op[0]->type->base_type) {
20010e230b6Smaya         case GLSL_TYPE_FLOAT:
20110e230b6Smaya            data.i[c] = (int) op[0]->value.f[c];
20210e230b6Smaya            break;
20310e230b6Smaya         default:
20410e230b6Smaya            unreachable("invalid type");
20510e230b6Smaya         }
20610e230b6Smaya      }
20710e230b6Smaya      break;
20810e230b6Smaya
20910e230b6Smaya   case ir_unop_f2u:
21010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
21110e230b6Smaya         switch (op[0]->type->base_type) {
21210e230b6Smaya         case GLSL_TYPE_FLOAT:
21310e230b6Smaya            data.u[c] = (unsigned) op[0]->value.f[c];
21410e230b6Smaya            break;
21510e230b6Smaya         default:
21610e230b6Smaya            unreachable("invalid type");
21710e230b6Smaya         }
21810e230b6Smaya      }
21910e230b6Smaya      break;
22010e230b6Smaya
22110e230b6Smaya   case ir_unop_i2f:
22210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
22310e230b6Smaya         switch (op[0]->type->base_type) {
22410e230b6Smaya         case GLSL_TYPE_INT:
22510e230b6Smaya            data.f[c] = (float) op[0]->value.i[c];
22610e230b6Smaya            break;
22710e230b6Smaya         default:
22810e230b6Smaya            unreachable("invalid type");
22910e230b6Smaya         }
23010e230b6Smaya      }
23110e230b6Smaya      break;
23210e230b6Smaya
23310e230b6Smaya   case ir_unop_f2b:
23410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
23510e230b6Smaya         switch (op[0]->type->base_type) {
23610e230b6Smaya         case GLSL_TYPE_FLOAT:
23710e230b6Smaya            data.b[c] = op[0]->value.f[c] != 0.0F ? true : false;
23810e230b6Smaya            break;
23910e230b6Smaya         default:
24010e230b6Smaya            unreachable("invalid type");
24110e230b6Smaya         }
24210e230b6Smaya      }
24310e230b6Smaya      break;
24410e230b6Smaya
24510e230b6Smaya   case ir_unop_b2f:
24610e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
24710e230b6Smaya         switch (op[0]->type->base_type) {
24810e230b6Smaya         case GLSL_TYPE_BOOL:
24910e230b6Smaya            data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F;
25010e230b6Smaya            break;
25110e230b6Smaya         default:
25210e230b6Smaya            unreachable("invalid type");
25310e230b6Smaya         }
25410e230b6Smaya      }
25510e230b6Smaya      break;
25610e230b6Smaya
25796c5ddc4Srjs   case ir_unop_b2f16:
25896c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
25996c5ddc4Srjs         switch (op[0]->type->base_type) {
26096c5ddc4Srjs         case GLSL_TYPE_BOOL:
26196c5ddc4Srjs            data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F;
26296c5ddc4Srjs            break;
26396c5ddc4Srjs         default:
26496c5ddc4Srjs            unreachable("invalid type");
26596c5ddc4Srjs         }
26696c5ddc4Srjs      }
26796c5ddc4Srjs      break;
26896c5ddc4Srjs
26910e230b6Smaya   case ir_unop_i2b:
27010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
27110e230b6Smaya         switch (op[0]->type->base_type) {
27210e230b6Smaya         case GLSL_TYPE_UINT:
27310e230b6Smaya            data.b[c] = op[0]->value.u[c] ? true : false;
27410e230b6Smaya            break;
27510e230b6Smaya         case GLSL_TYPE_INT:
27610e230b6Smaya            data.b[c] = op[0]->value.i[c] ? true : false;
27710e230b6Smaya            break;
27810e230b6Smaya         default:
27910e230b6Smaya            unreachable("invalid type");
28010e230b6Smaya         }
28110e230b6Smaya      }
28210e230b6Smaya      break;
28310e230b6Smaya
28410e230b6Smaya   case ir_unop_b2i:
28510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
28610e230b6Smaya         switch (op[0]->type->base_type) {
28710e230b6Smaya         case GLSL_TYPE_BOOL:
28810e230b6Smaya            data.i[c] = op[0]->value.b[c] ? 1 : 0;
28910e230b6Smaya            break;
29010e230b6Smaya         default:
29110e230b6Smaya            unreachable("invalid type");
29210e230b6Smaya         }
29310e230b6Smaya      }
29410e230b6Smaya      break;
29510e230b6Smaya
29610e230b6Smaya   case ir_unop_u2f:
29710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
29810e230b6Smaya         switch (op[0]->type->base_type) {
29910e230b6Smaya         case GLSL_TYPE_UINT:
30010e230b6Smaya            data.f[c] = (float) op[0]->value.u[c];
30110e230b6Smaya            break;
30210e230b6Smaya         default:
30310e230b6Smaya            unreachable("invalid type");
30410e230b6Smaya         }
30510e230b6Smaya      }
30610e230b6Smaya      break;
30710e230b6Smaya
30810e230b6Smaya   case ir_unop_i2u:
30910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
31010e230b6Smaya         switch (op[0]->type->base_type) {
31110e230b6Smaya         case GLSL_TYPE_INT:
31210e230b6Smaya            data.u[c] = op[0]->value.i[c];
31310e230b6Smaya            break;
31410e230b6Smaya         default:
31510e230b6Smaya            unreachable("invalid type");
31610e230b6Smaya         }
31710e230b6Smaya      }
31810e230b6Smaya      break;
31910e230b6Smaya
32010e230b6Smaya   case ir_unop_u2i:
32110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
32210e230b6Smaya         switch (op[0]->type->base_type) {
32310e230b6Smaya         case GLSL_TYPE_UINT:
32410e230b6Smaya            data.i[c] = op[0]->value.u[c];
32510e230b6Smaya            break;
32610e230b6Smaya         default:
32710e230b6Smaya            unreachable("invalid type");
32810e230b6Smaya         }
32910e230b6Smaya      }
33010e230b6Smaya      break;
33110e230b6Smaya
33210e230b6Smaya   case ir_unop_d2f:
33310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
33410e230b6Smaya         switch (op[0]->type->base_type) {
33510e230b6Smaya         case GLSL_TYPE_DOUBLE:
33610e230b6Smaya            data.f[c] = op[0]->value.d[c];
33710e230b6Smaya            break;
33810e230b6Smaya         default:
33910e230b6Smaya            unreachable("invalid type");
34010e230b6Smaya         }
34110e230b6Smaya      }
34210e230b6Smaya      break;
34310e230b6Smaya
34410e230b6Smaya   case ir_unop_f2d:
34510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
34610e230b6Smaya         switch (op[0]->type->base_type) {
34710e230b6Smaya         case GLSL_TYPE_FLOAT:
34810e230b6Smaya            data.d[c] = op[0]->value.f[c];
34910e230b6Smaya            break;
35010e230b6Smaya         default:
35110e230b6Smaya            unreachable("invalid type");
35210e230b6Smaya         }
35310e230b6Smaya      }
35410e230b6Smaya      break;
35510e230b6Smaya
35696c5ddc4Srjs   case ir_unop_f2f16:
35796c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
35896c5ddc4Srjs         switch (op[0]->type->base_type) {
35996c5ddc4Srjs         case GLSL_TYPE_FLOAT:
36096c5ddc4Srjs            data.f[c] = op[0]->value.f[c];
36196c5ddc4Srjs            break;
36296c5ddc4Srjs         default:
36396c5ddc4Srjs            unreachable("invalid type");
36496c5ddc4Srjs         }
36596c5ddc4Srjs      }
36696c5ddc4Srjs      break;
36796c5ddc4Srjs
36896c5ddc4Srjs   case ir_unop_f2fmp:
36996c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
37096c5ddc4Srjs         switch (op[0]->type->base_type) {
37196c5ddc4Srjs         case GLSL_TYPE_FLOAT:
37296c5ddc4Srjs            data.f[c] = op[0]->value.f[c];
37396c5ddc4Srjs            break;
37496c5ddc4Srjs         default:
37596c5ddc4Srjs            unreachable("invalid type");
37696c5ddc4Srjs         }
37796c5ddc4Srjs      }
37896c5ddc4Srjs      break;
37996c5ddc4Srjs
38096c5ddc4Srjs   case ir_unop_f162f:
38196c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
38296c5ddc4Srjs         switch (op[0]->type->base_type) {
38396c5ddc4Srjs         case GLSL_TYPE_FLOAT:
38496c5ddc4Srjs            data.f[c] = op[0]->value.f[c];
38596c5ddc4Srjs            break;
38696c5ddc4Srjs         default:
38796c5ddc4Srjs            unreachable("invalid type");
38896c5ddc4Srjs         }
38996c5ddc4Srjs      }
39096c5ddc4Srjs      break;
39196c5ddc4Srjs
39296c5ddc4Srjs   case ir_unop_i2i:
39396c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
39496c5ddc4Srjs         switch (op[0]->type->base_type) {
39596c5ddc4Srjs         case GLSL_TYPE_INT:
39696c5ddc4Srjs            data.i[c] = op[0]->value.i[c];
39796c5ddc4Srjs            break;
39896c5ddc4Srjs         default:
39996c5ddc4Srjs            unreachable("invalid type");
40096c5ddc4Srjs         }
40196c5ddc4Srjs      }
40296c5ddc4Srjs      break;
40396c5ddc4Srjs
40496c5ddc4Srjs   case ir_unop_i2imp:
40596c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
40696c5ddc4Srjs         switch (op[0]->type->base_type) {
40796c5ddc4Srjs         case GLSL_TYPE_INT:
40896c5ddc4Srjs            data.i[c] = op[0]->value.i[c];
40996c5ddc4Srjs            break;
41096c5ddc4Srjs         default:
41196c5ddc4Srjs            unreachable("invalid type");
41296c5ddc4Srjs         }
41396c5ddc4Srjs      }
41496c5ddc4Srjs      break;
41596c5ddc4Srjs
41696c5ddc4Srjs   case ir_unop_u2u:
41796c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
41896c5ddc4Srjs         switch (op[0]->type->base_type) {
41996c5ddc4Srjs         case GLSL_TYPE_UINT:
42096c5ddc4Srjs            data.u[c] = op[0]->value.u[c];
42196c5ddc4Srjs            break;
42296c5ddc4Srjs         default:
42396c5ddc4Srjs            unreachable("invalid type");
42496c5ddc4Srjs         }
42596c5ddc4Srjs      }
42696c5ddc4Srjs      break;
42796c5ddc4Srjs
42896c5ddc4Srjs   case ir_unop_u2ump:
42996c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
43096c5ddc4Srjs         switch (op[0]->type->base_type) {
43196c5ddc4Srjs         case GLSL_TYPE_UINT:
43296c5ddc4Srjs            data.u[c] = op[0]->value.u[c];
43396c5ddc4Srjs            break;
43496c5ddc4Srjs         default:
43596c5ddc4Srjs            unreachable("invalid type");
43696c5ddc4Srjs         }
43796c5ddc4Srjs      }
43896c5ddc4Srjs      break;
43996c5ddc4Srjs
44010e230b6Smaya   case ir_unop_d2i:
44110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
44210e230b6Smaya         switch (op[0]->type->base_type) {
44310e230b6Smaya         case GLSL_TYPE_DOUBLE:
44410e230b6Smaya            data.i[c] = op[0]->value.d[c];
44510e230b6Smaya            break;
44610e230b6Smaya         default:
44710e230b6Smaya            unreachable("invalid type");
44810e230b6Smaya         }
44910e230b6Smaya      }
45010e230b6Smaya      break;
45110e230b6Smaya
45210e230b6Smaya   case ir_unop_i2d:
45310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
45410e230b6Smaya         switch (op[0]->type->base_type) {
45510e230b6Smaya         case GLSL_TYPE_INT:
45610e230b6Smaya            data.d[c] = op[0]->value.i[c];
45710e230b6Smaya            break;
45810e230b6Smaya         default:
45910e230b6Smaya            unreachable("invalid type");
46010e230b6Smaya         }
46110e230b6Smaya      }
46210e230b6Smaya      break;
46310e230b6Smaya
46410e230b6Smaya   case ir_unop_d2u:
46510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
46610e230b6Smaya         switch (op[0]->type->base_type) {
46710e230b6Smaya         case GLSL_TYPE_DOUBLE:
46810e230b6Smaya            data.u[c] = op[0]->value.d[c];
46910e230b6Smaya            break;
47010e230b6Smaya         default:
47110e230b6Smaya            unreachable("invalid type");
47210e230b6Smaya         }
47310e230b6Smaya      }
47410e230b6Smaya      break;
47510e230b6Smaya
47610e230b6Smaya   case ir_unop_u2d:
47710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
47810e230b6Smaya         switch (op[0]->type->base_type) {
47910e230b6Smaya         case GLSL_TYPE_UINT:
48010e230b6Smaya            data.d[c] = op[0]->value.u[c];
48110e230b6Smaya            break;
48210e230b6Smaya         default:
48310e230b6Smaya            unreachable("invalid type");
48410e230b6Smaya         }
48510e230b6Smaya      }
48610e230b6Smaya      break;
48710e230b6Smaya
48810e230b6Smaya   case ir_unop_d2b:
48910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
49010e230b6Smaya         switch (op[0]->type->base_type) {
49110e230b6Smaya         case GLSL_TYPE_DOUBLE:
49210e230b6Smaya            data.b[c] = op[0]->value.d[c] != 0.0;
49310e230b6Smaya            break;
49410e230b6Smaya         default:
49510e230b6Smaya            unreachable("invalid type");
49610e230b6Smaya         }
49710e230b6Smaya      }
49810e230b6Smaya      break;
49910e230b6Smaya
50096c5ddc4Srjs   case ir_unop_f162b:
50196c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
50296c5ddc4Srjs         switch (op[0]->type->base_type) {
50396c5ddc4Srjs         case GLSL_TYPE_FLOAT:
50496c5ddc4Srjs            data.b[c] = op[0]->value.f[c] != 0.0;
50596c5ddc4Srjs            break;
50696c5ddc4Srjs         default:
50796c5ddc4Srjs            unreachable("invalid type");
50896c5ddc4Srjs         }
50996c5ddc4Srjs      }
51096c5ddc4Srjs      break;
51196c5ddc4Srjs
51210e230b6Smaya   case ir_unop_bitcast_i2f:
51310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
51410e230b6Smaya         switch (op[0]->type->base_type) {
51510e230b6Smaya         case GLSL_TYPE_INT:
51610e230b6Smaya            data.f[c] = bitcast_u2f(op[0]->value.i[c]);
51710e230b6Smaya            break;
51810e230b6Smaya         default:
51910e230b6Smaya            unreachable("invalid type");
52010e230b6Smaya         }
52110e230b6Smaya      }
52210e230b6Smaya      break;
52310e230b6Smaya
52410e230b6Smaya   case ir_unop_bitcast_f2i:
52510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
52610e230b6Smaya         switch (op[0]->type->base_type) {
52710e230b6Smaya         case GLSL_TYPE_FLOAT:
52810e230b6Smaya            data.i[c] = bitcast_f2u(op[0]->value.f[c]);
52910e230b6Smaya            break;
53010e230b6Smaya         default:
53110e230b6Smaya            unreachable("invalid type");
53210e230b6Smaya         }
53310e230b6Smaya      }
53410e230b6Smaya      break;
53510e230b6Smaya
53610e230b6Smaya   case ir_unop_bitcast_u2f:
53710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
53810e230b6Smaya         switch (op[0]->type->base_type) {
53910e230b6Smaya         case GLSL_TYPE_UINT:
54010e230b6Smaya            data.f[c] = bitcast_u2f(op[0]->value.u[c]);
54110e230b6Smaya            break;
54210e230b6Smaya         default:
54310e230b6Smaya            unreachable("invalid type");
54410e230b6Smaya         }
54510e230b6Smaya      }
54610e230b6Smaya      break;
54710e230b6Smaya
54810e230b6Smaya   case ir_unop_bitcast_f2u:
54910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
55010e230b6Smaya         switch (op[0]->type->base_type) {
55110e230b6Smaya         case GLSL_TYPE_FLOAT:
55210e230b6Smaya            data.u[c] = bitcast_f2u(op[0]->value.f[c]);
55310e230b6Smaya            break;
55410e230b6Smaya         default:
55510e230b6Smaya            unreachable("invalid type");
55610e230b6Smaya         }
55710e230b6Smaya      }
55810e230b6Smaya      break;
55910e230b6Smaya
56010e230b6Smaya   case ir_unop_bitcast_u642d:
56110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
56210e230b6Smaya         switch (op[0]->type->base_type) {
56310e230b6Smaya         case GLSL_TYPE_UINT64:
56410e230b6Smaya            data.d[c] = bitcast_u642d(op[0]->value.u64[c]);
56510e230b6Smaya            break;
56610e230b6Smaya         default:
56710e230b6Smaya            unreachable("invalid type");
56810e230b6Smaya         }
56910e230b6Smaya      }
57010e230b6Smaya      break;
57110e230b6Smaya
57210e230b6Smaya   case ir_unop_bitcast_i642d:
57310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
57410e230b6Smaya         switch (op[0]->type->base_type) {
57510e230b6Smaya         case GLSL_TYPE_INT64:
57610e230b6Smaya            data.d[c] = bitcast_i642d(op[0]->value.i64[c]);
57710e230b6Smaya            break;
57810e230b6Smaya         default:
57910e230b6Smaya            unreachable("invalid type");
58010e230b6Smaya         }
58110e230b6Smaya      }
58210e230b6Smaya      break;
58310e230b6Smaya
58410e230b6Smaya   case ir_unop_bitcast_d2u64:
58510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
58610e230b6Smaya         switch (op[0]->type->base_type) {
58710e230b6Smaya         case GLSL_TYPE_DOUBLE:
58810e230b6Smaya            data.u64[c] = bitcast_d2u64(op[0]->value.d[c]);
58910e230b6Smaya            break;
59010e230b6Smaya         default:
59110e230b6Smaya            unreachable("invalid type");
59210e230b6Smaya         }
59310e230b6Smaya      }
59410e230b6Smaya      break;
59510e230b6Smaya
59610e230b6Smaya   case ir_unop_bitcast_d2i64:
59710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
59810e230b6Smaya         switch (op[0]->type->base_type) {
59910e230b6Smaya         case GLSL_TYPE_DOUBLE:
60010e230b6Smaya            data.i64[c] = bitcast_d2i64(op[0]->value.d[c]);
60110e230b6Smaya            break;
60210e230b6Smaya         default:
60310e230b6Smaya            unreachable("invalid type");
60410e230b6Smaya         }
60510e230b6Smaya      }
60610e230b6Smaya      break;
60710e230b6Smaya
60810e230b6Smaya   case ir_unop_i642i:
60910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
61010e230b6Smaya         switch (op[0]->type->base_type) {
61110e230b6Smaya         case GLSL_TYPE_INT64:
61210e230b6Smaya            data.i[c] = op[0]->value.i64[c];
61310e230b6Smaya            break;
61410e230b6Smaya         default:
61510e230b6Smaya            unreachable("invalid type");
61610e230b6Smaya         }
61710e230b6Smaya      }
61810e230b6Smaya      break;
61910e230b6Smaya
62010e230b6Smaya   case ir_unop_u642i:
62110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
62210e230b6Smaya         switch (op[0]->type->base_type) {
62310e230b6Smaya         case GLSL_TYPE_UINT64:
62410e230b6Smaya            data.i[c] = op[0]->value.u64[c];
62510e230b6Smaya            break;
62610e230b6Smaya         default:
62710e230b6Smaya            unreachable("invalid type");
62810e230b6Smaya         }
62910e230b6Smaya      }
63010e230b6Smaya      break;
63110e230b6Smaya
63210e230b6Smaya   case ir_unop_i642u:
63310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
63410e230b6Smaya         switch (op[0]->type->base_type) {
63510e230b6Smaya         case GLSL_TYPE_INT64:
63610e230b6Smaya            data.u[c] = op[0]->value.i64[c];
63710e230b6Smaya            break;
63810e230b6Smaya         default:
63910e230b6Smaya            unreachable("invalid type");
64010e230b6Smaya         }
64110e230b6Smaya      }
64210e230b6Smaya      break;
64310e230b6Smaya
64410e230b6Smaya   case ir_unop_u642u:
64510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
64610e230b6Smaya         switch (op[0]->type->base_type) {
64710e230b6Smaya         case GLSL_TYPE_UINT64:
64810e230b6Smaya            data.u[c] = op[0]->value.u64[c];
64910e230b6Smaya            break;
65010e230b6Smaya         default:
65110e230b6Smaya            unreachable("invalid type");
65210e230b6Smaya         }
65310e230b6Smaya      }
65410e230b6Smaya      break;
65510e230b6Smaya
65610e230b6Smaya   case ir_unop_i642b:
65710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
65810e230b6Smaya         switch (op[0]->type->base_type) {
65910e230b6Smaya         case GLSL_TYPE_INT64:
66010e230b6Smaya            data.b[c] = op[0]->value.i64[c] != 0;
66110e230b6Smaya            break;
66210e230b6Smaya         default:
66310e230b6Smaya            unreachable("invalid type");
66410e230b6Smaya         }
66510e230b6Smaya      }
66610e230b6Smaya      break;
66710e230b6Smaya
66810e230b6Smaya   case ir_unop_i642f:
66910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
67010e230b6Smaya         switch (op[0]->type->base_type) {
67110e230b6Smaya         case GLSL_TYPE_INT64:
67210e230b6Smaya            data.f[c] = op[0]->value.i64[c];
67310e230b6Smaya            break;
67410e230b6Smaya         default:
67510e230b6Smaya            unreachable("invalid type");
67610e230b6Smaya         }
67710e230b6Smaya      }
67810e230b6Smaya      break;
67910e230b6Smaya
68010e230b6Smaya   case ir_unop_u642f:
68110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
68210e230b6Smaya         switch (op[0]->type->base_type) {
68310e230b6Smaya         case GLSL_TYPE_UINT64:
68410e230b6Smaya            data.f[c] = op[0]->value.u64[c];
68510e230b6Smaya            break;
68610e230b6Smaya         default:
68710e230b6Smaya            unreachable("invalid type");
68810e230b6Smaya         }
68910e230b6Smaya      }
69010e230b6Smaya      break;
69110e230b6Smaya
69210e230b6Smaya   case ir_unop_i642d:
69310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
69410e230b6Smaya         switch (op[0]->type->base_type) {
69510e230b6Smaya         case GLSL_TYPE_INT64:
69610e230b6Smaya            data.d[c] = op[0]->value.i64[c];
69710e230b6Smaya            break;
69810e230b6Smaya         default:
69910e230b6Smaya            unreachable("invalid type");
70010e230b6Smaya         }
70110e230b6Smaya      }
70210e230b6Smaya      break;
70310e230b6Smaya
70410e230b6Smaya   case ir_unop_u642d:
70510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
70610e230b6Smaya         switch (op[0]->type->base_type) {
70710e230b6Smaya         case GLSL_TYPE_UINT64:
70810e230b6Smaya            data.d[c] = op[0]->value.u64[c];
70910e230b6Smaya            break;
71010e230b6Smaya         default:
71110e230b6Smaya            unreachable("invalid type");
71210e230b6Smaya         }
71310e230b6Smaya      }
71410e230b6Smaya      break;
71510e230b6Smaya
71610e230b6Smaya   case ir_unop_i2i64:
71710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
71810e230b6Smaya         switch (op[0]->type->base_type) {
71910e230b6Smaya         case GLSL_TYPE_INT:
72010e230b6Smaya            data.i64[c] = op[0]->value.i[c];
72110e230b6Smaya            break;
72210e230b6Smaya         default:
72310e230b6Smaya            unreachable("invalid type");
72410e230b6Smaya         }
72510e230b6Smaya      }
72610e230b6Smaya      break;
72710e230b6Smaya
72810e230b6Smaya   case ir_unop_u2i64:
72910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
73010e230b6Smaya         switch (op[0]->type->base_type) {
73110e230b6Smaya         case GLSL_TYPE_UINT:
73210e230b6Smaya            data.i64[c] = op[0]->value.u[c];
73310e230b6Smaya            break;
73410e230b6Smaya         default:
73510e230b6Smaya            unreachable("invalid type");
73610e230b6Smaya         }
73710e230b6Smaya      }
73810e230b6Smaya      break;
73910e230b6Smaya
74010e230b6Smaya   case ir_unop_b2i64:
74110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
74210e230b6Smaya         switch (op[0]->type->base_type) {
74310e230b6Smaya         case GLSL_TYPE_BOOL:
74410e230b6Smaya            data.i64[c] = op[0]->value.b[c];
74510e230b6Smaya            break;
74610e230b6Smaya         default:
74710e230b6Smaya            unreachable("invalid type");
74810e230b6Smaya         }
74910e230b6Smaya      }
75010e230b6Smaya      break;
75110e230b6Smaya
75210e230b6Smaya   case ir_unop_f2i64:
75310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
75410e230b6Smaya         switch (op[0]->type->base_type) {
75510e230b6Smaya         case GLSL_TYPE_FLOAT:
75610e230b6Smaya            data.i64[c] = op[0]->value.f[c];
75710e230b6Smaya            break;
75810e230b6Smaya         default:
75910e230b6Smaya            unreachable("invalid type");
76010e230b6Smaya         }
76110e230b6Smaya      }
76210e230b6Smaya      break;
76310e230b6Smaya
76410e230b6Smaya   case ir_unop_d2i64:
76510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
76610e230b6Smaya         switch (op[0]->type->base_type) {
76710e230b6Smaya         case GLSL_TYPE_DOUBLE:
76810e230b6Smaya            data.i64[c] = op[0]->value.d[c];
76910e230b6Smaya            break;
77010e230b6Smaya         default:
77110e230b6Smaya            unreachable("invalid type");
77210e230b6Smaya         }
77310e230b6Smaya      }
77410e230b6Smaya      break;
77510e230b6Smaya
77610e230b6Smaya   case ir_unop_i2u64:
77710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
77810e230b6Smaya         switch (op[0]->type->base_type) {
77910e230b6Smaya         case GLSL_TYPE_INT:
78010e230b6Smaya            data.u64[c] = op[0]->value.i[c];
78110e230b6Smaya            break;
78210e230b6Smaya         default:
78310e230b6Smaya            unreachable("invalid type");
78410e230b6Smaya         }
78510e230b6Smaya      }
78610e230b6Smaya      break;
78710e230b6Smaya
78810e230b6Smaya   case ir_unop_u2u64:
78910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
79010e230b6Smaya         switch (op[0]->type->base_type) {
79110e230b6Smaya         case GLSL_TYPE_UINT:
79210e230b6Smaya            data.u64[c] = op[0]->value.u[c];
79310e230b6Smaya            break;
79410e230b6Smaya         default:
79510e230b6Smaya            unreachable("invalid type");
79610e230b6Smaya         }
79710e230b6Smaya      }
79810e230b6Smaya      break;
79910e230b6Smaya
80010e230b6Smaya   case ir_unop_f2u64:
80110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
80210e230b6Smaya         switch (op[0]->type->base_type) {
80310e230b6Smaya         case GLSL_TYPE_FLOAT:
80410e230b6Smaya            data.u64[c] = op[0]->value.f[c];
80510e230b6Smaya            break;
80610e230b6Smaya         default:
80710e230b6Smaya            unreachable("invalid type");
80810e230b6Smaya         }
80910e230b6Smaya      }
81010e230b6Smaya      break;
81110e230b6Smaya
81210e230b6Smaya   case ir_unop_d2u64:
81310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
81410e230b6Smaya         switch (op[0]->type->base_type) {
81510e230b6Smaya         case GLSL_TYPE_DOUBLE:
81610e230b6Smaya            data.u64[c] = op[0]->value.d[c];
81710e230b6Smaya            break;
81810e230b6Smaya         default:
81910e230b6Smaya            unreachable("invalid type");
82010e230b6Smaya         }
82110e230b6Smaya      }
82210e230b6Smaya      break;
82310e230b6Smaya
82410e230b6Smaya   case ir_unop_u642i64:
82510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
82610e230b6Smaya         switch (op[0]->type->base_type) {
82710e230b6Smaya         case GLSL_TYPE_UINT64:
82810e230b6Smaya            data.i64[c] = op[0]->value.u64[c];
82910e230b6Smaya            break;
83010e230b6Smaya         default:
83110e230b6Smaya            unreachable("invalid type");
83210e230b6Smaya         }
83310e230b6Smaya      }
83410e230b6Smaya      break;
83510e230b6Smaya
83610e230b6Smaya   case ir_unop_i642u64:
83710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
83810e230b6Smaya         switch (op[0]->type->base_type) {
83910e230b6Smaya         case GLSL_TYPE_INT64:
84010e230b6Smaya            data.u64[c] = op[0]->value.i64[c];
84110e230b6Smaya            break;
84210e230b6Smaya         default:
84310e230b6Smaya            unreachable("invalid type");
84410e230b6Smaya         }
84510e230b6Smaya      }
84610e230b6Smaya      break;
84710e230b6Smaya
84810e230b6Smaya   case ir_unop_trunc:
84910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
85010e230b6Smaya         switch (op[0]->type->base_type) {
85110e230b6Smaya         case GLSL_TYPE_FLOAT:
85210e230b6Smaya            data.f[c] = truncf(op[0]->value.f[c]);
85310e230b6Smaya            break;
85410e230b6Smaya         case GLSL_TYPE_DOUBLE:
85510e230b6Smaya            data.d[c] = trunc(op[0]->value.d[c]);
85610e230b6Smaya            break;
85710e230b6Smaya         default:
85810e230b6Smaya            unreachable("invalid type");
85910e230b6Smaya         }
86010e230b6Smaya      }
86110e230b6Smaya      break;
86210e230b6Smaya
86310e230b6Smaya   case ir_unop_ceil:
86410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
86510e230b6Smaya         switch (op[0]->type->base_type) {
86610e230b6Smaya         case GLSL_TYPE_FLOAT:
86710e230b6Smaya            data.f[c] = ceilf(op[0]->value.f[c]);
86810e230b6Smaya            break;
86910e230b6Smaya         case GLSL_TYPE_DOUBLE:
87010e230b6Smaya            data.d[c] = ceil(op[0]->value.d[c]);
87110e230b6Smaya            break;
87210e230b6Smaya         default:
87310e230b6Smaya            unreachable("invalid type");
87410e230b6Smaya         }
87510e230b6Smaya      }
87610e230b6Smaya      break;
87710e230b6Smaya
87810e230b6Smaya   case ir_unop_floor:
87910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
88010e230b6Smaya         switch (op[0]->type->base_type) {
88110e230b6Smaya         case GLSL_TYPE_FLOAT:
88210e230b6Smaya            data.f[c] = floorf(op[0]->value.f[c]);
88310e230b6Smaya            break;
88410e230b6Smaya         case GLSL_TYPE_DOUBLE:
88510e230b6Smaya            data.d[c] = floor(op[0]->value.d[c]);
88610e230b6Smaya            break;
88710e230b6Smaya         default:
88810e230b6Smaya            unreachable("invalid type");
88910e230b6Smaya         }
89010e230b6Smaya      }
89110e230b6Smaya      break;
89210e230b6Smaya
89310e230b6Smaya   case ir_unop_fract:
89410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
89510e230b6Smaya         switch (op[0]->type->base_type) {
89610e230b6Smaya         case GLSL_TYPE_FLOAT:
89710e230b6Smaya            data.f[c] = op[0]->value.f[c] - floorf(op[0]->value.f[c]);
89810e230b6Smaya            break;
89910e230b6Smaya         case GLSL_TYPE_DOUBLE:
90010e230b6Smaya            data.d[c] = op[0]->value.d[c] - floor(op[0]->value.d[c]);
90110e230b6Smaya            break;
90210e230b6Smaya         default:
90310e230b6Smaya            unreachable("invalid type");
90410e230b6Smaya         }
90510e230b6Smaya      }
90610e230b6Smaya      break;
90710e230b6Smaya
90810e230b6Smaya   case ir_unop_round_even:
90910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
91010e230b6Smaya         switch (op[0]->type->base_type) {
91110e230b6Smaya         case GLSL_TYPE_FLOAT:
91210e230b6Smaya            data.f[c] = _mesa_roundevenf(op[0]->value.f[c]);
91310e230b6Smaya            break;
91410e230b6Smaya         case GLSL_TYPE_DOUBLE:
91510e230b6Smaya            data.d[c] = _mesa_roundeven(op[0]->value.d[c]);
91610e230b6Smaya            break;
91710e230b6Smaya         default:
91810e230b6Smaya            unreachable("invalid type");
91910e230b6Smaya         }
92010e230b6Smaya      }
92110e230b6Smaya      break;
92210e230b6Smaya
92310e230b6Smaya   case ir_unop_sin:
92410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
92510e230b6Smaya         switch (op[0]->type->base_type) {
92610e230b6Smaya         case GLSL_TYPE_FLOAT:
92710e230b6Smaya            data.f[c] = sinf(op[0]->value.f[c]);
92810e230b6Smaya            break;
92910e230b6Smaya         default:
93010e230b6Smaya            unreachable("invalid type");
93110e230b6Smaya         }
93210e230b6Smaya      }
93310e230b6Smaya      break;
93410e230b6Smaya
93510e230b6Smaya   case ir_unop_cos:
93610e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
93710e230b6Smaya         switch (op[0]->type->base_type) {
93810e230b6Smaya         case GLSL_TYPE_FLOAT:
93910e230b6Smaya            data.f[c] = cosf(op[0]->value.f[c]);
94010e230b6Smaya            break;
94110e230b6Smaya         default:
94210e230b6Smaya            unreachable("invalid type");
94310e230b6Smaya         }
94410e230b6Smaya      }
94510e230b6Smaya      break;
94610e230b6Smaya
94796c5ddc4Srjs   case ir_unop_atan:
94896c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
94996c5ddc4Srjs         switch (op[0]->type->base_type) {
95096c5ddc4Srjs         case GLSL_TYPE_FLOAT:
95196c5ddc4Srjs            data.f[c] = atan(op[0]->value.f[c]);
95296c5ddc4Srjs            break;
95396c5ddc4Srjs         default:
95496c5ddc4Srjs            unreachable("invalid type");
95596c5ddc4Srjs         }
95696c5ddc4Srjs      }
95796c5ddc4Srjs      break;
95896c5ddc4Srjs
95910e230b6Smaya   case ir_unop_dFdx:
96010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
96110e230b6Smaya         switch (op[0]->type->base_type) {
96210e230b6Smaya         case GLSL_TYPE_FLOAT:
96310e230b6Smaya            data.f[c] = 0.0f;
96410e230b6Smaya            break;
96510e230b6Smaya         default:
96610e230b6Smaya            unreachable("invalid type");
96710e230b6Smaya         }
96810e230b6Smaya      }
96910e230b6Smaya      break;
97010e230b6Smaya
97110e230b6Smaya   case ir_unop_dFdx_coarse:
97210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
97310e230b6Smaya         switch (op[0]->type->base_type) {
97410e230b6Smaya         case GLSL_TYPE_FLOAT:
97510e230b6Smaya            data.f[c] = 0.0f;
97610e230b6Smaya            break;
97710e230b6Smaya         default:
97810e230b6Smaya            unreachable("invalid type");
97910e230b6Smaya         }
98010e230b6Smaya      }
98110e230b6Smaya      break;
98210e230b6Smaya
98310e230b6Smaya   case ir_unop_dFdx_fine:
98410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
98510e230b6Smaya         switch (op[0]->type->base_type) {
98610e230b6Smaya         case GLSL_TYPE_FLOAT:
98710e230b6Smaya            data.f[c] = 0.0f;
98810e230b6Smaya            break;
98910e230b6Smaya         default:
99010e230b6Smaya            unreachable("invalid type");
99110e230b6Smaya         }
99210e230b6Smaya      }
99310e230b6Smaya      break;
99410e230b6Smaya
99510e230b6Smaya   case ir_unop_dFdy:
99610e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
99710e230b6Smaya         switch (op[0]->type->base_type) {
99810e230b6Smaya         case GLSL_TYPE_FLOAT:
99910e230b6Smaya            data.f[c] = 0.0f;
100010e230b6Smaya            break;
100110e230b6Smaya         default:
100210e230b6Smaya            unreachable("invalid type");
100310e230b6Smaya         }
100410e230b6Smaya      }
100510e230b6Smaya      break;
100610e230b6Smaya
100710e230b6Smaya   case ir_unop_dFdy_coarse:
100810e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
100910e230b6Smaya         switch (op[0]->type->base_type) {
101010e230b6Smaya         case GLSL_TYPE_FLOAT:
101110e230b6Smaya            data.f[c] = 0.0f;
101210e230b6Smaya            break;
101310e230b6Smaya         default:
101410e230b6Smaya            unreachable("invalid type");
101510e230b6Smaya         }
101610e230b6Smaya      }
101710e230b6Smaya      break;
101810e230b6Smaya
101910e230b6Smaya   case ir_unop_dFdy_fine:
102010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
102110e230b6Smaya         switch (op[0]->type->base_type) {
102210e230b6Smaya         case GLSL_TYPE_FLOAT:
102310e230b6Smaya            data.f[c] = 0.0f;
102410e230b6Smaya            break;
102510e230b6Smaya         default:
102610e230b6Smaya            unreachable("invalid type");
102710e230b6Smaya         }
102810e230b6Smaya      }
102910e230b6Smaya      break;
103010e230b6Smaya
103110e230b6Smaya   case ir_unop_pack_snorm_2x16:
103210e230b6Smaya      switch (op[0]->type->base_type) {
103310e230b6Smaya      case GLSL_TYPE_FLOAT:
103410e230b6Smaya         data.u[0] = pack_2x16(pack_snorm_1x16, op[0]->value.f[0], op[0]->value.f[1]);
103510e230b6Smaya         break;
103610e230b6Smaya      default:
103710e230b6Smaya         unreachable("invalid type");
103810e230b6Smaya      }
103910e230b6Smaya      break;
104010e230b6Smaya
104110e230b6Smaya   case ir_unop_pack_snorm_4x8:
104210e230b6Smaya      switch (op[0]->type->base_type) {
104310e230b6Smaya      case GLSL_TYPE_FLOAT:
104410e230b6Smaya         data.u[0] = pack_4x8(pack_snorm_1x8, op[0]->value.f[0], op[0]->value.f[1], op[0]->value.f[2], op[0]->value.f[3]);
104510e230b6Smaya         break;
104610e230b6Smaya      default:
104710e230b6Smaya         unreachable("invalid type");
104810e230b6Smaya      }
104910e230b6Smaya      break;
105010e230b6Smaya
105110e230b6Smaya   case ir_unop_pack_unorm_2x16:
105210e230b6Smaya      switch (op[0]->type->base_type) {
105310e230b6Smaya      case GLSL_TYPE_FLOAT:
105410e230b6Smaya         data.u[0] = pack_2x16(pack_unorm_1x16, op[0]->value.f[0], op[0]->value.f[1]);
105510e230b6Smaya         break;
105610e230b6Smaya      default:
105710e230b6Smaya         unreachable("invalid type");
105810e230b6Smaya      }
105910e230b6Smaya      break;
106010e230b6Smaya
106110e230b6Smaya   case ir_unop_pack_unorm_4x8:
106210e230b6Smaya      switch (op[0]->type->base_type) {
106310e230b6Smaya      case GLSL_TYPE_FLOAT:
106410e230b6Smaya         data.u[0] = pack_4x8(pack_unorm_1x8, op[0]->value.f[0], op[0]->value.f[1], op[0]->value.f[2], op[0]->value.f[3]);
106510e230b6Smaya         break;
106610e230b6Smaya      default:
106710e230b6Smaya         unreachable("invalid type");
106810e230b6Smaya      }
106910e230b6Smaya      break;
107010e230b6Smaya
107110e230b6Smaya   case ir_unop_pack_half_2x16:
107210e230b6Smaya      switch (op[0]->type->base_type) {
107310e230b6Smaya      case GLSL_TYPE_FLOAT:
107410e230b6Smaya         data.u[0] = pack_2x16(pack_half_1x16, op[0]->value.f[0], op[0]->value.f[1]);
107510e230b6Smaya         break;
107610e230b6Smaya      default:
107710e230b6Smaya         unreachable("invalid type");
107810e230b6Smaya      }
107910e230b6Smaya      break;
108010e230b6Smaya
108110e230b6Smaya   case ir_unop_unpack_snorm_2x16:
108210e230b6Smaya      unpack_2x16(unpack_snorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
108310e230b6Smaya      break;
108410e230b6Smaya
108510e230b6Smaya   case ir_unop_unpack_snorm_4x8:
108610e230b6Smaya      unpack_4x8(unpack_snorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]);
108710e230b6Smaya      break;
108810e230b6Smaya
108910e230b6Smaya   case ir_unop_unpack_unorm_2x16:
109010e230b6Smaya      unpack_2x16(unpack_unorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
109110e230b6Smaya      break;
109210e230b6Smaya
109310e230b6Smaya   case ir_unop_unpack_unorm_4x8:
109410e230b6Smaya      unpack_4x8(unpack_unorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]);
109510e230b6Smaya      break;
109610e230b6Smaya
109710e230b6Smaya   case ir_unop_unpack_half_2x16:
109810e230b6Smaya      unpack_2x16(unpack_half_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
109910e230b6Smaya      break;
110010e230b6Smaya
110110e230b6Smaya   case ir_unop_bitfield_reverse:
110210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
110310e230b6Smaya         switch (op[0]->type->base_type) {
110410e230b6Smaya         case GLSL_TYPE_UINT:
110510e230b6Smaya            data.u[c] = bitfield_reverse(op[0]->value.u[c]);
110610e230b6Smaya            break;
110710e230b6Smaya         case GLSL_TYPE_INT:
110810e230b6Smaya            data.i[c] = bitfield_reverse(op[0]->value.i[c]);
110910e230b6Smaya            break;
111010e230b6Smaya         default:
111110e230b6Smaya            unreachable("invalid type");
111210e230b6Smaya         }
111310e230b6Smaya      }
111410e230b6Smaya      break;
111510e230b6Smaya
111610e230b6Smaya   case ir_unop_bit_count:
111710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
111810e230b6Smaya         switch (op[0]->type->base_type) {
111910e230b6Smaya         case GLSL_TYPE_UINT:
112010e230b6Smaya            data.i[c] = util_bitcount(op[0]->value.u[c]);
112110e230b6Smaya            break;
112210e230b6Smaya         case GLSL_TYPE_INT:
112310e230b6Smaya            data.i[c] = util_bitcount(op[0]->value.i[c]);
112410e230b6Smaya            break;
112510e230b6Smaya         default:
112610e230b6Smaya            unreachable("invalid type");
112710e230b6Smaya         }
112810e230b6Smaya      }
112910e230b6Smaya      break;
113010e230b6Smaya
113110e230b6Smaya   case ir_unop_find_msb:
113210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
113310e230b6Smaya         switch (op[0]->type->base_type) {
113410e230b6Smaya         case GLSL_TYPE_UINT:
113510e230b6Smaya            data.i[c] = find_msb_uint(op[0]->value.u[c]);
113610e230b6Smaya            break;
113710e230b6Smaya         case GLSL_TYPE_INT:
113810e230b6Smaya            data.i[c] = find_msb_int(op[0]->value.i[c]);
113910e230b6Smaya            break;
114010e230b6Smaya         default:
114110e230b6Smaya            unreachable("invalid type");
114210e230b6Smaya         }
114310e230b6Smaya      }
114410e230b6Smaya      break;
114510e230b6Smaya
114610e230b6Smaya   case ir_unop_find_lsb:
114710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
114810e230b6Smaya         switch (op[0]->type->base_type) {
114910e230b6Smaya         case GLSL_TYPE_UINT:
115010e230b6Smaya            data.i[c] = find_msb_uint(op[0]->value.u[c] & -op[0]->value.u[c]);
115110e230b6Smaya            break;
115210e230b6Smaya         case GLSL_TYPE_INT:
115310e230b6Smaya            data.i[c] = find_msb_uint(op[0]->value.i[c] & -op[0]->value.i[c]);
115410e230b6Smaya            break;
115510e230b6Smaya         default:
115610e230b6Smaya            unreachable("invalid type");
115710e230b6Smaya         }
115810e230b6Smaya      }
115910e230b6Smaya      break;
116010e230b6Smaya
116196c5ddc4Srjs   case ir_unop_clz:
116296c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
116396c5ddc4Srjs         switch (op[0]->type->base_type) {
116496c5ddc4Srjs         case GLSL_TYPE_UINT:
116596c5ddc4Srjs            data.u[c] = (unsigned)(31 - find_msb_uint(op[0]->value.u[c]));
116696c5ddc4Srjs            break;
116796c5ddc4Srjs         default:
116896c5ddc4Srjs            unreachable("invalid type");
116996c5ddc4Srjs         }
117096c5ddc4Srjs      }
117196c5ddc4Srjs      break;
117296c5ddc4Srjs
117310e230b6Smaya   case ir_unop_saturate:
117410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
117510e230b6Smaya         switch (op[0]->type->base_type) {
117610e230b6Smaya         case GLSL_TYPE_FLOAT:
117710e230b6Smaya            data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f);
117810e230b6Smaya            break;
117910e230b6Smaya         default:
118010e230b6Smaya            unreachable("invalid type");
118110e230b6Smaya         }
118210e230b6Smaya      }
118310e230b6Smaya      break;
118410e230b6Smaya
118510e230b6Smaya   case ir_unop_pack_double_2x32:
118696c5ddc4Srjs      data.u64[0] = pack_2x32(op[0]->value.u[0], op[0]->value.u[1]);
118710e230b6Smaya      break;
118810e230b6Smaya
118910e230b6Smaya   case ir_unop_unpack_double_2x32:
119096c5ddc4Srjs      unpack_2x32(op[0]->value.u64[0], &data.u[0], &data.u[1]);
119110e230b6Smaya      break;
119210e230b6Smaya
119310e230b6Smaya   case ir_unop_pack_sampler_2x32:
119496c5ddc4Srjs      data.u64[0] = pack_2x32(op[0]->value.u[0], op[0]->value.u[1]);
119510e230b6Smaya      break;
119610e230b6Smaya
119710e230b6Smaya   case ir_unop_pack_image_2x32:
119896c5ddc4Srjs      data.u64[0] = pack_2x32(op[0]->value.u[0], op[0]->value.u[1]);
119910e230b6Smaya      break;
120010e230b6Smaya
120110e230b6Smaya   case ir_unop_unpack_sampler_2x32:
120296c5ddc4Srjs      unpack_2x32(op[0]->value.u64[0], &data.u[0], &data.u[1]);
120310e230b6Smaya      break;
120410e230b6Smaya
120510e230b6Smaya   case ir_unop_unpack_image_2x32:
120696c5ddc4Srjs      unpack_2x32(op[0]->value.u64[0], &data.u[0], &data.u[1]);
120710e230b6Smaya      break;
120810e230b6Smaya
120910e230b6Smaya   case ir_unop_pack_int_2x32:
121096c5ddc4Srjs      data.u64[0] = pack_2x32(op[0]->value.u[0], op[0]->value.u[1]);
121110e230b6Smaya      break;
121210e230b6Smaya
121310e230b6Smaya   case ir_unop_pack_uint_2x32:
121496c5ddc4Srjs      data.u64[0] = pack_2x32(op[0]->value.u[0], op[0]->value.u[1]);
121510e230b6Smaya      break;
121610e230b6Smaya
121710e230b6Smaya   case ir_unop_unpack_int_2x32:
121896c5ddc4Srjs      unpack_2x32(op[0]->value.u64[0], &data.u[0], &data.u[1]);
121910e230b6Smaya      break;
122010e230b6Smaya
122110e230b6Smaya   case ir_unop_unpack_uint_2x32:
122296c5ddc4Srjs      unpack_2x32(op[0]->value.u64[0], &data.u[0], &data.u[1]);
122310e230b6Smaya      break;
122410e230b6Smaya
122510e230b6Smaya   case ir_binop_add:
122610e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
122710e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
122810e230b6Smaya           c < components;
122910e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
123010e230b6Smaya
123110e230b6Smaya         switch (op[0]->type->base_type) {
123210e230b6Smaya         case GLSL_TYPE_UINT:
123310e230b6Smaya            data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1];
123410e230b6Smaya            break;
123510e230b6Smaya         case GLSL_TYPE_INT:
123610e230b6Smaya            data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1];
123710e230b6Smaya            break;
123810e230b6Smaya         case GLSL_TYPE_FLOAT:
123910e230b6Smaya            data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1];
124010e230b6Smaya            break;
124110e230b6Smaya         case GLSL_TYPE_DOUBLE:
124210e230b6Smaya            data.d[c] = op[0]->value.d[c0] + op[1]->value.d[c1];
124310e230b6Smaya            break;
124410e230b6Smaya         case GLSL_TYPE_UINT64:
124510e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] + op[1]->value.u64[c1];
124610e230b6Smaya            break;
124710e230b6Smaya         case GLSL_TYPE_INT64:
124810e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] + op[1]->value.i64[c1];
124910e230b6Smaya            break;
125010e230b6Smaya         default:
125110e230b6Smaya            unreachable("invalid type");
125210e230b6Smaya         }
125310e230b6Smaya      }
125410e230b6Smaya      break;
125510e230b6Smaya
125610e230b6Smaya   case ir_binop_sub:
125710e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
125810e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
125910e230b6Smaya           c < components;
126010e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
126110e230b6Smaya
126210e230b6Smaya         switch (op[0]->type->base_type) {
126310e230b6Smaya         case GLSL_TYPE_UINT:
126410e230b6Smaya            data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1];
126510e230b6Smaya            break;
126610e230b6Smaya         case GLSL_TYPE_INT:
126710e230b6Smaya            data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1];
126810e230b6Smaya            break;
126910e230b6Smaya         case GLSL_TYPE_FLOAT:
127010e230b6Smaya            data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1];
127110e230b6Smaya            break;
127210e230b6Smaya         case GLSL_TYPE_DOUBLE:
127310e230b6Smaya            data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1];
127410e230b6Smaya            break;
127510e230b6Smaya         case GLSL_TYPE_UINT64:
127610e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] - op[1]->value.u64[c1];
127710e230b6Smaya            break;
127810e230b6Smaya         case GLSL_TYPE_INT64:
127910e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] - op[1]->value.i64[c1];
128010e230b6Smaya            break;
128110e230b6Smaya         default:
128210e230b6Smaya            unreachable("invalid type");
128310e230b6Smaya         }
128410e230b6Smaya      }
128510e230b6Smaya      break;
128610e230b6Smaya
128796c5ddc4Srjs   case ir_binop_add_sat:
128896c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
128996c5ddc4Srjs         switch (op[0]->type->base_type) {
129096c5ddc4Srjs         case GLSL_TYPE_UINT:
129196c5ddc4Srjs            data.u[c] = (op[0]->value.u[c] + op[1]->value.u[c]) < op[0]->value.u[c] ? UINT32_MAX : (op[0]->value.u[c] + op[1]->value.u[c]);
129296c5ddc4Srjs            break;
129396c5ddc4Srjs         case GLSL_TYPE_INT:
129496c5ddc4Srjs            data.i[c] = iadd_saturate(op[0]->value.i[c], op[1]->value.i[c]);
129596c5ddc4Srjs            break;
129696c5ddc4Srjs         case GLSL_TYPE_UINT64:
129796c5ddc4Srjs            data.u64[c] = (op[0]->value.u64[c] + op[1]->value.u64[c]) < op[0]->value.u64[c] ? UINT64_MAX : (op[0]->value.u64[c] + op[1]->value.u64[c]);
129896c5ddc4Srjs            break;
129996c5ddc4Srjs         case GLSL_TYPE_INT64:
130096c5ddc4Srjs            data.i64[c] = iadd64_saturate(op[0]->value.i64[c], op[1]->value.i64[c]);
130196c5ddc4Srjs            break;
130296c5ddc4Srjs         default:
130396c5ddc4Srjs            unreachable("invalid type");
130496c5ddc4Srjs         }
130596c5ddc4Srjs      }
130696c5ddc4Srjs      break;
130796c5ddc4Srjs
130896c5ddc4Srjs   case ir_binop_sub_sat:
130996c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
131096c5ddc4Srjs         switch (op[0]->type->base_type) {
131196c5ddc4Srjs         case GLSL_TYPE_UINT:
131296c5ddc4Srjs            data.u[c] = (op[1]->value.u[c] > op[0]->value.u[c]) ? 0 : op[0]->value.u[c] - op[1]->value.u[c];
131396c5ddc4Srjs            break;
131496c5ddc4Srjs         case GLSL_TYPE_INT:
131596c5ddc4Srjs            data.i[c] = isub_saturate(op[0]->value.i[c], op[1]->value.i[c]);
131696c5ddc4Srjs            break;
131796c5ddc4Srjs         case GLSL_TYPE_UINT64:
131896c5ddc4Srjs            data.u64[c] = (op[1]->value.u64[c] > op[0]->value.u64[c]) ? 0 : op[0]->value.u64[c] - op[1]->value.u64[c];
131996c5ddc4Srjs            break;
132096c5ddc4Srjs         case GLSL_TYPE_INT64:
132196c5ddc4Srjs            data.i64[c] = isub64_saturate(op[0]->value.i64[c], op[1]->value.i64[c]);
132296c5ddc4Srjs            break;
132396c5ddc4Srjs         default:
132496c5ddc4Srjs            unreachable("invalid type");
132596c5ddc4Srjs         }
132696c5ddc4Srjs      }
132796c5ddc4Srjs      break;
132896c5ddc4Srjs
132996c5ddc4Srjs   case ir_binop_abs_sub:
133096c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
133196c5ddc4Srjs         switch (op[0]->type->base_type) {
133296c5ddc4Srjs         case GLSL_TYPE_UINT:
133396c5ddc4Srjs            data.u[c] = (op[1]->value.u[c] > op[0]->value.u[c]) ? op[1]->value.u[c] - op[0]->value.u[c] : op[0]->value.u[c] - op[1]->value.u[c];
133496c5ddc4Srjs            break;
133596c5ddc4Srjs         case GLSL_TYPE_INT:
133696c5ddc4Srjs            data.i[c] = (op[1]->value.i[c] > op[0]->value.i[c]) ? (unsigned)op[1]->value.i[c] - (unsigned)op[0]->value.i[c] : (unsigned)op[0]->value.i[c] - (unsigned)op[1]->value.i[c];
133796c5ddc4Srjs            break;
133896c5ddc4Srjs         case GLSL_TYPE_UINT64:
133996c5ddc4Srjs            data.u64[c] = (op[1]->value.u64[c] > op[0]->value.u64[c]) ? op[1]->value.u64[c] - op[0]->value.u64[c] : op[0]->value.u64[c] - op[1]->value.u64[c];
134096c5ddc4Srjs            break;
134196c5ddc4Srjs         case GLSL_TYPE_INT64:
134296c5ddc4Srjs            data.i64[c] = (op[1]->value.i64[c] > op[0]->value.i64[c]) ? (uint64_t)op[1]->value.i64[c] - (uint64_t)op[0]->value.i64[c] : (uint64_t)op[0]->value.i64[c] - (uint64_t)op[1]->value.i64[c];
134396c5ddc4Srjs            break;
134496c5ddc4Srjs         default:
134596c5ddc4Srjs            unreachable("invalid type");
134696c5ddc4Srjs         }
134796c5ddc4Srjs      }
134896c5ddc4Srjs      break;
134996c5ddc4Srjs
135096c5ddc4Srjs   case ir_binop_avg:
135196c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
135296c5ddc4Srjs         switch (op[0]->type->base_type) {
135396c5ddc4Srjs         case GLSL_TYPE_UINT:
135496c5ddc4Srjs            data.u[c] = (op[0]->value.u[c] >> 1) + (op[1]->value.u[c] >> 1) + ((op[0]->value.u[c] & op[1]->value.u[c]) & 1);
135596c5ddc4Srjs            break;
135696c5ddc4Srjs         case GLSL_TYPE_INT:
135796c5ddc4Srjs            data.i[c] = (op[0]->value.i[c] >> 1) + (op[1]->value.i[c] >> 1) + ((op[0]->value.i[c] & op[1]->value.i[c]) & 1);
135896c5ddc4Srjs            break;
135996c5ddc4Srjs         case GLSL_TYPE_UINT64:
136096c5ddc4Srjs            data.u64[c] = (op[0]->value.u64[c] >> 1) + (op[1]->value.u64[c] >> 1) + ((op[0]->value.u64[c] & op[1]->value.u64[c]) & 1);
136196c5ddc4Srjs            break;
136296c5ddc4Srjs         case GLSL_TYPE_INT64:
136396c5ddc4Srjs            data.i64[c] = (op[0]->value.i64[c] >> 1) + (op[1]->value.i64[c] >> 1) + ((op[0]->value.i64[c] & op[1]->value.i64[c]) & 1);
136496c5ddc4Srjs            break;
136596c5ddc4Srjs         default:
136696c5ddc4Srjs            unreachable("invalid type");
136796c5ddc4Srjs         }
136896c5ddc4Srjs      }
136996c5ddc4Srjs      break;
137096c5ddc4Srjs
137196c5ddc4Srjs   case ir_binop_avg_round:
137296c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
137396c5ddc4Srjs         switch (op[0]->type->base_type) {
137496c5ddc4Srjs         case GLSL_TYPE_UINT:
137596c5ddc4Srjs            data.u[c] = (op[0]->value.u[c] >> 1) + (op[1]->value.u[c] >> 1) + ((op[0]->value.u[c] | op[1]->value.u[c]) & 1);
137696c5ddc4Srjs            break;
137796c5ddc4Srjs         case GLSL_TYPE_INT:
137896c5ddc4Srjs            data.i[c] = (op[0]->value.i[c] >> 1) + (op[1]->value.i[c] >> 1) + ((op[0]->value.i[c] | op[1]->value.i[c]) & 1);
137996c5ddc4Srjs            break;
138096c5ddc4Srjs         case GLSL_TYPE_UINT64:
138196c5ddc4Srjs            data.u64[c] = (op[0]->value.u64[c] >> 1) + (op[1]->value.u64[c] >> 1) + ((op[0]->value.u64[c] | op[1]->value.u64[c]) & 1);
138296c5ddc4Srjs            break;
138396c5ddc4Srjs         case GLSL_TYPE_INT64:
138496c5ddc4Srjs            data.i64[c] = (op[0]->value.i64[c] >> 1) + (op[1]->value.i64[c] >> 1) + ((op[0]->value.i64[c] | op[1]->value.i64[c]) & 1);
138596c5ddc4Srjs            break;
138696c5ddc4Srjs         default:
138796c5ddc4Srjs            unreachable("invalid type");
138896c5ddc4Srjs         }
138996c5ddc4Srjs      }
139096c5ddc4Srjs      break;
139196c5ddc4Srjs
139210e230b6Smaya   case ir_binop_mul:
139310e230b6Smaya      /* Check for equal types, or unequal types involving scalars */
139410e230b6Smaya      if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix())
139510e230b6Smaya          || op0_scalar || op1_scalar) {
139610e230b6Smaya         for (unsigned c = 0, c0 = 0, c1 = 0;
139710e230b6Smaya              c < components;
139810e230b6Smaya              c0 += c0_inc, c1 += c1_inc, c++) {
139910e230b6Smaya
140010e230b6Smaya            switch (op[0]->type->base_type) {
140110e230b6Smaya            case GLSL_TYPE_UINT:
140210e230b6Smaya               data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1];
140310e230b6Smaya               break;
140410e230b6Smaya            case GLSL_TYPE_INT:
140510e230b6Smaya               data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1];
140610e230b6Smaya               break;
140710e230b6Smaya            case GLSL_TYPE_FLOAT:
140810e230b6Smaya               data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1];
140910e230b6Smaya               break;
141010e230b6Smaya            case GLSL_TYPE_DOUBLE:
141110e230b6Smaya               data.d[c] = op[0]->value.d[c0] * op[1]->value.d[c1];
141210e230b6Smaya               break;
141310e230b6Smaya            case GLSL_TYPE_UINT64:
141410e230b6Smaya               data.u64[c] = op[0]->value.u64[c0] * op[1]->value.u64[c1];
141510e230b6Smaya               break;
141610e230b6Smaya            case GLSL_TYPE_INT64:
141710e230b6Smaya               data.i64[c] = op[0]->value.i64[c0] * op[1]->value.i64[c1];
141810e230b6Smaya               break;
141910e230b6Smaya            default:
142010e230b6Smaya               unreachable("invalid type");
142110e230b6Smaya            }
142210e230b6Smaya         }
142310e230b6Smaya      } else {
142410e230b6Smaya         assert(op[0]->type->is_matrix() || op[1]->type->is_matrix());
142510e230b6Smaya
142610e230b6Smaya         /* Multiply an N-by-M matrix with an M-by-P matrix.  Since either
142710e230b6Smaya          * matrix can be a GLSL vector, either N or P can be 1.
142810e230b6Smaya          *
142910e230b6Smaya          * For vec*mat, the vector is treated as a row vector.  This
143010e230b6Smaya          * means the vector is a 1-row x M-column matrix.
143110e230b6Smaya          *
143210e230b6Smaya          * For mat*vec, the vector is treated as a column vector.  Since
143310e230b6Smaya          * matrix_columns is 1 for vectors, this just works.
143410e230b6Smaya          */
143510e230b6Smaya         const unsigned n = op[0]->type->is_vector()
143610e230b6Smaya            ? 1 : op[0]->type->vector_elements;
143710e230b6Smaya         const unsigned m = op[1]->type->vector_elements;
143810e230b6Smaya         const unsigned p = op[1]->type->matrix_columns;
143910e230b6Smaya         for (unsigned j = 0; j < p; j++) {
144010e230b6Smaya            for (unsigned i = 0; i < n; i++) {
144110e230b6Smaya               for (unsigned k = 0; k < m; k++) {
144210e230b6Smaya                  if (op[0]->type->is_double())
144310e230b6Smaya                     data.d[i+n*j] += op[0]->value.d[i+n*k]*op[1]->value.d[k+m*j];
144410e230b6Smaya                  else
144510e230b6Smaya                     data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j];
144610e230b6Smaya               }
144710e230b6Smaya            }
144810e230b6Smaya         }
144910e230b6Smaya      }
145010e230b6Smaya      break;
145110e230b6Smaya
145296c5ddc4Srjs   case ir_binop_mul_32x16:
145396c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
145496c5ddc4Srjs         switch (op[0]->type->base_type) {
145596c5ddc4Srjs         case GLSL_TYPE_UINT:
145696c5ddc4Srjs            data.u[c] = op[0]->value.u[c] * (uint16_t)op[1]->value.u[c];
145796c5ddc4Srjs            break;
145896c5ddc4Srjs         case GLSL_TYPE_INT:
145996c5ddc4Srjs            data.i[c] = op[0]->value.i[c] * (int16_t)op[0]->value.i[c];
146096c5ddc4Srjs            break;
146196c5ddc4Srjs         default:
146296c5ddc4Srjs            unreachable("invalid type");
146396c5ddc4Srjs         }
146496c5ddc4Srjs      }
146596c5ddc4Srjs      break;
146696c5ddc4Srjs
146710e230b6Smaya   case ir_binop_div:
146810e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
146910e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
147010e230b6Smaya           c < components;
147110e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
147210e230b6Smaya
147310e230b6Smaya         switch (op[0]->type->base_type) {
147410e230b6Smaya         case GLSL_TYPE_UINT:
147510e230b6Smaya            data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] / op[1]->value.u[c1];
147610e230b6Smaya            break;
147710e230b6Smaya         case GLSL_TYPE_INT:
147810e230b6Smaya            data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] / op[1]->value.i[c1];
147910e230b6Smaya            break;
148010e230b6Smaya         case GLSL_TYPE_FLOAT:
148110e230b6Smaya            data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1];
148210e230b6Smaya            break;
148310e230b6Smaya         case GLSL_TYPE_DOUBLE:
148410e230b6Smaya            data.d[c] = op[0]->value.d[c0] / op[1]->value.d[c1];
148510e230b6Smaya            break;
148610e230b6Smaya         case GLSL_TYPE_UINT64:
148710e230b6Smaya            data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] / op[1]->value.u64[c1];
148810e230b6Smaya            break;
148910e230b6Smaya         case GLSL_TYPE_INT64:
149010e230b6Smaya            data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] / op[1]->value.i64[c1];
149110e230b6Smaya            break;
149210e230b6Smaya         default:
149310e230b6Smaya            unreachable("invalid type");
149410e230b6Smaya         }
149510e230b6Smaya      }
149610e230b6Smaya      break;
149710e230b6Smaya
149810e230b6Smaya   case ir_binop_mod:
149910e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
150010e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
150110e230b6Smaya           c < components;
150210e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
150310e230b6Smaya
150410e230b6Smaya         switch (op[0]->type->base_type) {
150510e230b6Smaya         case GLSL_TYPE_UINT:
150610e230b6Smaya            data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] % op[1]->value.u[c1];
150710e230b6Smaya            break;
150810e230b6Smaya         case GLSL_TYPE_INT:
150910e230b6Smaya            data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] % op[1]->value.i[c1];
151010e230b6Smaya            break;
151110e230b6Smaya         case GLSL_TYPE_FLOAT:
151210e230b6Smaya            data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]);
151310e230b6Smaya            break;
151410e230b6Smaya         case GLSL_TYPE_DOUBLE:
151510e230b6Smaya            data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1] * floor(op[0]->value.d[c0] / op[1]->value.d[c1]);
151610e230b6Smaya            break;
151710e230b6Smaya         case GLSL_TYPE_UINT64:
151810e230b6Smaya            data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] % op[1]->value.u64[c1];
151910e230b6Smaya            break;
152010e230b6Smaya         case GLSL_TYPE_INT64:
152110e230b6Smaya            data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] % op[1]->value.i64[c1];
152210e230b6Smaya            break;
152310e230b6Smaya         default:
152410e230b6Smaya            unreachable("invalid type");
152510e230b6Smaya         }
152610e230b6Smaya      }
152710e230b6Smaya      break;
152810e230b6Smaya
152910e230b6Smaya   case ir_binop_less:
153010e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
153110e230b6Smaya         switch (op[0]->type->base_type) {
153210e230b6Smaya         case GLSL_TYPE_UINT:
153310e230b6Smaya            data.b[c] = op[0]->value.u[c] < op[1]->value.u[c];
153410e230b6Smaya            break;
153510e230b6Smaya         case GLSL_TYPE_INT:
153610e230b6Smaya            data.b[c] = op[0]->value.i[c] < op[1]->value.i[c];
153710e230b6Smaya            break;
153810e230b6Smaya         case GLSL_TYPE_FLOAT:
153910e230b6Smaya            data.b[c] = op[0]->value.f[c] < op[1]->value.f[c];
154010e230b6Smaya            break;
154110e230b6Smaya         case GLSL_TYPE_DOUBLE:
154210e230b6Smaya            data.b[c] = op[0]->value.d[c] < op[1]->value.d[c];
154310e230b6Smaya            break;
154410e230b6Smaya         case GLSL_TYPE_UINT64:
154510e230b6Smaya            data.b[c] = op[0]->value.u64[c] < op[1]->value.u64[c];
154610e230b6Smaya            break;
154710e230b6Smaya         case GLSL_TYPE_INT64:
154810e230b6Smaya            data.b[c] = op[0]->value.i64[c] < op[1]->value.i64[c];
154910e230b6Smaya            break;
155010e230b6Smaya         default:
155110e230b6Smaya            unreachable("invalid type");
155210e230b6Smaya         }
155310e230b6Smaya      }
155410e230b6Smaya      break;
155510e230b6Smaya
155610e230b6Smaya   case ir_binop_gequal:
155710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
155810e230b6Smaya         switch (op[0]->type->base_type) {
155910e230b6Smaya         case GLSL_TYPE_UINT:
156010e230b6Smaya            data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c];
156110e230b6Smaya            break;
156210e230b6Smaya         case GLSL_TYPE_INT:
156310e230b6Smaya            data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c];
156410e230b6Smaya            break;
156510e230b6Smaya         case GLSL_TYPE_FLOAT:
156610e230b6Smaya            data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c];
156710e230b6Smaya            break;
156810e230b6Smaya         case GLSL_TYPE_DOUBLE:
156910e230b6Smaya            data.b[c] = op[0]->value.d[c] >= op[1]->value.d[c];
157010e230b6Smaya            break;
157110e230b6Smaya         case GLSL_TYPE_UINT64:
157210e230b6Smaya            data.b[c] = op[0]->value.u64[c] >= op[1]->value.u64[c];
157310e230b6Smaya            break;
157410e230b6Smaya         case GLSL_TYPE_INT64:
157510e230b6Smaya            data.b[c] = op[0]->value.i64[c] >= op[1]->value.i64[c];
157610e230b6Smaya            break;
157710e230b6Smaya         default:
157810e230b6Smaya            unreachable("invalid type");
157910e230b6Smaya         }
158010e230b6Smaya      }
158110e230b6Smaya      break;
158210e230b6Smaya
158310e230b6Smaya   case ir_binop_equal:
158410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
158510e230b6Smaya         switch (op[0]->type->base_type) {
158610e230b6Smaya         case GLSL_TYPE_UINT:
158710e230b6Smaya            data.b[c] = op[0]->value.u[c] == op[1]->value.u[c];
158810e230b6Smaya            break;
158910e230b6Smaya         case GLSL_TYPE_INT:
159010e230b6Smaya            data.b[c] = op[0]->value.i[c] == op[1]->value.i[c];
159110e230b6Smaya            break;
159210e230b6Smaya         case GLSL_TYPE_FLOAT:
159310e230b6Smaya            data.b[c] = op[0]->value.f[c] == op[1]->value.f[c];
159410e230b6Smaya            break;
159510e230b6Smaya         case GLSL_TYPE_DOUBLE:
159610e230b6Smaya            data.b[c] = op[0]->value.d[c] == op[1]->value.d[c];
159710e230b6Smaya            break;
159810e230b6Smaya         case GLSL_TYPE_UINT64:
159910e230b6Smaya            data.b[c] = op[0]->value.u64[c] == op[1]->value.u64[c];
160010e230b6Smaya            break;
160110e230b6Smaya         case GLSL_TYPE_INT64:
160210e230b6Smaya            data.b[c] = op[0]->value.i64[c] == op[1]->value.i64[c];
160310e230b6Smaya            break;
160410e230b6Smaya         case GLSL_TYPE_BOOL:
160510e230b6Smaya            data.b[c] = op[0]->value.b[c] == op[1]->value.b[c];
160610e230b6Smaya            break;
160710e230b6Smaya         default:
160810e230b6Smaya            unreachable("invalid type");
160910e230b6Smaya         }
161010e230b6Smaya      }
161110e230b6Smaya      break;
161210e230b6Smaya
161310e230b6Smaya   case ir_binop_nequal:
161410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
161510e230b6Smaya         switch (op[0]->type->base_type) {
161610e230b6Smaya         case GLSL_TYPE_UINT:
161710e230b6Smaya            data.b[c] = op[0]->value.u[c] != op[1]->value.u[c];
161810e230b6Smaya            break;
161910e230b6Smaya         case GLSL_TYPE_INT:
162010e230b6Smaya            data.b[c] = op[0]->value.i[c] != op[1]->value.i[c];
162110e230b6Smaya            break;
162210e230b6Smaya         case GLSL_TYPE_FLOAT:
162310e230b6Smaya            data.b[c] = op[0]->value.f[c] != op[1]->value.f[c];
162410e230b6Smaya            break;
162510e230b6Smaya         case GLSL_TYPE_DOUBLE:
162610e230b6Smaya            data.b[c] = op[0]->value.d[c] != op[1]->value.d[c];
162710e230b6Smaya            break;
162810e230b6Smaya         case GLSL_TYPE_UINT64:
162910e230b6Smaya            data.b[c] = op[0]->value.u64[c] != op[1]->value.u64[c];
163010e230b6Smaya            break;
163110e230b6Smaya         case GLSL_TYPE_INT64:
163210e230b6Smaya            data.b[c] = op[0]->value.i64[c] != op[1]->value.i64[c];
163310e230b6Smaya            break;
163410e230b6Smaya         case GLSL_TYPE_BOOL:
163510e230b6Smaya            data.b[c] = op[0]->value.b[c] != op[1]->value.b[c];
163610e230b6Smaya            break;
163710e230b6Smaya         default:
163810e230b6Smaya            unreachable("invalid type");
163910e230b6Smaya         }
164010e230b6Smaya      }
164110e230b6Smaya      break;
164210e230b6Smaya
164310e230b6Smaya   case ir_binop_all_equal:
164410e230b6Smaya      data.b[0] = op[0]->has_value(op[1]);
164510e230b6Smaya      break;
164610e230b6Smaya
164710e230b6Smaya   case ir_binop_any_nequal:
164810e230b6Smaya      data.b[0] = !op[0]->has_value(op[1]);
164910e230b6Smaya      break;
165010e230b6Smaya
165110e230b6Smaya   case ir_binop_lshift:
165210e230b6Smaya      assert(op[0]->type->base_type == GLSL_TYPE_UINT ||
165310e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_INT ||
165410e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_UINT64 ||
165510e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_INT64);
165610e230b6Smaya      assert(op[1]->type->base_type == GLSL_TYPE_UINT ||
165710e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_INT ||
165810e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_UINT64 ||
165910e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_INT64);
166010e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
166110e230b6Smaya           c < components;
166210e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
166310e230b6Smaya
166410e230b6Smaya         switch (op[0]->type->base_type) {
166510e230b6Smaya         case GLSL_TYPE_UINT:
166610e230b6Smaya            data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1];
166710e230b6Smaya            break;
166810e230b6Smaya         case GLSL_TYPE_INT:
166910e230b6Smaya            data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1];
167010e230b6Smaya            break;
167110e230b6Smaya         case GLSL_TYPE_UINT64:
167210e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] << op[1]->value.u64[c1];
167310e230b6Smaya            break;
167410e230b6Smaya         case GLSL_TYPE_INT64:
167510e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] << op[1]->value.i64[c1];
167610e230b6Smaya            break;
167710e230b6Smaya         default:
167810e230b6Smaya            unreachable("invalid type");
167910e230b6Smaya         }
168010e230b6Smaya      }
168110e230b6Smaya      break;
168210e230b6Smaya
168310e230b6Smaya   case ir_binop_rshift:
168410e230b6Smaya      assert(op[0]->type->base_type == GLSL_TYPE_UINT ||
168510e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_INT ||
168610e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_UINT64 ||
168710e230b6Smaya             op[0]->type->base_type == GLSL_TYPE_INT64);
168810e230b6Smaya      assert(op[1]->type->base_type == GLSL_TYPE_UINT ||
168910e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_INT ||
169010e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_UINT64 ||
169110e230b6Smaya             op[1]->type->base_type == GLSL_TYPE_INT64);
169210e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
169310e230b6Smaya           c < components;
169410e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
169510e230b6Smaya
169610e230b6Smaya         switch (op[0]->type->base_type) {
169710e230b6Smaya         case GLSL_TYPE_UINT:
169810e230b6Smaya            data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1];
169910e230b6Smaya            break;
170010e230b6Smaya         case GLSL_TYPE_INT:
170110e230b6Smaya            data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1];
170210e230b6Smaya            break;
170310e230b6Smaya         case GLSL_TYPE_UINT64:
170410e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] >> op[1]->value.u64[c1];
170510e230b6Smaya            break;
170610e230b6Smaya         case GLSL_TYPE_INT64:
170710e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] >> op[1]->value.i64[c1];
170810e230b6Smaya            break;
170910e230b6Smaya         default:
171010e230b6Smaya            unreachable("invalid type");
171110e230b6Smaya         }
171210e230b6Smaya      }
171310e230b6Smaya      break;
171410e230b6Smaya
171510e230b6Smaya   case ir_binop_bit_and:
171610e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
171710e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
171810e230b6Smaya           c < components;
171910e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
172010e230b6Smaya
172110e230b6Smaya         switch (op[0]->type->base_type) {
172210e230b6Smaya         case GLSL_TYPE_UINT:
172310e230b6Smaya            data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1];
172410e230b6Smaya            break;
172510e230b6Smaya         case GLSL_TYPE_INT:
172610e230b6Smaya            data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1];
172710e230b6Smaya            break;
172810e230b6Smaya         case GLSL_TYPE_UINT64:
172910e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] & op[1]->value.u64[c1];
173010e230b6Smaya            break;
173110e230b6Smaya         case GLSL_TYPE_INT64:
173210e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] & op[1]->value.i64[c1];
173310e230b6Smaya            break;
173410e230b6Smaya         default:
173510e230b6Smaya            unreachable("invalid type");
173610e230b6Smaya         }
173710e230b6Smaya      }
173810e230b6Smaya      break;
173910e230b6Smaya
174010e230b6Smaya   case ir_binop_bit_xor:
174110e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
174210e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
174310e230b6Smaya           c < components;
174410e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
174510e230b6Smaya
174610e230b6Smaya         switch (op[0]->type->base_type) {
174710e230b6Smaya         case GLSL_TYPE_UINT:
174810e230b6Smaya            data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1];
174910e230b6Smaya            break;
175010e230b6Smaya         case GLSL_TYPE_INT:
175110e230b6Smaya            data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1];
175210e230b6Smaya            break;
175310e230b6Smaya         case GLSL_TYPE_UINT64:
175410e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] ^ op[1]->value.u64[c1];
175510e230b6Smaya            break;
175610e230b6Smaya         case GLSL_TYPE_INT64:
175710e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] ^ op[1]->value.i64[c1];
175810e230b6Smaya            break;
175910e230b6Smaya         default:
176010e230b6Smaya            unreachable("invalid type");
176110e230b6Smaya         }
176210e230b6Smaya      }
176310e230b6Smaya      break;
176410e230b6Smaya
176510e230b6Smaya   case ir_binop_bit_or:
176610e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
176710e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
176810e230b6Smaya           c < components;
176910e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
177010e230b6Smaya
177110e230b6Smaya         switch (op[0]->type->base_type) {
177210e230b6Smaya         case GLSL_TYPE_UINT:
177310e230b6Smaya            data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1];
177410e230b6Smaya            break;
177510e230b6Smaya         case GLSL_TYPE_INT:
177610e230b6Smaya            data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1];
177710e230b6Smaya            break;
177810e230b6Smaya         case GLSL_TYPE_UINT64:
177910e230b6Smaya            data.u64[c] = op[0]->value.u64[c0] | op[1]->value.u64[c1];
178010e230b6Smaya            break;
178110e230b6Smaya         case GLSL_TYPE_INT64:
178210e230b6Smaya            data.i64[c] = op[0]->value.i64[c0] | op[1]->value.i64[c1];
178310e230b6Smaya            break;
178410e230b6Smaya         default:
178510e230b6Smaya            unreachable("invalid type");
178610e230b6Smaya         }
178710e230b6Smaya      }
178810e230b6Smaya      break;
178910e230b6Smaya
179010e230b6Smaya   case ir_binop_logic_and:
179110e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
179210e230b6Smaya         switch (op[0]->type->base_type) {
179310e230b6Smaya         case GLSL_TYPE_BOOL:
179410e230b6Smaya            data.b[c] = op[0]->value.b[c] && op[1]->value.b[c];
179510e230b6Smaya            break;
179610e230b6Smaya         default:
179710e230b6Smaya            unreachable("invalid type");
179810e230b6Smaya         }
179910e230b6Smaya      }
180010e230b6Smaya      break;
180110e230b6Smaya
180210e230b6Smaya   case ir_binop_logic_xor:
180310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
180410e230b6Smaya         switch (op[0]->type->base_type) {
180510e230b6Smaya         case GLSL_TYPE_BOOL:
180610e230b6Smaya            data.b[c] = op[0]->value.b[c] != op[1]->value.b[c];
180710e230b6Smaya            break;
180810e230b6Smaya         default:
180910e230b6Smaya            unreachable("invalid type");
181010e230b6Smaya         }
181110e230b6Smaya      }
181210e230b6Smaya      break;
181310e230b6Smaya
181410e230b6Smaya   case ir_binop_logic_or:
181510e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
181610e230b6Smaya         switch (op[0]->type->base_type) {
181710e230b6Smaya         case GLSL_TYPE_BOOL:
181810e230b6Smaya            data.b[c] = op[0]->value.b[c] || op[1]->value.b[c];
181910e230b6Smaya            break;
182010e230b6Smaya         default:
182110e230b6Smaya            unreachable("invalid type");
182210e230b6Smaya         }
182310e230b6Smaya      }
182410e230b6Smaya      break;
182510e230b6Smaya
182610e230b6Smaya   case ir_binop_dot:
182710e230b6Smaya      switch (op[0]->type->base_type) {
182810e230b6Smaya      case GLSL_TYPE_FLOAT:
182910e230b6Smaya         data.f[0] = dot_f(op[0], op[1]);
183010e230b6Smaya         break;
183110e230b6Smaya      case GLSL_TYPE_DOUBLE:
183210e230b6Smaya         data.d[0] = dot_d(op[0], op[1]);
183310e230b6Smaya         break;
183410e230b6Smaya      default:
183510e230b6Smaya         unreachable("invalid type");
183610e230b6Smaya      }
183710e230b6Smaya      break;
183810e230b6Smaya
183910e230b6Smaya   case ir_binop_min:
184010e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
184110e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
184210e230b6Smaya           c < components;
184310e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
184410e230b6Smaya
184510e230b6Smaya         switch (op[0]->type->base_type) {
184610e230b6Smaya         case GLSL_TYPE_UINT:
184710e230b6Smaya            data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]);
184810e230b6Smaya            break;
184910e230b6Smaya         case GLSL_TYPE_INT:
185010e230b6Smaya            data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]);
185110e230b6Smaya            break;
185210e230b6Smaya         case GLSL_TYPE_FLOAT:
185310e230b6Smaya            data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]);
185410e230b6Smaya            break;
185510e230b6Smaya         case GLSL_TYPE_DOUBLE:
185610e230b6Smaya            data.d[c] = MIN2(op[0]->value.d[c0], op[1]->value.d[c1]);
185710e230b6Smaya            break;
185810e230b6Smaya         case GLSL_TYPE_UINT64:
185910e230b6Smaya            data.u64[c] = MIN2(op[0]->value.u64[c0], op[1]->value.u64[c1]);
186010e230b6Smaya            break;
186110e230b6Smaya         case GLSL_TYPE_INT64:
186210e230b6Smaya            data.i64[c] = MIN2(op[0]->value.i64[c0], op[1]->value.i64[c1]);
186310e230b6Smaya            break;
186410e230b6Smaya         default:
186510e230b6Smaya            unreachable("invalid type");
186610e230b6Smaya         }
186710e230b6Smaya      }
186810e230b6Smaya      break;
186910e230b6Smaya
187010e230b6Smaya   case ir_binop_max:
187110e230b6Smaya      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
187210e230b6Smaya      for (unsigned c = 0, c0 = 0, c1 = 0;
187310e230b6Smaya           c < components;
187410e230b6Smaya           c0 += c0_inc, c1 += c1_inc, c++) {
187510e230b6Smaya
187610e230b6Smaya         switch (op[0]->type->base_type) {
187710e230b6Smaya         case GLSL_TYPE_UINT:
187810e230b6Smaya            data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]);
187910e230b6Smaya            break;
188010e230b6Smaya         case GLSL_TYPE_INT:
188110e230b6Smaya            data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]);
188210e230b6Smaya            break;
188310e230b6Smaya         case GLSL_TYPE_FLOAT:
188410e230b6Smaya            data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]);
188510e230b6Smaya            break;
188610e230b6Smaya         case GLSL_TYPE_DOUBLE:
188710e230b6Smaya            data.d[c] = MAX2(op[0]->value.d[c0], op[1]->value.d[c1]);
188810e230b6Smaya            break;
188910e230b6Smaya         case GLSL_TYPE_UINT64:
189010e230b6Smaya            data.u64[c] = MAX2(op[0]->value.u64[c0], op[1]->value.u64[c1]);
189110e230b6Smaya            break;
189210e230b6Smaya         case GLSL_TYPE_INT64:
189310e230b6Smaya            data.i64[c] = MAX2(op[0]->value.i64[c0], op[1]->value.i64[c1]);
189410e230b6Smaya            break;
189510e230b6Smaya         default:
189610e230b6Smaya            unreachable("invalid type");
189710e230b6Smaya         }
189810e230b6Smaya      }
189910e230b6Smaya      break;
190010e230b6Smaya
190110e230b6Smaya   case ir_binop_pow:
190210e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
190310e230b6Smaya         switch (op[0]->type->base_type) {
190410e230b6Smaya         case GLSL_TYPE_FLOAT:
190510e230b6Smaya            data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]);
190610e230b6Smaya            break;
190710e230b6Smaya         default:
190810e230b6Smaya            unreachable("invalid type");
190910e230b6Smaya         }
191010e230b6Smaya      }
191110e230b6Smaya      break;
191210e230b6Smaya
191310e230b6Smaya   case ir_binop_ldexp:
191410e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
191510e230b6Smaya         switch (op[0]->type->base_type) {
191610e230b6Smaya         case GLSL_TYPE_FLOAT:
191710e230b6Smaya            data.f[c] = ldexpf_flush_subnormal(op[0]->value.f[c], op[1]->value.i[c]);
191810e230b6Smaya            break;
191910e230b6Smaya         case GLSL_TYPE_DOUBLE:
192010e230b6Smaya            data.d[c] = ldexp_flush_subnormal(op[0]->value.d[c], op[1]->value.i[c]);
192110e230b6Smaya            break;
192210e230b6Smaya         default:
192310e230b6Smaya            unreachable("invalid type");
192410e230b6Smaya         }
192510e230b6Smaya      }
192610e230b6Smaya      break;
192710e230b6Smaya
192810e230b6Smaya   case ir_binop_vector_extract: {
192910e230b6Smaya      const int c = CLAMP(op[1]->value.i[0], 0,
193010e230b6Smaya                          (int) op[0]->type->vector_elements - 1);
193110e230b6Smaya
193210e230b6Smaya      switch (op[0]->type->base_type) {
193310e230b6Smaya      case GLSL_TYPE_UINT:
193410e230b6Smaya         data.u[0] = op[0]->value.u[c];
193510e230b6Smaya         break;
193610e230b6Smaya      case GLSL_TYPE_INT:
193710e230b6Smaya         data.i[0] = op[0]->value.i[c];
193810e230b6Smaya         break;
193910e230b6Smaya      case GLSL_TYPE_FLOAT:
194010e230b6Smaya         data.f[0] = op[0]->value.f[c];
194110e230b6Smaya         break;
194210e230b6Smaya      case GLSL_TYPE_DOUBLE:
194310e230b6Smaya         data.d[0] = op[0]->value.d[c];
194410e230b6Smaya         break;
194510e230b6Smaya      case GLSL_TYPE_UINT64:
194610e230b6Smaya         data.u64[0] = op[0]->value.u64[c];
194710e230b6Smaya         break;
194810e230b6Smaya      case GLSL_TYPE_INT64:
194910e230b6Smaya         data.i64[0] = op[0]->value.i64[c];
195010e230b6Smaya         break;
195110e230b6Smaya      case GLSL_TYPE_BOOL:
195210e230b6Smaya         data.b[0] = op[0]->value.b[c];
195310e230b6Smaya         break;
195410e230b6Smaya      default:
195510e230b6Smaya         unreachable("invalid type");
195610e230b6Smaya      }
195710e230b6Smaya      break;
195810e230b6Smaya   }
195910e230b6Smaya
196096c5ddc4Srjs   case ir_binop_atan2:
196196c5ddc4Srjs      for (unsigned c = 0; c < op[0]->type->components(); c++) {
196296c5ddc4Srjs         switch (op[0]->type->base_type) {
196396c5ddc4Srjs         case GLSL_TYPE_FLOAT:
196496c5ddc4Srjs            data.f[c] = atan2(op[0]->value.f[c], op[1]->value.f[c]);
196596c5ddc4Srjs            break;
196696c5ddc4Srjs         default:
196796c5ddc4Srjs            unreachable("invalid type");
196896c5ddc4Srjs         }
196996c5ddc4Srjs      }
197096c5ddc4Srjs      break;
197196c5ddc4Srjs
197210e230b6Smaya   case ir_triop_fma:
197310e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
197410e230b6Smaya         switch (op[0]->type->base_type) {
197510e230b6Smaya         case GLSL_TYPE_FLOAT:
197610e230b6Smaya            data.f[c] = op[0]->value.f[c] * op[1]->value.f[c] + op[2]->value.f[c];
197710e230b6Smaya            break;
197810e230b6Smaya         case GLSL_TYPE_DOUBLE:
197910e230b6Smaya            data.d[c] = op[0]->value.d[c] * op[1]->value.d[c] + op[2]->value.d[c];
198010e230b6Smaya            break;
198110e230b6Smaya         default:
198210e230b6Smaya            unreachable("invalid type");
198310e230b6Smaya         }
198410e230b6Smaya      }
198510e230b6Smaya      break;
198610e230b6Smaya
198710e230b6Smaya   case ir_triop_lrp: {
198810e230b6Smaya      assert(op[0]->type->is_float() || op[0]->type->is_double());
198910e230b6Smaya      assert(op[1]->type->is_float() || op[1]->type->is_double());
199010e230b6Smaya      assert(op[2]->type->is_float() || op[2]->type->is_double());
199110e230b6Smaya
199210e230b6Smaya      unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1;
199310e230b6Smaya      for (unsigned c = 0, c2 = 0; c < components; c2 += c2_inc, c++) {
199496c5ddc4Srjs         switch (return_type->base_type) {
199510e230b6Smaya         case GLSL_TYPE_FLOAT:
199610e230b6Smaya            data.f[c] = op[0]->value.f[c] * (1.0f - op[2]->value.f[c2]) + (op[1]->value.f[c] * op[2]->value.f[c2]);
199710e230b6Smaya            break;
199810e230b6Smaya         case GLSL_TYPE_DOUBLE:
199910e230b6Smaya            data.d[c] = op[0]->value.d[c] * (1.0 - op[2]->value.d[c2]) + (op[1]->value.d[c] * op[2]->value.d[c2]);
200010e230b6Smaya            break;
200110e230b6Smaya         default:
200210e230b6Smaya            unreachable("invalid type");
200310e230b6Smaya         }
200410e230b6Smaya      }
200510e230b6Smaya      break;
200610e230b6Smaya   }
200710e230b6Smaya
200810e230b6Smaya   case ir_triop_csel:
200910e230b6Smaya      for (unsigned c = 0; c < components; c++) {
201096c5ddc4Srjs         switch (return_type->base_type) {
201110e230b6Smaya         case GLSL_TYPE_UINT:
201210e230b6Smaya            data.u[c] = op[0]->value.b[c] ? op[1]->value.u[c] : op[2]->value.u[c];
201310e230b6Smaya            break;
201410e230b6Smaya         case GLSL_TYPE_INT:
201510e230b6Smaya            data.i[c] = op[0]->value.b[c] ? op[1]->value.i[c] : op[2]->value.i[c];
201610e230b6Smaya            break;
201710e230b6Smaya         case GLSL_TYPE_FLOAT:
201810e230b6Smaya            data.f[c] = op[0]->value.b[c] ? op[1]->value.f[c] : op[2]->value.f[c];
201910e230b6Smaya            break;
202010e230b6Smaya         case GLSL_TYPE_DOUBLE:
202110e230b6Smaya            data.d[c] = op[0]->value.b[c] ? op[1]->value.d[c] : op[2]->value.d[c];
202210e230b6Smaya            break;
202310e230b6Smaya         case GLSL_TYPE_UINT64:
202410e230b6Smaya            data.u64[c] = op[0]->value.b[c] ? op[1]->value.u64[c] : op[2]->value.u64[c];
202510e230b6Smaya            break;
202610e230b6Smaya         case GLSL_TYPE_INT64:
202710e230b6Smaya            data.i64[c] = op[0]->value.b[c] ? op[1]->value.i64[c] : op[2]->value.i64[c];
202810e230b6Smaya            break;
202910e230b6Smaya         case GLSL_TYPE_BOOL:
203010e230b6Smaya            data.b[c] = op[0]->value.b[c] ? op[1]->value.b[c] : op[2]->value.b[c];
203110e230b6Smaya            break;
203210e230b6Smaya         default:
203310e230b6Smaya            unreachable("invalid type");
203410e230b6Smaya         }
203510e230b6Smaya      }
203610e230b6Smaya      break;
203710e230b6Smaya
203810e230b6Smaya   case ir_triop_bitfield_extract:
203910e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
204010e230b6Smaya         switch (op[0]->type->base_type) {
204110e230b6Smaya         case GLSL_TYPE_UINT:
204210e230b6Smaya            data.i[c] = bitfield_extract_uint(op[0]->value.u[c], op[1]->value.i[c], op[2]->value.i[c]);
204310e230b6Smaya            break;
204410e230b6Smaya         case GLSL_TYPE_INT:
204510e230b6Smaya            data.i[c] = bitfield_extract_int(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c]);
204610e230b6Smaya            break;
204710e230b6Smaya         default:
204810e230b6Smaya            unreachable("invalid type");
204910e230b6Smaya         }
205010e230b6Smaya      }
205110e230b6Smaya      break;
205210e230b6Smaya
205310e230b6Smaya   case ir_triop_vector_insert: {
205410e230b6Smaya      const unsigned idx = op[2]->value.u[0];
205510e230b6Smaya
205610e230b6Smaya      memcpy(&data, &op[0]->value, sizeof(data));
205710e230b6Smaya
205896c5ddc4Srjs      switch (return_type->base_type) {
205910e230b6Smaya      case GLSL_TYPE_UINT:
206010e230b6Smaya         data.u[idx] = op[1]->value.u[0];
206110e230b6Smaya         break;
206210e230b6Smaya      case GLSL_TYPE_INT:
206310e230b6Smaya         data.i[idx] = op[1]->value.i[0];
206410e230b6Smaya         break;
206510e230b6Smaya      case GLSL_TYPE_FLOAT:
206610e230b6Smaya         data.f[idx] = op[1]->value.f[0];
206710e230b6Smaya         break;
206810e230b6Smaya      case GLSL_TYPE_DOUBLE:
206910e230b6Smaya         data.d[idx] = op[1]->value.d[0];
207010e230b6Smaya         break;
207110e230b6Smaya      case GLSL_TYPE_UINT64:
207210e230b6Smaya         data.u64[idx] = op[1]->value.u64[0];
207310e230b6Smaya         break;
207410e230b6Smaya      case GLSL_TYPE_INT64:
207510e230b6Smaya         data.i64[idx] = op[1]->value.i64[0];
207610e230b6Smaya         break;
207710e230b6Smaya      case GLSL_TYPE_BOOL:
207810e230b6Smaya         data.b[idx] = op[1]->value.b[0];
207910e230b6Smaya         break;
208010e230b6Smaya      default:
208110e230b6Smaya         unreachable("invalid type");
208210e230b6Smaya      }
208310e230b6Smaya      break;
208410e230b6Smaya   }
208510e230b6Smaya
208610e230b6Smaya   case ir_quadop_bitfield_insert:
208710e230b6Smaya      for (unsigned c = 0; c < op[0]->type->components(); c++) {
208810e230b6Smaya         switch (op[0]->type->base_type) {
208910e230b6Smaya         case GLSL_TYPE_UINT:
209010e230b6Smaya            data.u[c] = bitfield_insert(op[0]->value.u[c], op[1]->value.u[c], op[2]->value.i[c], op[3]->value.i[c]);
209110e230b6Smaya            break;
209210e230b6Smaya         case GLSL_TYPE_INT:
209310e230b6Smaya            data.i[c] = bitfield_insert(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c], op[3]->value.i[c]);
209410e230b6Smaya            break;
209510e230b6Smaya         default:
209610e230b6Smaya            unreachable("invalid type");
209710e230b6Smaya         }
209810e230b6Smaya      }
209910e230b6Smaya      break;
210010e230b6Smaya
210110e230b6Smaya   case ir_quadop_vector:
210296c5ddc4Srjs      for (unsigned c = 0; c < return_type->vector_elements; c++) {
210396c5ddc4Srjs         switch (return_type->base_type) {
210410e230b6Smaya         case GLSL_TYPE_UINT:
210510e230b6Smaya            data.u[c] = op[c]->value.u[0];
210610e230b6Smaya            break;
210710e230b6Smaya         case GLSL_TYPE_INT:
210810e230b6Smaya            data.i[c] = op[c]->value.i[0];
210910e230b6Smaya            break;
211010e230b6Smaya         case GLSL_TYPE_FLOAT:
211110e230b6Smaya            data.f[c] = op[c]->value.f[0];
211210e230b6Smaya            break;
211310e230b6Smaya         case GLSL_TYPE_DOUBLE:
211410e230b6Smaya            data.d[c] = op[c]->value.d[0];
211510e230b6Smaya            break;
211610e230b6Smaya         case GLSL_TYPE_UINT64:
211710e230b6Smaya            data.u64[c] = op[c]->value.u64[0];
211810e230b6Smaya            break;
211910e230b6Smaya         case GLSL_TYPE_INT64:
212010e230b6Smaya            data.i64[c] = op[c]->value.i64[0];
212110e230b6Smaya            break;
212210e230b6Smaya         case GLSL_TYPE_BOOL:
212310e230b6Smaya            data.b[c] = op[c]->value.b[0];
212410e230b6Smaya            break;
212510e230b6Smaya         default:
212610e230b6Smaya            unreachable("invalid type");
212710e230b6Smaya         }
212810e230b6Smaya      }
212910e230b6Smaya      break;
213010e230b6Smaya
213110e230b6Smaya   default:
213210e230b6Smaya      /* FINISHME: Should handle all expression types. */
213310e230b6Smaya      return NULL;
213410e230b6Smaya   }
213510e230b6Smaya
2136