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