1b8e80941Smrg switch (this->operation) { 2b8e80941Smrg case ir_unop_bit_not: 3b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 4b8e80941Smrg switch (op[0]->type->base_type) { 5b8e80941Smrg case GLSL_TYPE_UINT: 6b8e80941Smrg data.u[c] = ~ op[0]->value.u[c]; 7b8e80941Smrg break; 8b8e80941Smrg case GLSL_TYPE_INT: 9b8e80941Smrg data.i[c] = ~ op[0]->value.i[c]; 10b8e80941Smrg break; 11b8e80941Smrg case GLSL_TYPE_UINT64: 12b8e80941Smrg data.u64[c] = ~ op[0]->value.u64[c]; 13b8e80941Smrg break; 14b8e80941Smrg case GLSL_TYPE_INT64: 15b8e80941Smrg data.i64[c] = ~ op[0]->value.i64[c]; 16b8e80941Smrg break; 17b8e80941Smrg default: 18b8e80941Smrg unreachable("invalid type"); 19b8e80941Smrg } 20b8e80941Smrg } 21b8e80941Smrg break; 22b8e80941Smrg 23b8e80941Smrg case ir_unop_logic_not: 24b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 25b8e80941Smrg switch (op[0]->type->base_type) { 26b8e80941Smrg case GLSL_TYPE_BOOL: 27b8e80941Smrg data.b[c] = !op[0]->value.b[c]; 28b8e80941Smrg break; 29b8e80941Smrg default: 30b8e80941Smrg unreachable("invalid type"); 31b8e80941Smrg } 32b8e80941Smrg } 33b8e80941Smrg break; 34b8e80941Smrg 35b8e80941Smrg case ir_unop_neg: 36b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 37b8e80941Smrg switch (op[0]->type->base_type) { 38b8e80941Smrg case GLSL_TYPE_UINT: 39b8e80941Smrg data.u[c] = -((int) op[0]->value.u[c]); 40b8e80941Smrg break; 41b8e80941Smrg case GLSL_TYPE_INT: 42b8e80941Smrg data.i[c] = -op[0]->value.i[c]; 43b8e80941Smrg break; 44b8e80941Smrg case GLSL_TYPE_FLOAT: 45b8e80941Smrg data.f[c] = -op[0]->value.f[c]; 46b8e80941Smrg break; 47b8e80941Smrg case GLSL_TYPE_DOUBLE: 48b8e80941Smrg data.d[c] = -op[0]->value.d[c]; 49b8e80941Smrg break; 50b8e80941Smrg case GLSL_TYPE_UINT64: 51b8e80941Smrg data.u64[c] = -op[0]->value.u64[c]; 52b8e80941Smrg break; 53b8e80941Smrg case GLSL_TYPE_INT64: 54b8e80941Smrg data.i64[c] = -op[0]->value.i64[c]; 55b8e80941Smrg break; 56b8e80941Smrg default: 57b8e80941Smrg unreachable("invalid type"); 58b8e80941Smrg } 59b8e80941Smrg } 60b8e80941Smrg break; 61b8e80941Smrg 62b8e80941Smrg case ir_unop_abs: 63b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 64b8e80941Smrg switch (op[0]->type->base_type) { 65b8e80941Smrg case GLSL_TYPE_INT: 66b8e80941Smrg data.i[c] = op[0]->value.i[c] < 0 ? -op[0]->value.i[c] : op[0]->value.i[c]; 67b8e80941Smrg break; 68b8e80941Smrg case GLSL_TYPE_FLOAT: 69b8e80941Smrg data.f[c] = fabsf(op[0]->value.f[c]); 70b8e80941Smrg break; 71b8e80941Smrg case GLSL_TYPE_DOUBLE: 72b8e80941Smrg data.d[c] = fabs(op[0]->value.d[c]); 73b8e80941Smrg break; 74b8e80941Smrg case GLSL_TYPE_INT64: 75b8e80941Smrg data.i64[c] = op[0]->value.i64[c] < 0 ? -op[0]->value.i64[c] : op[0]->value.i64[c]; 76b8e80941Smrg break; 77b8e80941Smrg default: 78b8e80941Smrg unreachable("invalid type"); 79b8e80941Smrg } 80b8e80941Smrg } 81b8e80941Smrg break; 82b8e80941Smrg 83b8e80941Smrg case ir_unop_sign: 84b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 85b8e80941Smrg switch (op[0]->type->base_type) { 86b8e80941Smrg case GLSL_TYPE_INT: 87b8e80941Smrg data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0); 88b8e80941Smrg break; 89b8e80941Smrg case GLSL_TYPE_FLOAT: 90b8e80941Smrg data.f[c] = float((op[0]->value.f[c] > 0.0F) - (op[0]->value.f[c] < 0.0F)); 91b8e80941Smrg break; 92b8e80941Smrg case GLSL_TYPE_DOUBLE: 93b8e80941Smrg data.d[c] = double((op[0]->value.d[c] > 0.0) - (op[0]->value.d[c] < 0.0)); 94b8e80941Smrg break; 95b8e80941Smrg case GLSL_TYPE_INT64: 96b8e80941Smrg data.i64[c] = (op[0]->value.i64[c] > 0) - (op[0]->value.i64[c] < 0); 97b8e80941Smrg break; 98b8e80941Smrg default: 99b8e80941Smrg unreachable("invalid type"); 100b8e80941Smrg } 101b8e80941Smrg } 102b8e80941Smrg break; 103b8e80941Smrg 104b8e80941Smrg case ir_unop_rcp: 105b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 106b8e80941Smrg switch (op[0]->type->base_type) { 107b8e80941Smrg case GLSL_TYPE_FLOAT: 108b8e80941Smrg data.f[c] = 1.0F / op[0]->value.f[c]; 109b8e80941Smrg break; 110b8e80941Smrg case GLSL_TYPE_DOUBLE: 111b8e80941Smrg data.d[c] = 1.0 / op[0]->value.d[c]; 112b8e80941Smrg break; 113b8e80941Smrg default: 114b8e80941Smrg unreachable("invalid type"); 115b8e80941Smrg } 116b8e80941Smrg } 117b8e80941Smrg break; 118b8e80941Smrg 119b8e80941Smrg case ir_unop_rsq: 120b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 121b8e80941Smrg switch (op[0]->type->base_type) { 122b8e80941Smrg case GLSL_TYPE_FLOAT: 123b8e80941Smrg data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]); 124b8e80941Smrg break; 125b8e80941Smrg case GLSL_TYPE_DOUBLE: 126b8e80941Smrg data.d[c] = 1.0 / sqrt(op[0]->value.d[c]); 127b8e80941Smrg break; 128b8e80941Smrg default: 129b8e80941Smrg unreachable("invalid type"); 130b8e80941Smrg } 131b8e80941Smrg } 132b8e80941Smrg break; 133b8e80941Smrg 134b8e80941Smrg case ir_unop_sqrt: 135b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 136b8e80941Smrg switch (op[0]->type->base_type) { 137b8e80941Smrg case GLSL_TYPE_FLOAT: 138b8e80941Smrg data.f[c] = sqrtf(op[0]->value.f[c]); 139b8e80941Smrg break; 140b8e80941Smrg case GLSL_TYPE_DOUBLE: 141b8e80941Smrg data.d[c] = sqrt(op[0]->value.d[c]); 142b8e80941Smrg break; 143b8e80941Smrg default: 144b8e80941Smrg unreachable("invalid type"); 145b8e80941Smrg } 146b8e80941Smrg } 147b8e80941Smrg break; 148b8e80941Smrg 149b8e80941Smrg case ir_unop_exp: 150b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 151b8e80941Smrg switch (op[0]->type->base_type) { 152b8e80941Smrg case GLSL_TYPE_FLOAT: 153b8e80941Smrg data.f[c] = expf(op[0]->value.f[c]); 154b8e80941Smrg break; 155b8e80941Smrg default: 156b8e80941Smrg unreachable("invalid type"); 157b8e80941Smrg } 158b8e80941Smrg } 159b8e80941Smrg break; 160b8e80941Smrg 161b8e80941Smrg case ir_unop_log: 162b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 163b8e80941Smrg switch (op[0]->type->base_type) { 164b8e80941Smrg case GLSL_TYPE_FLOAT: 165b8e80941Smrg data.f[c] = logf(op[0]->value.f[c]); 166b8e80941Smrg break; 167b8e80941Smrg default: 168b8e80941Smrg unreachable("invalid type"); 169b8e80941Smrg } 170b8e80941Smrg } 171b8e80941Smrg break; 172b8e80941Smrg 173b8e80941Smrg case ir_unop_exp2: 174b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 175b8e80941Smrg switch (op[0]->type->base_type) { 176b8e80941Smrg case GLSL_TYPE_FLOAT: 177b8e80941Smrg data.f[c] = exp2f(op[0]->value.f[c]); 178b8e80941Smrg break; 179b8e80941Smrg default: 180b8e80941Smrg unreachable("invalid type"); 181b8e80941Smrg } 182b8e80941Smrg } 183b8e80941Smrg break; 184b8e80941Smrg 185b8e80941Smrg case ir_unop_log2: 186b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 187b8e80941Smrg switch (op[0]->type->base_type) { 188b8e80941Smrg case GLSL_TYPE_FLOAT: 189b8e80941Smrg data.f[c] = log2f(op[0]->value.f[c]); 190b8e80941Smrg break; 191b8e80941Smrg default: 192b8e80941Smrg unreachable("invalid type"); 193b8e80941Smrg } 194b8e80941Smrg } 195b8e80941Smrg break; 196b8e80941Smrg 197b8e80941Smrg case ir_unop_f2i: 198b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 199b8e80941Smrg switch (op[0]->type->base_type) { 200b8e80941Smrg case GLSL_TYPE_FLOAT: 201b8e80941Smrg data.i[c] = (int) op[0]->value.f[c]; 202b8e80941Smrg break; 203b8e80941Smrg default: 204b8e80941Smrg unreachable("invalid type"); 205b8e80941Smrg } 206b8e80941Smrg } 207b8e80941Smrg break; 208b8e80941Smrg 209b8e80941Smrg case ir_unop_f2u: 210b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 211b8e80941Smrg switch (op[0]->type->base_type) { 212b8e80941Smrg case GLSL_TYPE_FLOAT: 213b8e80941Smrg data.u[c] = (unsigned) op[0]->value.f[c]; 214b8e80941Smrg break; 215b8e80941Smrg default: 216b8e80941Smrg unreachable("invalid type"); 217b8e80941Smrg } 218b8e80941Smrg } 219b8e80941Smrg break; 220b8e80941Smrg 221b8e80941Smrg case ir_unop_i2f: 222b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 223b8e80941Smrg switch (op[0]->type->base_type) { 224b8e80941Smrg case GLSL_TYPE_INT: 225b8e80941Smrg data.f[c] = (float) op[0]->value.i[c]; 226b8e80941Smrg break; 227b8e80941Smrg default: 228b8e80941Smrg unreachable("invalid type"); 229b8e80941Smrg } 230b8e80941Smrg } 231b8e80941Smrg break; 232b8e80941Smrg 233b8e80941Smrg case ir_unop_f2b: 234b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 235b8e80941Smrg switch (op[0]->type->base_type) { 236b8e80941Smrg case GLSL_TYPE_FLOAT: 237b8e80941Smrg data.b[c] = op[0]->value.f[c] != 0.0F ? true : false; 238b8e80941Smrg break; 239b8e80941Smrg default: 240b8e80941Smrg unreachable("invalid type"); 241b8e80941Smrg } 242b8e80941Smrg } 243b8e80941Smrg break; 244b8e80941Smrg 245b8e80941Smrg case ir_unop_b2f: 246b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 247b8e80941Smrg switch (op[0]->type->base_type) { 248b8e80941Smrg case GLSL_TYPE_BOOL: 249b8e80941Smrg data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F; 250b8e80941Smrg break; 251b8e80941Smrg default: 252b8e80941Smrg unreachable("invalid type"); 253b8e80941Smrg } 254b8e80941Smrg } 255b8e80941Smrg break; 256b8e80941Smrg 257b8e80941Smrg case ir_unop_i2b: 258b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 259b8e80941Smrg switch (op[0]->type->base_type) { 260b8e80941Smrg case GLSL_TYPE_UINT: 261b8e80941Smrg data.b[c] = op[0]->value.u[c] ? true : false; 262b8e80941Smrg break; 263b8e80941Smrg case GLSL_TYPE_INT: 264b8e80941Smrg data.b[c] = op[0]->value.i[c] ? true : false; 265b8e80941Smrg break; 266b8e80941Smrg default: 267b8e80941Smrg unreachable("invalid type"); 268b8e80941Smrg } 269b8e80941Smrg } 270b8e80941Smrg break; 271b8e80941Smrg 272b8e80941Smrg case ir_unop_b2i: 273b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 274b8e80941Smrg switch (op[0]->type->base_type) { 275b8e80941Smrg case GLSL_TYPE_BOOL: 276b8e80941Smrg data.i[c] = op[0]->value.b[c] ? 1 : 0; 277b8e80941Smrg break; 278b8e80941Smrg default: 279b8e80941Smrg unreachable("invalid type"); 280b8e80941Smrg } 281b8e80941Smrg } 282b8e80941Smrg break; 283b8e80941Smrg 284b8e80941Smrg case ir_unop_u2f: 285b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 286b8e80941Smrg switch (op[0]->type->base_type) { 287b8e80941Smrg case GLSL_TYPE_UINT: 288b8e80941Smrg data.f[c] = (float) op[0]->value.u[c]; 289b8e80941Smrg break; 290b8e80941Smrg default: 291b8e80941Smrg unreachable("invalid type"); 292b8e80941Smrg } 293b8e80941Smrg } 294b8e80941Smrg break; 295b8e80941Smrg 296b8e80941Smrg case ir_unop_i2u: 297b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 298b8e80941Smrg switch (op[0]->type->base_type) { 299b8e80941Smrg case GLSL_TYPE_INT: 300b8e80941Smrg data.u[c] = op[0]->value.i[c]; 301b8e80941Smrg break; 302b8e80941Smrg default: 303b8e80941Smrg unreachable("invalid type"); 304b8e80941Smrg } 305b8e80941Smrg } 306b8e80941Smrg break; 307b8e80941Smrg 308b8e80941Smrg case ir_unop_u2i: 309b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 310b8e80941Smrg switch (op[0]->type->base_type) { 311b8e80941Smrg case GLSL_TYPE_UINT: 312b8e80941Smrg data.i[c] = op[0]->value.u[c]; 313b8e80941Smrg break; 314b8e80941Smrg default: 315b8e80941Smrg unreachable("invalid type"); 316b8e80941Smrg } 317b8e80941Smrg } 318b8e80941Smrg break; 319b8e80941Smrg 320b8e80941Smrg case ir_unop_d2f: 321b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 322b8e80941Smrg switch (op[0]->type->base_type) { 323b8e80941Smrg case GLSL_TYPE_DOUBLE: 324b8e80941Smrg data.f[c] = op[0]->value.d[c]; 325b8e80941Smrg break; 326b8e80941Smrg default: 327b8e80941Smrg unreachable("invalid type"); 328b8e80941Smrg } 329b8e80941Smrg } 330b8e80941Smrg break; 331b8e80941Smrg 332b8e80941Smrg case ir_unop_f2d: 333b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 334b8e80941Smrg switch (op[0]->type->base_type) { 335b8e80941Smrg case GLSL_TYPE_FLOAT: 336b8e80941Smrg data.d[c] = op[0]->value.f[c]; 337b8e80941Smrg break; 338b8e80941Smrg default: 339b8e80941Smrg unreachable("invalid type"); 340b8e80941Smrg } 341b8e80941Smrg } 342b8e80941Smrg break; 343b8e80941Smrg 344b8e80941Smrg case ir_unop_d2i: 345b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 346b8e80941Smrg switch (op[0]->type->base_type) { 347b8e80941Smrg case GLSL_TYPE_DOUBLE: 348b8e80941Smrg data.i[c] = op[0]->value.d[c]; 349b8e80941Smrg break; 350b8e80941Smrg default: 351b8e80941Smrg unreachable("invalid type"); 352b8e80941Smrg } 353b8e80941Smrg } 354b8e80941Smrg break; 355b8e80941Smrg 356b8e80941Smrg case ir_unop_i2d: 357b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 358b8e80941Smrg switch (op[0]->type->base_type) { 359b8e80941Smrg case GLSL_TYPE_INT: 360b8e80941Smrg data.d[c] = op[0]->value.i[c]; 361b8e80941Smrg break; 362b8e80941Smrg default: 363b8e80941Smrg unreachable("invalid type"); 364b8e80941Smrg } 365b8e80941Smrg } 366b8e80941Smrg break; 367b8e80941Smrg 368b8e80941Smrg case ir_unop_d2u: 369b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 370b8e80941Smrg switch (op[0]->type->base_type) { 371b8e80941Smrg case GLSL_TYPE_DOUBLE: 372b8e80941Smrg data.u[c] = op[0]->value.d[c]; 373b8e80941Smrg break; 374b8e80941Smrg default: 375b8e80941Smrg unreachable("invalid type"); 376b8e80941Smrg } 377b8e80941Smrg } 378b8e80941Smrg break; 379b8e80941Smrg 380b8e80941Smrg case ir_unop_u2d: 381b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 382b8e80941Smrg switch (op[0]->type->base_type) { 383b8e80941Smrg case GLSL_TYPE_UINT: 384b8e80941Smrg data.d[c] = op[0]->value.u[c]; 385b8e80941Smrg break; 386b8e80941Smrg default: 387b8e80941Smrg unreachable("invalid type"); 388b8e80941Smrg } 389b8e80941Smrg } 390b8e80941Smrg break; 391b8e80941Smrg 392b8e80941Smrg case ir_unop_d2b: 393b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 394b8e80941Smrg switch (op[0]->type->base_type) { 395b8e80941Smrg case GLSL_TYPE_DOUBLE: 396b8e80941Smrg data.b[c] = op[0]->value.d[c] != 0.0; 397b8e80941Smrg break; 398b8e80941Smrg default: 399b8e80941Smrg unreachable("invalid type"); 400b8e80941Smrg } 401b8e80941Smrg } 402b8e80941Smrg break; 403b8e80941Smrg 404b8e80941Smrg case ir_unop_bitcast_i2f: 405b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 406b8e80941Smrg switch (op[0]->type->base_type) { 407b8e80941Smrg case GLSL_TYPE_INT: 408b8e80941Smrg data.f[c] = bitcast_u2f(op[0]->value.i[c]); 409b8e80941Smrg break; 410b8e80941Smrg default: 411b8e80941Smrg unreachable("invalid type"); 412b8e80941Smrg } 413b8e80941Smrg } 414b8e80941Smrg break; 415b8e80941Smrg 416b8e80941Smrg case ir_unop_bitcast_f2i: 417b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 418b8e80941Smrg switch (op[0]->type->base_type) { 419b8e80941Smrg case GLSL_TYPE_FLOAT: 420b8e80941Smrg data.i[c] = bitcast_f2u(op[0]->value.f[c]); 421b8e80941Smrg break; 422b8e80941Smrg default: 423b8e80941Smrg unreachable("invalid type"); 424b8e80941Smrg } 425b8e80941Smrg } 426b8e80941Smrg break; 427b8e80941Smrg 428b8e80941Smrg case ir_unop_bitcast_u2f: 429b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 430b8e80941Smrg switch (op[0]->type->base_type) { 431b8e80941Smrg case GLSL_TYPE_UINT: 432b8e80941Smrg data.f[c] = bitcast_u2f(op[0]->value.u[c]); 433b8e80941Smrg break; 434b8e80941Smrg default: 435b8e80941Smrg unreachable("invalid type"); 436b8e80941Smrg } 437b8e80941Smrg } 438b8e80941Smrg break; 439b8e80941Smrg 440b8e80941Smrg case ir_unop_bitcast_f2u: 441b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 442b8e80941Smrg switch (op[0]->type->base_type) { 443b8e80941Smrg case GLSL_TYPE_FLOAT: 444b8e80941Smrg data.u[c] = bitcast_f2u(op[0]->value.f[c]); 445b8e80941Smrg break; 446b8e80941Smrg default: 447b8e80941Smrg unreachable("invalid type"); 448b8e80941Smrg } 449b8e80941Smrg } 450b8e80941Smrg break; 451b8e80941Smrg 452b8e80941Smrg case ir_unop_bitcast_u642d: 453b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 454b8e80941Smrg switch (op[0]->type->base_type) { 455b8e80941Smrg case GLSL_TYPE_UINT64: 456b8e80941Smrg data.d[c] = bitcast_u642d(op[0]->value.u64[c]); 457b8e80941Smrg break; 458b8e80941Smrg default: 459b8e80941Smrg unreachable("invalid type"); 460b8e80941Smrg } 461b8e80941Smrg } 462b8e80941Smrg break; 463b8e80941Smrg 464b8e80941Smrg case ir_unop_bitcast_i642d: 465b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 466b8e80941Smrg switch (op[0]->type->base_type) { 467b8e80941Smrg case GLSL_TYPE_INT64: 468b8e80941Smrg data.d[c] = bitcast_i642d(op[0]->value.i64[c]); 469b8e80941Smrg break; 470b8e80941Smrg default: 471b8e80941Smrg unreachable("invalid type"); 472b8e80941Smrg } 473b8e80941Smrg } 474b8e80941Smrg break; 475b8e80941Smrg 476b8e80941Smrg case ir_unop_bitcast_d2u64: 477b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 478b8e80941Smrg switch (op[0]->type->base_type) { 479b8e80941Smrg case GLSL_TYPE_DOUBLE: 480b8e80941Smrg data.u64[c] = bitcast_d2u64(op[0]->value.d[c]); 481b8e80941Smrg break; 482b8e80941Smrg default: 483b8e80941Smrg unreachable("invalid type"); 484b8e80941Smrg } 485b8e80941Smrg } 486b8e80941Smrg break; 487b8e80941Smrg 488b8e80941Smrg case ir_unop_bitcast_d2i64: 489b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 490b8e80941Smrg switch (op[0]->type->base_type) { 491b8e80941Smrg case GLSL_TYPE_DOUBLE: 492b8e80941Smrg data.i64[c] = bitcast_d2i64(op[0]->value.d[c]); 493b8e80941Smrg break; 494b8e80941Smrg default: 495b8e80941Smrg unreachable("invalid type"); 496b8e80941Smrg } 497b8e80941Smrg } 498b8e80941Smrg break; 499b8e80941Smrg 500b8e80941Smrg case ir_unop_i642i: 501b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 502b8e80941Smrg switch (op[0]->type->base_type) { 503b8e80941Smrg case GLSL_TYPE_INT64: 504b8e80941Smrg data.i[c] = op[0]->value.i64[c]; 505b8e80941Smrg break; 506b8e80941Smrg default: 507b8e80941Smrg unreachable("invalid type"); 508b8e80941Smrg } 509b8e80941Smrg } 510b8e80941Smrg break; 511b8e80941Smrg 512b8e80941Smrg case ir_unop_u642i: 513b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 514b8e80941Smrg switch (op[0]->type->base_type) { 515b8e80941Smrg case GLSL_TYPE_UINT64: 516b8e80941Smrg data.i[c] = op[0]->value.u64[c]; 517b8e80941Smrg break; 518b8e80941Smrg default: 519b8e80941Smrg unreachable("invalid type"); 520b8e80941Smrg } 521b8e80941Smrg } 522b8e80941Smrg break; 523b8e80941Smrg 524b8e80941Smrg case ir_unop_i642u: 525b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 526b8e80941Smrg switch (op[0]->type->base_type) { 527b8e80941Smrg case GLSL_TYPE_INT64: 528b8e80941Smrg data.u[c] = op[0]->value.i64[c]; 529b8e80941Smrg break; 530b8e80941Smrg default: 531b8e80941Smrg unreachable("invalid type"); 532b8e80941Smrg } 533b8e80941Smrg } 534b8e80941Smrg break; 535b8e80941Smrg 536b8e80941Smrg case ir_unop_u642u: 537b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 538b8e80941Smrg switch (op[0]->type->base_type) { 539b8e80941Smrg case GLSL_TYPE_UINT64: 540b8e80941Smrg data.u[c] = op[0]->value.u64[c]; 541b8e80941Smrg break; 542b8e80941Smrg default: 543b8e80941Smrg unreachable("invalid type"); 544b8e80941Smrg } 545b8e80941Smrg } 546b8e80941Smrg break; 547b8e80941Smrg 548b8e80941Smrg case ir_unop_i642b: 549b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 550b8e80941Smrg switch (op[0]->type->base_type) { 551b8e80941Smrg case GLSL_TYPE_INT64: 552b8e80941Smrg data.b[c] = op[0]->value.i64[c] != 0; 553b8e80941Smrg break; 554b8e80941Smrg default: 555b8e80941Smrg unreachable("invalid type"); 556b8e80941Smrg } 557b8e80941Smrg } 558b8e80941Smrg break; 559b8e80941Smrg 560b8e80941Smrg case ir_unop_i642f: 561b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 562b8e80941Smrg switch (op[0]->type->base_type) { 563b8e80941Smrg case GLSL_TYPE_INT64: 564b8e80941Smrg data.f[c] = op[0]->value.i64[c]; 565b8e80941Smrg break; 566b8e80941Smrg default: 567b8e80941Smrg unreachable("invalid type"); 568b8e80941Smrg } 569b8e80941Smrg } 570b8e80941Smrg break; 571b8e80941Smrg 572b8e80941Smrg case ir_unop_u642f: 573b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 574b8e80941Smrg switch (op[0]->type->base_type) { 575b8e80941Smrg case GLSL_TYPE_UINT64: 576b8e80941Smrg data.f[c] = op[0]->value.u64[c]; 577b8e80941Smrg break; 578b8e80941Smrg default: 579b8e80941Smrg unreachable("invalid type"); 580b8e80941Smrg } 581b8e80941Smrg } 582b8e80941Smrg break; 583b8e80941Smrg 584b8e80941Smrg case ir_unop_i642d: 585b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 586b8e80941Smrg switch (op[0]->type->base_type) { 587b8e80941Smrg case GLSL_TYPE_INT64: 588b8e80941Smrg data.d[c] = op[0]->value.i64[c]; 589b8e80941Smrg break; 590b8e80941Smrg default: 591b8e80941Smrg unreachable("invalid type"); 592b8e80941Smrg } 593b8e80941Smrg } 594b8e80941Smrg break; 595b8e80941Smrg 596b8e80941Smrg case ir_unop_u642d: 597b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 598b8e80941Smrg switch (op[0]->type->base_type) { 599b8e80941Smrg case GLSL_TYPE_UINT64: 600b8e80941Smrg data.d[c] = op[0]->value.u64[c]; 601b8e80941Smrg break; 602b8e80941Smrg default: 603b8e80941Smrg unreachable("invalid type"); 604b8e80941Smrg } 605b8e80941Smrg } 606b8e80941Smrg break; 607b8e80941Smrg 608b8e80941Smrg case ir_unop_i2i64: 609b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 610b8e80941Smrg switch (op[0]->type->base_type) { 611b8e80941Smrg case GLSL_TYPE_INT: 612b8e80941Smrg data.i64[c] = op[0]->value.i[c]; 613b8e80941Smrg break; 614b8e80941Smrg default: 615b8e80941Smrg unreachable("invalid type"); 616b8e80941Smrg } 617b8e80941Smrg } 618b8e80941Smrg break; 619b8e80941Smrg 620b8e80941Smrg case ir_unop_u2i64: 621b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 622b8e80941Smrg switch (op[0]->type->base_type) { 623b8e80941Smrg case GLSL_TYPE_UINT: 624b8e80941Smrg data.i64[c] = op[0]->value.u[c]; 625b8e80941Smrg break; 626b8e80941Smrg default: 627b8e80941Smrg unreachable("invalid type"); 628b8e80941Smrg } 629b8e80941Smrg } 630b8e80941Smrg break; 631b8e80941Smrg 632b8e80941Smrg case ir_unop_b2i64: 633b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 634b8e80941Smrg switch (op[0]->type->base_type) { 635b8e80941Smrg case GLSL_TYPE_BOOL: 636b8e80941Smrg data.i64[c] = op[0]->value.b[c]; 637b8e80941Smrg break; 638b8e80941Smrg default: 639b8e80941Smrg unreachable("invalid type"); 640b8e80941Smrg } 641b8e80941Smrg } 642b8e80941Smrg break; 643b8e80941Smrg 644b8e80941Smrg case ir_unop_f2i64: 645b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 646b8e80941Smrg switch (op[0]->type->base_type) { 647b8e80941Smrg case GLSL_TYPE_FLOAT: 648b8e80941Smrg data.i64[c] = op[0]->value.f[c]; 649b8e80941Smrg break; 650b8e80941Smrg default: 651b8e80941Smrg unreachable("invalid type"); 652b8e80941Smrg } 653b8e80941Smrg } 654b8e80941Smrg break; 655b8e80941Smrg 656b8e80941Smrg case ir_unop_d2i64: 657b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 658b8e80941Smrg switch (op[0]->type->base_type) { 659b8e80941Smrg case GLSL_TYPE_DOUBLE: 660b8e80941Smrg data.i64[c] = op[0]->value.d[c]; 661b8e80941Smrg break; 662b8e80941Smrg default: 663b8e80941Smrg unreachable("invalid type"); 664b8e80941Smrg } 665b8e80941Smrg } 666b8e80941Smrg break; 667b8e80941Smrg 668b8e80941Smrg case ir_unop_i2u64: 669b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 670b8e80941Smrg switch (op[0]->type->base_type) { 671b8e80941Smrg case GLSL_TYPE_INT: 672b8e80941Smrg data.u64[c] = op[0]->value.i[c]; 673b8e80941Smrg break; 674b8e80941Smrg default: 675b8e80941Smrg unreachable("invalid type"); 676b8e80941Smrg } 677b8e80941Smrg } 678b8e80941Smrg break; 679b8e80941Smrg 680b8e80941Smrg case ir_unop_u2u64: 681b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 682b8e80941Smrg switch (op[0]->type->base_type) { 683b8e80941Smrg case GLSL_TYPE_UINT: 684b8e80941Smrg data.u64[c] = op[0]->value.u[c]; 685b8e80941Smrg break; 686b8e80941Smrg default: 687b8e80941Smrg unreachable("invalid type"); 688b8e80941Smrg } 689b8e80941Smrg } 690b8e80941Smrg break; 691b8e80941Smrg 692b8e80941Smrg case ir_unop_f2u64: 693b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 694b8e80941Smrg switch (op[0]->type->base_type) { 695b8e80941Smrg case GLSL_TYPE_FLOAT: 696b8e80941Smrg data.u64[c] = op[0]->value.f[c]; 697b8e80941Smrg break; 698b8e80941Smrg default: 699b8e80941Smrg unreachable("invalid type"); 700b8e80941Smrg } 701b8e80941Smrg } 702b8e80941Smrg break; 703b8e80941Smrg 704b8e80941Smrg case ir_unop_d2u64: 705b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 706b8e80941Smrg switch (op[0]->type->base_type) { 707b8e80941Smrg case GLSL_TYPE_DOUBLE: 708b8e80941Smrg data.u64[c] = op[0]->value.d[c]; 709b8e80941Smrg break; 710b8e80941Smrg default: 711b8e80941Smrg unreachable("invalid type"); 712b8e80941Smrg } 713b8e80941Smrg } 714b8e80941Smrg break; 715b8e80941Smrg 716b8e80941Smrg case ir_unop_u642i64: 717b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 718b8e80941Smrg switch (op[0]->type->base_type) { 719b8e80941Smrg case GLSL_TYPE_UINT64: 720b8e80941Smrg data.i64[c] = op[0]->value.u64[c]; 721b8e80941Smrg break; 722b8e80941Smrg default: 723b8e80941Smrg unreachable("invalid type"); 724b8e80941Smrg } 725b8e80941Smrg } 726b8e80941Smrg break; 727b8e80941Smrg 728b8e80941Smrg case ir_unop_i642u64: 729b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 730b8e80941Smrg switch (op[0]->type->base_type) { 731b8e80941Smrg case GLSL_TYPE_INT64: 732b8e80941Smrg data.u64[c] = op[0]->value.i64[c]; 733b8e80941Smrg break; 734b8e80941Smrg default: 735b8e80941Smrg unreachable("invalid type"); 736b8e80941Smrg } 737b8e80941Smrg } 738b8e80941Smrg break; 739b8e80941Smrg 740b8e80941Smrg case ir_unop_trunc: 741b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 742b8e80941Smrg switch (op[0]->type->base_type) { 743b8e80941Smrg case GLSL_TYPE_FLOAT: 744b8e80941Smrg data.f[c] = truncf(op[0]->value.f[c]); 745b8e80941Smrg break; 746b8e80941Smrg case GLSL_TYPE_DOUBLE: 747b8e80941Smrg data.d[c] = trunc(op[0]->value.d[c]); 748b8e80941Smrg break; 749b8e80941Smrg default: 750b8e80941Smrg unreachable("invalid type"); 751b8e80941Smrg } 752b8e80941Smrg } 753b8e80941Smrg break; 754b8e80941Smrg 755b8e80941Smrg case ir_unop_ceil: 756b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 757b8e80941Smrg switch (op[0]->type->base_type) { 758b8e80941Smrg case GLSL_TYPE_FLOAT: 759b8e80941Smrg data.f[c] = ceilf(op[0]->value.f[c]); 760b8e80941Smrg break; 761b8e80941Smrg case GLSL_TYPE_DOUBLE: 762b8e80941Smrg data.d[c] = ceil(op[0]->value.d[c]); 763b8e80941Smrg break; 764b8e80941Smrg default: 765b8e80941Smrg unreachable("invalid type"); 766b8e80941Smrg } 767b8e80941Smrg } 768b8e80941Smrg break; 769b8e80941Smrg 770b8e80941Smrg case ir_unop_floor: 771b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 772b8e80941Smrg switch (op[0]->type->base_type) { 773b8e80941Smrg case GLSL_TYPE_FLOAT: 774b8e80941Smrg data.f[c] = floorf(op[0]->value.f[c]); 775b8e80941Smrg break; 776b8e80941Smrg case GLSL_TYPE_DOUBLE: 777b8e80941Smrg data.d[c] = floor(op[0]->value.d[c]); 778b8e80941Smrg break; 779b8e80941Smrg default: 780b8e80941Smrg unreachable("invalid type"); 781b8e80941Smrg } 782b8e80941Smrg } 783b8e80941Smrg break; 784b8e80941Smrg 785b8e80941Smrg case ir_unop_fract: 786b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 787b8e80941Smrg switch (op[0]->type->base_type) { 788b8e80941Smrg case GLSL_TYPE_FLOAT: 789b8e80941Smrg data.f[c] = op[0]->value.f[c] - floorf(op[0]->value.f[c]); 790b8e80941Smrg break; 791b8e80941Smrg case GLSL_TYPE_DOUBLE: 792b8e80941Smrg data.d[c] = op[0]->value.d[c] - floor(op[0]->value.d[c]); 793b8e80941Smrg break; 794b8e80941Smrg default: 795b8e80941Smrg unreachable("invalid type"); 796b8e80941Smrg } 797b8e80941Smrg } 798b8e80941Smrg break; 799b8e80941Smrg 800b8e80941Smrg case ir_unop_round_even: 801b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 802b8e80941Smrg switch (op[0]->type->base_type) { 803b8e80941Smrg case GLSL_TYPE_FLOAT: 804b8e80941Smrg data.f[c] = _mesa_roundevenf(op[0]->value.f[c]); 805b8e80941Smrg break; 806b8e80941Smrg case GLSL_TYPE_DOUBLE: 807b8e80941Smrg data.d[c] = _mesa_roundeven(op[0]->value.d[c]); 808b8e80941Smrg break; 809b8e80941Smrg default: 810b8e80941Smrg unreachable("invalid type"); 811b8e80941Smrg } 812b8e80941Smrg } 813b8e80941Smrg break; 814b8e80941Smrg 815b8e80941Smrg case ir_unop_sin: 816b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 817b8e80941Smrg switch (op[0]->type->base_type) { 818b8e80941Smrg case GLSL_TYPE_FLOAT: 819b8e80941Smrg data.f[c] = sinf(op[0]->value.f[c]); 820b8e80941Smrg break; 821b8e80941Smrg default: 822b8e80941Smrg unreachable("invalid type"); 823b8e80941Smrg } 824b8e80941Smrg } 825b8e80941Smrg break; 826b8e80941Smrg 827b8e80941Smrg case ir_unop_cos: 828b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 829b8e80941Smrg switch (op[0]->type->base_type) { 830b8e80941Smrg case GLSL_TYPE_FLOAT: 831b8e80941Smrg data.f[c] = cosf(op[0]->value.f[c]); 832b8e80941Smrg break; 833b8e80941Smrg default: 834b8e80941Smrg unreachable("invalid type"); 835b8e80941Smrg } 836b8e80941Smrg } 837b8e80941Smrg break; 838b8e80941Smrg 839b8e80941Smrg case ir_unop_dFdx: 840b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 841b8e80941Smrg switch (op[0]->type->base_type) { 842b8e80941Smrg case GLSL_TYPE_FLOAT: 843b8e80941Smrg data.f[c] = 0.0f; 844b8e80941Smrg break; 845b8e80941Smrg default: 846b8e80941Smrg unreachable("invalid type"); 847b8e80941Smrg } 848b8e80941Smrg } 849b8e80941Smrg break; 850b8e80941Smrg 851b8e80941Smrg case ir_unop_dFdx_coarse: 852b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 853b8e80941Smrg switch (op[0]->type->base_type) { 854b8e80941Smrg case GLSL_TYPE_FLOAT: 855b8e80941Smrg data.f[c] = 0.0f; 856b8e80941Smrg break; 857b8e80941Smrg default: 858b8e80941Smrg unreachable("invalid type"); 859b8e80941Smrg } 860b8e80941Smrg } 861b8e80941Smrg break; 862b8e80941Smrg 863b8e80941Smrg case ir_unop_dFdx_fine: 864b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 865b8e80941Smrg switch (op[0]->type->base_type) { 866b8e80941Smrg case GLSL_TYPE_FLOAT: 867b8e80941Smrg data.f[c] = 0.0f; 868b8e80941Smrg break; 869b8e80941Smrg default: 870b8e80941Smrg unreachable("invalid type"); 871b8e80941Smrg } 872b8e80941Smrg } 873b8e80941Smrg break; 874b8e80941Smrg 875b8e80941Smrg case ir_unop_dFdy: 876b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 877b8e80941Smrg switch (op[0]->type->base_type) { 878b8e80941Smrg case GLSL_TYPE_FLOAT: 879b8e80941Smrg data.f[c] = 0.0f; 880b8e80941Smrg break; 881b8e80941Smrg default: 882b8e80941Smrg unreachable("invalid type"); 883b8e80941Smrg } 884b8e80941Smrg } 885b8e80941Smrg break; 886b8e80941Smrg 887b8e80941Smrg case ir_unop_dFdy_coarse: 888b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 889b8e80941Smrg switch (op[0]->type->base_type) { 890b8e80941Smrg case GLSL_TYPE_FLOAT: 891b8e80941Smrg data.f[c] = 0.0f; 892b8e80941Smrg break; 893b8e80941Smrg default: 894b8e80941Smrg unreachable("invalid type"); 895b8e80941Smrg } 896b8e80941Smrg } 897b8e80941Smrg break; 898b8e80941Smrg 899b8e80941Smrg case ir_unop_dFdy_fine: 900b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 901b8e80941Smrg switch (op[0]->type->base_type) { 902b8e80941Smrg case GLSL_TYPE_FLOAT: 903b8e80941Smrg data.f[c] = 0.0f; 904b8e80941Smrg break; 905b8e80941Smrg default: 906b8e80941Smrg unreachable("invalid type"); 907b8e80941Smrg } 908b8e80941Smrg } 909b8e80941Smrg break; 910b8e80941Smrg 911b8e80941Smrg case ir_unop_pack_snorm_2x16: 912b8e80941Smrg switch (op[0]->type->base_type) { 913b8e80941Smrg case GLSL_TYPE_FLOAT: 914b8e80941Smrg data.u[0] = pack_2x16(pack_snorm_1x16, op[0]->value.f[0], op[0]->value.f[1]); 915b8e80941Smrg break; 916b8e80941Smrg default: 917b8e80941Smrg unreachable("invalid type"); 918b8e80941Smrg } 919b8e80941Smrg break; 920b8e80941Smrg 921b8e80941Smrg case ir_unop_pack_snorm_4x8: 922b8e80941Smrg switch (op[0]->type->base_type) { 923b8e80941Smrg case GLSL_TYPE_FLOAT: 924b8e80941Smrg 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]); 925b8e80941Smrg break; 926b8e80941Smrg default: 927b8e80941Smrg unreachable("invalid type"); 928b8e80941Smrg } 929b8e80941Smrg break; 930b8e80941Smrg 931b8e80941Smrg case ir_unop_pack_unorm_2x16: 932b8e80941Smrg switch (op[0]->type->base_type) { 933b8e80941Smrg case GLSL_TYPE_FLOAT: 934b8e80941Smrg data.u[0] = pack_2x16(pack_unorm_1x16, op[0]->value.f[0], op[0]->value.f[1]); 935b8e80941Smrg break; 936b8e80941Smrg default: 937b8e80941Smrg unreachable("invalid type"); 938b8e80941Smrg } 939b8e80941Smrg break; 940b8e80941Smrg 941b8e80941Smrg case ir_unop_pack_unorm_4x8: 942b8e80941Smrg switch (op[0]->type->base_type) { 943b8e80941Smrg case GLSL_TYPE_FLOAT: 944b8e80941Smrg 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]); 945b8e80941Smrg break; 946b8e80941Smrg default: 947b8e80941Smrg unreachable("invalid type"); 948b8e80941Smrg } 949b8e80941Smrg break; 950b8e80941Smrg 951b8e80941Smrg case ir_unop_pack_half_2x16: 952b8e80941Smrg switch (op[0]->type->base_type) { 953b8e80941Smrg case GLSL_TYPE_FLOAT: 954b8e80941Smrg data.u[0] = pack_2x16(pack_half_1x16, op[0]->value.f[0], op[0]->value.f[1]); 955b8e80941Smrg break; 956b8e80941Smrg default: 957b8e80941Smrg unreachable("invalid type"); 958b8e80941Smrg } 959b8e80941Smrg break; 960b8e80941Smrg 961b8e80941Smrg case ir_unop_unpack_snorm_2x16: 962b8e80941Smrg unpack_2x16(unpack_snorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 963b8e80941Smrg break; 964b8e80941Smrg 965b8e80941Smrg case ir_unop_unpack_snorm_4x8: 966b8e80941Smrg unpack_4x8(unpack_snorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]); 967b8e80941Smrg break; 968b8e80941Smrg 969b8e80941Smrg case ir_unop_unpack_unorm_2x16: 970b8e80941Smrg unpack_2x16(unpack_unorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 971b8e80941Smrg break; 972b8e80941Smrg 973b8e80941Smrg case ir_unop_unpack_unorm_4x8: 974b8e80941Smrg unpack_4x8(unpack_unorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]); 975b8e80941Smrg break; 976b8e80941Smrg 977b8e80941Smrg case ir_unop_unpack_half_2x16: 978b8e80941Smrg unpack_2x16(unpack_half_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 979b8e80941Smrg break; 980b8e80941Smrg 981b8e80941Smrg case ir_unop_bitfield_reverse: 982b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 983b8e80941Smrg switch (op[0]->type->base_type) { 984b8e80941Smrg case GLSL_TYPE_UINT: 985b8e80941Smrg data.u[c] = bitfield_reverse(op[0]->value.u[c]); 986b8e80941Smrg break; 987b8e80941Smrg case GLSL_TYPE_INT: 988b8e80941Smrg data.i[c] = bitfield_reverse(op[0]->value.i[c]); 989b8e80941Smrg break; 990b8e80941Smrg default: 991b8e80941Smrg unreachable("invalid type"); 992b8e80941Smrg } 993b8e80941Smrg } 994b8e80941Smrg break; 995b8e80941Smrg 996b8e80941Smrg case ir_unop_bit_count: 997b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 998b8e80941Smrg switch (op[0]->type->base_type) { 999b8e80941Smrg case GLSL_TYPE_UINT: 1000b8e80941Smrg data.i[c] = util_bitcount(op[0]->value.u[c]); 1001b8e80941Smrg break; 1002b8e80941Smrg case GLSL_TYPE_INT: 1003b8e80941Smrg data.i[c] = util_bitcount(op[0]->value.i[c]); 1004b8e80941Smrg break; 1005b8e80941Smrg default: 1006b8e80941Smrg unreachable("invalid type"); 1007b8e80941Smrg } 1008b8e80941Smrg } 1009b8e80941Smrg break; 1010b8e80941Smrg 1011b8e80941Smrg case ir_unop_find_msb: 1012b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1013b8e80941Smrg switch (op[0]->type->base_type) { 1014b8e80941Smrg case GLSL_TYPE_UINT: 1015b8e80941Smrg data.i[c] = find_msb_uint(op[0]->value.u[c]); 1016b8e80941Smrg break; 1017b8e80941Smrg case GLSL_TYPE_INT: 1018b8e80941Smrg data.i[c] = find_msb_int(op[0]->value.i[c]); 1019b8e80941Smrg break; 1020b8e80941Smrg default: 1021b8e80941Smrg unreachable("invalid type"); 1022b8e80941Smrg } 1023b8e80941Smrg } 1024b8e80941Smrg break; 1025b8e80941Smrg 1026b8e80941Smrg case ir_unop_find_lsb: 1027b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1028b8e80941Smrg switch (op[0]->type->base_type) { 1029b8e80941Smrg case GLSL_TYPE_UINT: 1030b8e80941Smrg data.i[c] = find_msb_uint(op[0]->value.u[c] & -op[0]->value.u[c]); 1031b8e80941Smrg break; 1032b8e80941Smrg case GLSL_TYPE_INT: 1033b8e80941Smrg data.i[c] = find_msb_uint(op[0]->value.i[c] & -op[0]->value.i[c]); 1034b8e80941Smrg break; 1035b8e80941Smrg default: 1036b8e80941Smrg unreachable("invalid type"); 1037b8e80941Smrg } 1038b8e80941Smrg } 1039b8e80941Smrg break; 1040b8e80941Smrg 1041b8e80941Smrg case ir_unop_saturate: 1042b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1043b8e80941Smrg switch (op[0]->type->base_type) { 1044b8e80941Smrg case GLSL_TYPE_FLOAT: 1045b8e80941Smrg data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f); 1046b8e80941Smrg break; 1047b8e80941Smrg default: 1048b8e80941Smrg unreachable("invalid type"); 1049b8e80941Smrg } 1050b8e80941Smrg } 1051b8e80941Smrg break; 1052b8e80941Smrg 1053b8e80941Smrg case ir_unop_pack_double_2x32: 1054b8e80941Smrg memcpy(&data.d[0], &op[0]->value.u[0], sizeof(double)); 1055b8e80941Smrg break; 1056b8e80941Smrg 1057b8e80941Smrg case ir_unop_unpack_double_2x32: 1058b8e80941Smrg memcpy(&data.u[0], &op[0]->value.d[0], sizeof(double)); 1059b8e80941Smrg break; 1060b8e80941Smrg 1061b8e80941Smrg case ir_unop_pack_sampler_2x32: 1062b8e80941Smrg memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t)); 1063b8e80941Smrg break; 1064b8e80941Smrg 1065b8e80941Smrg case ir_unop_pack_image_2x32: 1066b8e80941Smrg memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t)); 1067b8e80941Smrg break; 1068b8e80941Smrg 1069b8e80941Smrg case ir_unop_unpack_sampler_2x32: 1070b8e80941Smrg memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t)); 1071b8e80941Smrg break; 1072b8e80941Smrg 1073b8e80941Smrg case ir_unop_unpack_image_2x32: 1074b8e80941Smrg memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t)); 1075b8e80941Smrg break; 1076b8e80941Smrg 1077b8e80941Smrg case ir_unop_pack_int_2x32: 1078b8e80941Smrg memcpy(&data.i64[0], &op[0]->value.i[0], sizeof(int64_t)); 1079b8e80941Smrg break; 1080b8e80941Smrg 1081b8e80941Smrg case ir_unop_pack_uint_2x32: 1082b8e80941Smrg memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t)); 1083b8e80941Smrg break; 1084b8e80941Smrg 1085b8e80941Smrg case ir_unop_unpack_int_2x32: 1086b8e80941Smrg memcpy(&data.i[0], &op[0]->value.i64[0], sizeof(int64_t)); 1087b8e80941Smrg break; 1088b8e80941Smrg 1089b8e80941Smrg case ir_unop_unpack_uint_2x32: 1090b8e80941Smrg memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t)); 1091b8e80941Smrg break; 1092b8e80941Smrg 1093b8e80941Smrg case ir_binop_add: 1094b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1095b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1096b8e80941Smrg c < components; 1097b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1098b8e80941Smrg 1099b8e80941Smrg switch (op[0]->type->base_type) { 1100b8e80941Smrg case GLSL_TYPE_UINT: 1101b8e80941Smrg data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1]; 1102b8e80941Smrg break; 1103b8e80941Smrg case GLSL_TYPE_INT: 1104b8e80941Smrg data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1]; 1105b8e80941Smrg break; 1106b8e80941Smrg case GLSL_TYPE_FLOAT: 1107b8e80941Smrg data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1]; 1108b8e80941Smrg break; 1109b8e80941Smrg case GLSL_TYPE_DOUBLE: 1110b8e80941Smrg data.d[c] = op[0]->value.d[c0] + op[1]->value.d[c1]; 1111b8e80941Smrg break; 1112b8e80941Smrg case GLSL_TYPE_UINT64: 1113b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] + op[1]->value.u64[c1]; 1114b8e80941Smrg break; 1115b8e80941Smrg case GLSL_TYPE_INT64: 1116b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] + op[1]->value.i64[c1]; 1117b8e80941Smrg break; 1118b8e80941Smrg default: 1119b8e80941Smrg unreachable("invalid type"); 1120b8e80941Smrg } 1121b8e80941Smrg } 1122b8e80941Smrg break; 1123b8e80941Smrg 1124b8e80941Smrg case ir_binop_sub: 1125b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1126b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1127b8e80941Smrg c < components; 1128b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1129b8e80941Smrg 1130b8e80941Smrg switch (op[0]->type->base_type) { 1131b8e80941Smrg case GLSL_TYPE_UINT: 1132b8e80941Smrg data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1]; 1133b8e80941Smrg break; 1134b8e80941Smrg case GLSL_TYPE_INT: 1135b8e80941Smrg data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1]; 1136b8e80941Smrg break; 1137b8e80941Smrg case GLSL_TYPE_FLOAT: 1138b8e80941Smrg data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1]; 1139b8e80941Smrg break; 1140b8e80941Smrg case GLSL_TYPE_DOUBLE: 1141b8e80941Smrg data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1]; 1142b8e80941Smrg break; 1143b8e80941Smrg case GLSL_TYPE_UINT64: 1144b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] - op[1]->value.u64[c1]; 1145b8e80941Smrg break; 1146b8e80941Smrg case GLSL_TYPE_INT64: 1147b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] - op[1]->value.i64[c1]; 1148b8e80941Smrg break; 1149b8e80941Smrg default: 1150b8e80941Smrg unreachable("invalid type"); 1151b8e80941Smrg } 1152b8e80941Smrg } 1153b8e80941Smrg break; 1154b8e80941Smrg 1155b8e80941Smrg case ir_binop_mul: 1156b8e80941Smrg /* Check for equal types, or unequal types involving scalars */ 1157b8e80941Smrg if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix()) 1158b8e80941Smrg || op0_scalar || op1_scalar) { 1159b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1160b8e80941Smrg c < components; 1161b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1162b8e80941Smrg 1163b8e80941Smrg switch (op[0]->type->base_type) { 1164b8e80941Smrg case GLSL_TYPE_UINT: 1165b8e80941Smrg data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1]; 1166b8e80941Smrg break; 1167b8e80941Smrg case GLSL_TYPE_INT: 1168b8e80941Smrg data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1]; 1169b8e80941Smrg break; 1170b8e80941Smrg case GLSL_TYPE_FLOAT: 1171b8e80941Smrg data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1]; 1172b8e80941Smrg break; 1173b8e80941Smrg case GLSL_TYPE_DOUBLE: 1174b8e80941Smrg data.d[c] = op[0]->value.d[c0] * op[1]->value.d[c1]; 1175b8e80941Smrg break; 1176b8e80941Smrg case GLSL_TYPE_UINT64: 1177b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] * op[1]->value.u64[c1]; 1178b8e80941Smrg break; 1179b8e80941Smrg case GLSL_TYPE_INT64: 1180b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] * op[1]->value.i64[c1]; 1181b8e80941Smrg break; 1182b8e80941Smrg default: 1183b8e80941Smrg unreachable("invalid type"); 1184b8e80941Smrg } 1185b8e80941Smrg } 1186b8e80941Smrg } else { 1187b8e80941Smrg assert(op[0]->type->is_matrix() || op[1]->type->is_matrix()); 1188b8e80941Smrg 1189b8e80941Smrg /* Multiply an N-by-M matrix with an M-by-P matrix. Since either 1190b8e80941Smrg * matrix can be a GLSL vector, either N or P can be 1. 1191b8e80941Smrg * 1192b8e80941Smrg * For vec*mat, the vector is treated as a row vector. This 1193b8e80941Smrg * means the vector is a 1-row x M-column matrix. 1194b8e80941Smrg * 1195b8e80941Smrg * For mat*vec, the vector is treated as a column vector. Since 1196b8e80941Smrg * matrix_columns is 1 for vectors, this just works. 1197b8e80941Smrg */ 1198b8e80941Smrg const unsigned n = op[0]->type->is_vector() 1199b8e80941Smrg ? 1 : op[0]->type->vector_elements; 1200b8e80941Smrg const unsigned m = op[1]->type->vector_elements; 1201b8e80941Smrg const unsigned p = op[1]->type->matrix_columns; 1202b8e80941Smrg for (unsigned j = 0; j < p; j++) { 1203b8e80941Smrg for (unsigned i = 0; i < n; i++) { 1204b8e80941Smrg for (unsigned k = 0; k < m; k++) { 1205b8e80941Smrg if (op[0]->type->is_double()) 1206b8e80941Smrg data.d[i+n*j] += op[0]->value.d[i+n*k]*op[1]->value.d[k+m*j]; 1207b8e80941Smrg else 1208b8e80941Smrg data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j]; 1209b8e80941Smrg } 1210b8e80941Smrg } 1211b8e80941Smrg } 1212b8e80941Smrg } 1213b8e80941Smrg break; 1214b8e80941Smrg 1215b8e80941Smrg case ir_binop_div: 1216b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1217b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1218b8e80941Smrg c < components; 1219b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1220b8e80941Smrg 1221b8e80941Smrg switch (op[0]->type->base_type) { 1222b8e80941Smrg case GLSL_TYPE_UINT: 1223b8e80941Smrg data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] / op[1]->value.u[c1]; 1224b8e80941Smrg break; 1225b8e80941Smrg case GLSL_TYPE_INT: 1226b8e80941Smrg data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] / op[1]->value.i[c1]; 1227b8e80941Smrg break; 1228b8e80941Smrg case GLSL_TYPE_FLOAT: 1229b8e80941Smrg data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1]; 1230b8e80941Smrg break; 1231b8e80941Smrg case GLSL_TYPE_DOUBLE: 1232b8e80941Smrg data.d[c] = op[0]->value.d[c0] / op[1]->value.d[c1]; 1233b8e80941Smrg break; 1234b8e80941Smrg case GLSL_TYPE_UINT64: 1235b8e80941Smrg data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] / op[1]->value.u64[c1]; 1236b8e80941Smrg break; 1237b8e80941Smrg case GLSL_TYPE_INT64: 1238b8e80941Smrg data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] / op[1]->value.i64[c1]; 1239b8e80941Smrg break; 1240b8e80941Smrg default: 1241b8e80941Smrg unreachable("invalid type"); 1242b8e80941Smrg } 1243b8e80941Smrg } 1244b8e80941Smrg break; 1245b8e80941Smrg 1246b8e80941Smrg case ir_binop_mod: 1247b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1248b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1249b8e80941Smrg c < components; 1250b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1251b8e80941Smrg 1252b8e80941Smrg switch (op[0]->type->base_type) { 1253b8e80941Smrg case GLSL_TYPE_UINT: 1254b8e80941Smrg data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] % op[1]->value.u[c1]; 1255b8e80941Smrg break; 1256b8e80941Smrg case GLSL_TYPE_INT: 1257b8e80941Smrg data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] % op[1]->value.i[c1]; 1258b8e80941Smrg break; 1259b8e80941Smrg case GLSL_TYPE_FLOAT: 1260b8e80941Smrg data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]); 1261b8e80941Smrg break; 1262b8e80941Smrg case GLSL_TYPE_DOUBLE: 1263b8e80941Smrg data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1] * floor(op[0]->value.d[c0] / op[1]->value.d[c1]); 1264b8e80941Smrg break; 1265b8e80941Smrg case GLSL_TYPE_UINT64: 1266b8e80941Smrg data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] % op[1]->value.u64[c1]; 1267b8e80941Smrg break; 1268b8e80941Smrg case GLSL_TYPE_INT64: 1269b8e80941Smrg data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] % op[1]->value.i64[c1]; 1270b8e80941Smrg break; 1271b8e80941Smrg default: 1272b8e80941Smrg unreachable("invalid type"); 1273b8e80941Smrg } 1274b8e80941Smrg } 1275b8e80941Smrg break; 1276b8e80941Smrg 1277b8e80941Smrg case ir_binop_less: 1278b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1279b8e80941Smrg switch (op[0]->type->base_type) { 1280b8e80941Smrg case GLSL_TYPE_UINT: 1281b8e80941Smrg data.b[c] = op[0]->value.u[c] < op[1]->value.u[c]; 1282b8e80941Smrg break; 1283b8e80941Smrg case GLSL_TYPE_INT: 1284b8e80941Smrg data.b[c] = op[0]->value.i[c] < op[1]->value.i[c]; 1285b8e80941Smrg break; 1286b8e80941Smrg case GLSL_TYPE_FLOAT: 1287b8e80941Smrg data.b[c] = op[0]->value.f[c] < op[1]->value.f[c]; 1288b8e80941Smrg break; 1289b8e80941Smrg case GLSL_TYPE_DOUBLE: 1290b8e80941Smrg data.b[c] = op[0]->value.d[c] < op[1]->value.d[c]; 1291b8e80941Smrg break; 1292b8e80941Smrg case GLSL_TYPE_UINT64: 1293b8e80941Smrg data.b[c] = op[0]->value.u64[c] < op[1]->value.u64[c]; 1294b8e80941Smrg break; 1295b8e80941Smrg case GLSL_TYPE_INT64: 1296b8e80941Smrg data.b[c] = op[0]->value.i64[c] < op[1]->value.i64[c]; 1297b8e80941Smrg break; 1298b8e80941Smrg default: 1299b8e80941Smrg unreachable("invalid type"); 1300b8e80941Smrg } 1301b8e80941Smrg } 1302b8e80941Smrg break; 1303b8e80941Smrg 1304b8e80941Smrg case ir_binop_gequal: 1305b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1306b8e80941Smrg switch (op[0]->type->base_type) { 1307b8e80941Smrg case GLSL_TYPE_UINT: 1308b8e80941Smrg data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c]; 1309b8e80941Smrg break; 1310b8e80941Smrg case GLSL_TYPE_INT: 1311b8e80941Smrg data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c]; 1312b8e80941Smrg break; 1313b8e80941Smrg case GLSL_TYPE_FLOAT: 1314b8e80941Smrg data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c]; 1315b8e80941Smrg break; 1316b8e80941Smrg case GLSL_TYPE_DOUBLE: 1317b8e80941Smrg data.b[c] = op[0]->value.d[c] >= op[1]->value.d[c]; 1318b8e80941Smrg break; 1319b8e80941Smrg case GLSL_TYPE_UINT64: 1320b8e80941Smrg data.b[c] = op[0]->value.u64[c] >= op[1]->value.u64[c]; 1321b8e80941Smrg break; 1322b8e80941Smrg case GLSL_TYPE_INT64: 1323b8e80941Smrg data.b[c] = op[0]->value.i64[c] >= op[1]->value.i64[c]; 1324b8e80941Smrg break; 1325b8e80941Smrg default: 1326b8e80941Smrg unreachable("invalid type"); 1327b8e80941Smrg } 1328b8e80941Smrg } 1329b8e80941Smrg break; 1330b8e80941Smrg 1331b8e80941Smrg case ir_binop_equal: 1332b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1333b8e80941Smrg switch (op[0]->type->base_type) { 1334b8e80941Smrg case GLSL_TYPE_UINT: 1335b8e80941Smrg data.b[c] = op[0]->value.u[c] == op[1]->value.u[c]; 1336b8e80941Smrg break; 1337b8e80941Smrg case GLSL_TYPE_INT: 1338b8e80941Smrg data.b[c] = op[0]->value.i[c] == op[1]->value.i[c]; 1339b8e80941Smrg break; 1340b8e80941Smrg case GLSL_TYPE_FLOAT: 1341b8e80941Smrg data.b[c] = op[0]->value.f[c] == op[1]->value.f[c]; 1342b8e80941Smrg break; 1343b8e80941Smrg case GLSL_TYPE_DOUBLE: 1344b8e80941Smrg data.b[c] = op[0]->value.d[c] == op[1]->value.d[c]; 1345b8e80941Smrg break; 1346b8e80941Smrg case GLSL_TYPE_UINT64: 1347b8e80941Smrg data.b[c] = op[0]->value.u64[c] == op[1]->value.u64[c]; 1348b8e80941Smrg break; 1349b8e80941Smrg case GLSL_TYPE_INT64: 1350b8e80941Smrg data.b[c] = op[0]->value.i64[c] == op[1]->value.i64[c]; 1351b8e80941Smrg break; 1352b8e80941Smrg case GLSL_TYPE_BOOL: 1353b8e80941Smrg data.b[c] = op[0]->value.b[c] == op[1]->value.b[c]; 1354b8e80941Smrg break; 1355b8e80941Smrg default: 1356b8e80941Smrg unreachable("invalid type"); 1357b8e80941Smrg } 1358b8e80941Smrg } 1359b8e80941Smrg break; 1360b8e80941Smrg 1361b8e80941Smrg case ir_binop_nequal: 1362b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1363b8e80941Smrg switch (op[0]->type->base_type) { 1364b8e80941Smrg case GLSL_TYPE_UINT: 1365b8e80941Smrg data.b[c] = op[0]->value.u[c] != op[1]->value.u[c]; 1366b8e80941Smrg break; 1367b8e80941Smrg case GLSL_TYPE_INT: 1368b8e80941Smrg data.b[c] = op[0]->value.i[c] != op[1]->value.i[c]; 1369b8e80941Smrg break; 1370b8e80941Smrg case GLSL_TYPE_FLOAT: 1371b8e80941Smrg data.b[c] = op[0]->value.f[c] != op[1]->value.f[c]; 1372b8e80941Smrg break; 1373b8e80941Smrg case GLSL_TYPE_DOUBLE: 1374b8e80941Smrg data.b[c] = op[0]->value.d[c] != op[1]->value.d[c]; 1375b8e80941Smrg break; 1376b8e80941Smrg case GLSL_TYPE_UINT64: 1377b8e80941Smrg data.b[c] = op[0]->value.u64[c] != op[1]->value.u64[c]; 1378b8e80941Smrg break; 1379b8e80941Smrg case GLSL_TYPE_INT64: 1380b8e80941Smrg data.b[c] = op[0]->value.i64[c] != op[1]->value.i64[c]; 1381b8e80941Smrg break; 1382b8e80941Smrg case GLSL_TYPE_BOOL: 1383b8e80941Smrg data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; 1384b8e80941Smrg break; 1385b8e80941Smrg default: 1386b8e80941Smrg unreachable("invalid type"); 1387b8e80941Smrg } 1388b8e80941Smrg } 1389b8e80941Smrg break; 1390b8e80941Smrg 1391b8e80941Smrg case ir_binop_all_equal: 1392b8e80941Smrg data.b[0] = op[0]->has_value(op[1]); 1393b8e80941Smrg break; 1394b8e80941Smrg 1395b8e80941Smrg case ir_binop_any_nequal: 1396b8e80941Smrg data.b[0] = !op[0]->has_value(op[1]); 1397b8e80941Smrg break; 1398b8e80941Smrg 1399b8e80941Smrg case ir_binop_lshift: 1400b8e80941Smrg assert(op[0]->type->base_type == GLSL_TYPE_UINT || 1401b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_INT || 1402b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_UINT64 || 1403b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_INT64); 1404b8e80941Smrg assert(op[1]->type->base_type == GLSL_TYPE_UINT || 1405b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_INT || 1406b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_UINT64 || 1407b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_INT64); 1408b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1409b8e80941Smrg c < components; 1410b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1411b8e80941Smrg 1412b8e80941Smrg switch (op[0]->type->base_type) { 1413b8e80941Smrg case GLSL_TYPE_UINT: 1414b8e80941Smrg data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1]; 1415b8e80941Smrg break; 1416b8e80941Smrg case GLSL_TYPE_INT: 1417b8e80941Smrg data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1]; 1418b8e80941Smrg break; 1419b8e80941Smrg case GLSL_TYPE_UINT64: 1420b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] << op[1]->value.u64[c1]; 1421b8e80941Smrg break; 1422b8e80941Smrg case GLSL_TYPE_INT64: 1423b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] << op[1]->value.i64[c1]; 1424b8e80941Smrg break; 1425b8e80941Smrg default: 1426b8e80941Smrg unreachable("invalid type"); 1427b8e80941Smrg } 1428b8e80941Smrg } 1429b8e80941Smrg break; 1430b8e80941Smrg 1431b8e80941Smrg case ir_binop_rshift: 1432b8e80941Smrg assert(op[0]->type->base_type == GLSL_TYPE_UINT || 1433b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_INT || 1434b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_UINT64 || 1435b8e80941Smrg op[0]->type->base_type == GLSL_TYPE_INT64); 1436b8e80941Smrg assert(op[1]->type->base_type == GLSL_TYPE_UINT || 1437b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_INT || 1438b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_UINT64 || 1439b8e80941Smrg op[1]->type->base_type == GLSL_TYPE_INT64); 1440b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1441b8e80941Smrg c < components; 1442b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1443b8e80941Smrg 1444b8e80941Smrg switch (op[0]->type->base_type) { 1445b8e80941Smrg case GLSL_TYPE_UINT: 1446b8e80941Smrg data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1]; 1447b8e80941Smrg break; 1448b8e80941Smrg case GLSL_TYPE_INT: 1449b8e80941Smrg data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1]; 1450b8e80941Smrg break; 1451b8e80941Smrg case GLSL_TYPE_UINT64: 1452b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] >> op[1]->value.u64[c1]; 1453b8e80941Smrg break; 1454b8e80941Smrg case GLSL_TYPE_INT64: 1455b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] >> op[1]->value.i64[c1]; 1456b8e80941Smrg break; 1457b8e80941Smrg default: 1458b8e80941Smrg unreachable("invalid type"); 1459b8e80941Smrg } 1460b8e80941Smrg } 1461b8e80941Smrg break; 1462b8e80941Smrg 1463b8e80941Smrg case ir_binop_bit_and: 1464b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1465b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1466b8e80941Smrg c < components; 1467b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1468b8e80941Smrg 1469b8e80941Smrg switch (op[0]->type->base_type) { 1470b8e80941Smrg case GLSL_TYPE_UINT: 1471b8e80941Smrg data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1]; 1472b8e80941Smrg break; 1473b8e80941Smrg case GLSL_TYPE_INT: 1474b8e80941Smrg data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1]; 1475b8e80941Smrg break; 1476b8e80941Smrg case GLSL_TYPE_UINT64: 1477b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] & op[1]->value.u64[c1]; 1478b8e80941Smrg break; 1479b8e80941Smrg case GLSL_TYPE_INT64: 1480b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] & op[1]->value.i64[c1]; 1481b8e80941Smrg break; 1482b8e80941Smrg default: 1483b8e80941Smrg unreachable("invalid type"); 1484b8e80941Smrg } 1485b8e80941Smrg } 1486b8e80941Smrg break; 1487b8e80941Smrg 1488b8e80941Smrg case ir_binop_bit_xor: 1489b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1490b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1491b8e80941Smrg c < components; 1492b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1493b8e80941Smrg 1494b8e80941Smrg switch (op[0]->type->base_type) { 1495b8e80941Smrg case GLSL_TYPE_UINT: 1496b8e80941Smrg data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1]; 1497b8e80941Smrg break; 1498b8e80941Smrg case GLSL_TYPE_INT: 1499b8e80941Smrg data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1]; 1500b8e80941Smrg break; 1501b8e80941Smrg case GLSL_TYPE_UINT64: 1502b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] ^ op[1]->value.u64[c1]; 1503b8e80941Smrg break; 1504b8e80941Smrg case GLSL_TYPE_INT64: 1505b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] ^ op[1]->value.i64[c1]; 1506b8e80941Smrg break; 1507b8e80941Smrg default: 1508b8e80941Smrg unreachable("invalid type"); 1509b8e80941Smrg } 1510b8e80941Smrg } 1511b8e80941Smrg break; 1512b8e80941Smrg 1513b8e80941Smrg case ir_binop_bit_or: 1514b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1515b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1516b8e80941Smrg c < components; 1517b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1518b8e80941Smrg 1519b8e80941Smrg switch (op[0]->type->base_type) { 1520b8e80941Smrg case GLSL_TYPE_UINT: 1521b8e80941Smrg data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1]; 1522b8e80941Smrg break; 1523b8e80941Smrg case GLSL_TYPE_INT: 1524b8e80941Smrg data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1]; 1525b8e80941Smrg break; 1526b8e80941Smrg case GLSL_TYPE_UINT64: 1527b8e80941Smrg data.u64[c] = op[0]->value.u64[c0] | op[1]->value.u64[c1]; 1528b8e80941Smrg break; 1529b8e80941Smrg case GLSL_TYPE_INT64: 1530b8e80941Smrg data.i64[c] = op[0]->value.i64[c0] | op[1]->value.i64[c1]; 1531b8e80941Smrg break; 1532b8e80941Smrg default: 1533b8e80941Smrg unreachable("invalid type"); 1534b8e80941Smrg } 1535b8e80941Smrg } 1536b8e80941Smrg break; 1537b8e80941Smrg 1538b8e80941Smrg case ir_binop_logic_and: 1539b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1540b8e80941Smrg switch (op[0]->type->base_type) { 1541b8e80941Smrg case GLSL_TYPE_BOOL: 1542b8e80941Smrg data.b[c] = op[0]->value.b[c] && op[1]->value.b[c]; 1543b8e80941Smrg break; 1544b8e80941Smrg default: 1545b8e80941Smrg unreachable("invalid type"); 1546b8e80941Smrg } 1547b8e80941Smrg } 1548b8e80941Smrg break; 1549b8e80941Smrg 1550b8e80941Smrg case ir_binop_logic_xor: 1551b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1552b8e80941Smrg switch (op[0]->type->base_type) { 1553b8e80941Smrg case GLSL_TYPE_BOOL: 1554b8e80941Smrg data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; 1555b8e80941Smrg break; 1556b8e80941Smrg default: 1557b8e80941Smrg unreachable("invalid type"); 1558b8e80941Smrg } 1559b8e80941Smrg } 1560b8e80941Smrg break; 1561b8e80941Smrg 1562b8e80941Smrg case ir_binop_logic_or: 1563b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1564b8e80941Smrg switch (op[0]->type->base_type) { 1565b8e80941Smrg case GLSL_TYPE_BOOL: 1566b8e80941Smrg data.b[c] = op[0]->value.b[c] || op[1]->value.b[c]; 1567b8e80941Smrg break; 1568b8e80941Smrg default: 1569b8e80941Smrg unreachable("invalid type"); 1570b8e80941Smrg } 1571b8e80941Smrg } 1572b8e80941Smrg break; 1573b8e80941Smrg 1574b8e80941Smrg case ir_binop_dot: 1575b8e80941Smrg switch (op[0]->type->base_type) { 1576b8e80941Smrg case GLSL_TYPE_FLOAT: 1577b8e80941Smrg data.f[0] = dot_f(op[0], op[1]); 1578b8e80941Smrg break; 1579b8e80941Smrg case GLSL_TYPE_DOUBLE: 1580b8e80941Smrg data.d[0] = dot_d(op[0], op[1]); 1581b8e80941Smrg break; 1582b8e80941Smrg default: 1583b8e80941Smrg unreachable("invalid type"); 1584b8e80941Smrg } 1585b8e80941Smrg break; 1586b8e80941Smrg 1587b8e80941Smrg case ir_binop_min: 1588b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1589b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1590b8e80941Smrg c < components; 1591b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1592b8e80941Smrg 1593b8e80941Smrg switch (op[0]->type->base_type) { 1594b8e80941Smrg case GLSL_TYPE_UINT: 1595b8e80941Smrg data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]); 1596b8e80941Smrg break; 1597b8e80941Smrg case GLSL_TYPE_INT: 1598b8e80941Smrg data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]); 1599b8e80941Smrg break; 1600b8e80941Smrg case GLSL_TYPE_FLOAT: 1601b8e80941Smrg data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]); 1602b8e80941Smrg break; 1603b8e80941Smrg case GLSL_TYPE_DOUBLE: 1604b8e80941Smrg data.d[c] = MIN2(op[0]->value.d[c0], op[1]->value.d[c1]); 1605b8e80941Smrg break; 1606b8e80941Smrg case GLSL_TYPE_UINT64: 1607b8e80941Smrg data.u64[c] = MIN2(op[0]->value.u64[c0], op[1]->value.u64[c1]); 1608b8e80941Smrg break; 1609b8e80941Smrg case GLSL_TYPE_INT64: 1610b8e80941Smrg data.i64[c] = MIN2(op[0]->value.i64[c0], op[1]->value.i64[c1]); 1611b8e80941Smrg break; 1612b8e80941Smrg default: 1613b8e80941Smrg unreachable("invalid type"); 1614b8e80941Smrg } 1615b8e80941Smrg } 1616b8e80941Smrg break; 1617b8e80941Smrg 1618b8e80941Smrg case ir_binop_max: 1619b8e80941Smrg assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1620b8e80941Smrg for (unsigned c = 0, c0 = 0, c1 = 0; 1621b8e80941Smrg c < components; 1622b8e80941Smrg c0 += c0_inc, c1 += c1_inc, c++) { 1623b8e80941Smrg 1624b8e80941Smrg switch (op[0]->type->base_type) { 1625b8e80941Smrg case GLSL_TYPE_UINT: 1626b8e80941Smrg data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]); 1627b8e80941Smrg break; 1628b8e80941Smrg case GLSL_TYPE_INT: 1629b8e80941Smrg data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]); 1630b8e80941Smrg break; 1631b8e80941Smrg case GLSL_TYPE_FLOAT: 1632b8e80941Smrg data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]); 1633b8e80941Smrg break; 1634b8e80941Smrg case GLSL_TYPE_DOUBLE: 1635b8e80941Smrg data.d[c] = MAX2(op[0]->value.d[c0], op[1]->value.d[c1]); 1636b8e80941Smrg break; 1637b8e80941Smrg case GLSL_TYPE_UINT64: 1638b8e80941Smrg data.u64[c] = MAX2(op[0]->value.u64[c0], op[1]->value.u64[c1]); 1639b8e80941Smrg break; 1640b8e80941Smrg case GLSL_TYPE_INT64: 1641b8e80941Smrg data.i64[c] = MAX2(op[0]->value.i64[c0], op[1]->value.i64[c1]); 1642b8e80941Smrg break; 1643b8e80941Smrg default: 1644b8e80941Smrg unreachable("invalid type"); 1645b8e80941Smrg } 1646b8e80941Smrg } 1647b8e80941Smrg break; 1648b8e80941Smrg 1649b8e80941Smrg case ir_binop_pow: 1650b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1651b8e80941Smrg switch (op[0]->type->base_type) { 1652b8e80941Smrg case GLSL_TYPE_FLOAT: 1653b8e80941Smrg data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]); 1654b8e80941Smrg break; 1655b8e80941Smrg default: 1656b8e80941Smrg unreachable("invalid type"); 1657b8e80941Smrg } 1658b8e80941Smrg } 1659b8e80941Smrg break; 1660b8e80941Smrg 1661b8e80941Smrg case ir_binop_ldexp: 1662b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1663b8e80941Smrg switch (op[0]->type->base_type) { 1664b8e80941Smrg case GLSL_TYPE_FLOAT: 1665b8e80941Smrg data.f[c] = ldexpf_flush_subnormal(op[0]->value.f[c], op[1]->value.i[c]); 1666b8e80941Smrg break; 1667b8e80941Smrg case GLSL_TYPE_DOUBLE: 1668b8e80941Smrg data.d[c] = ldexp_flush_subnormal(op[0]->value.d[c], op[1]->value.i[c]); 1669b8e80941Smrg break; 1670b8e80941Smrg default: 1671b8e80941Smrg unreachable("invalid type"); 1672b8e80941Smrg } 1673b8e80941Smrg } 1674b8e80941Smrg break; 1675b8e80941Smrg 1676b8e80941Smrg case ir_binop_vector_extract: { 1677b8e80941Smrg const int c = CLAMP(op[1]->value.i[0], 0, 1678b8e80941Smrg (int) op[0]->type->vector_elements - 1); 1679b8e80941Smrg 1680b8e80941Smrg switch (op[0]->type->base_type) { 1681b8e80941Smrg case GLSL_TYPE_UINT: 1682b8e80941Smrg data.u[0] = op[0]->value.u[c]; 1683b8e80941Smrg break; 1684b8e80941Smrg case GLSL_TYPE_INT: 1685b8e80941Smrg data.i[0] = op[0]->value.i[c]; 1686b8e80941Smrg break; 1687b8e80941Smrg case GLSL_TYPE_FLOAT: 1688b8e80941Smrg data.f[0] = op[0]->value.f[c]; 1689b8e80941Smrg break; 1690b8e80941Smrg case GLSL_TYPE_DOUBLE: 1691b8e80941Smrg data.d[0] = op[0]->value.d[c]; 1692b8e80941Smrg break; 1693b8e80941Smrg case GLSL_TYPE_UINT64: 1694b8e80941Smrg data.u64[0] = op[0]->value.u64[c]; 1695b8e80941Smrg break; 1696b8e80941Smrg case GLSL_TYPE_INT64: 1697b8e80941Smrg data.i64[0] = op[0]->value.i64[c]; 1698b8e80941Smrg break; 1699b8e80941Smrg case GLSL_TYPE_BOOL: 1700b8e80941Smrg data.b[0] = op[0]->value.b[c]; 1701b8e80941Smrg break; 1702b8e80941Smrg default: 1703b8e80941Smrg unreachable("invalid type"); 1704b8e80941Smrg } 1705b8e80941Smrg break; 1706b8e80941Smrg } 1707b8e80941Smrg 1708b8e80941Smrg case ir_triop_fma: 1709b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1710b8e80941Smrg switch (op[0]->type->base_type) { 1711b8e80941Smrg case GLSL_TYPE_FLOAT: 1712b8e80941Smrg data.f[c] = op[0]->value.f[c] * op[1]->value.f[c] + op[2]->value.f[c]; 1713b8e80941Smrg break; 1714b8e80941Smrg case GLSL_TYPE_DOUBLE: 1715b8e80941Smrg data.d[c] = op[0]->value.d[c] * op[1]->value.d[c] + op[2]->value.d[c]; 1716b8e80941Smrg break; 1717b8e80941Smrg default: 1718b8e80941Smrg unreachable("invalid type"); 1719b8e80941Smrg } 1720b8e80941Smrg } 1721b8e80941Smrg break; 1722b8e80941Smrg 1723b8e80941Smrg case ir_triop_lrp: { 1724b8e80941Smrg assert(op[0]->type->is_float() || op[0]->type->is_double()); 1725b8e80941Smrg assert(op[1]->type->is_float() || op[1]->type->is_double()); 1726b8e80941Smrg assert(op[2]->type->is_float() || op[2]->type->is_double()); 1727b8e80941Smrg 1728b8e80941Smrg unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 1729b8e80941Smrg for (unsigned c = 0, c2 = 0; c < components; c2 += c2_inc, c++) { 1730b8e80941Smrg switch (this->type->base_type) { 1731b8e80941Smrg case GLSL_TYPE_FLOAT: 1732b8e80941Smrg 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]); 1733b8e80941Smrg break; 1734b8e80941Smrg case GLSL_TYPE_DOUBLE: 1735b8e80941Smrg 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]); 1736b8e80941Smrg break; 1737b8e80941Smrg default: 1738b8e80941Smrg unreachable("invalid type"); 1739b8e80941Smrg } 1740b8e80941Smrg } 1741b8e80941Smrg break; 1742b8e80941Smrg } 1743b8e80941Smrg 1744b8e80941Smrg case ir_triop_csel: 1745b8e80941Smrg for (unsigned c = 0; c < components; c++) { 1746b8e80941Smrg switch (this->type->base_type) { 1747b8e80941Smrg case GLSL_TYPE_UINT: 1748b8e80941Smrg data.u[c] = op[0]->value.b[c] ? op[1]->value.u[c] : op[2]->value.u[c]; 1749b8e80941Smrg break; 1750b8e80941Smrg case GLSL_TYPE_INT: 1751b8e80941Smrg data.i[c] = op[0]->value.b[c] ? op[1]->value.i[c] : op[2]->value.i[c]; 1752b8e80941Smrg break; 1753b8e80941Smrg case GLSL_TYPE_FLOAT: 1754b8e80941Smrg data.f[c] = op[0]->value.b[c] ? op[1]->value.f[c] : op[2]->value.f[c]; 1755b8e80941Smrg break; 1756b8e80941Smrg case GLSL_TYPE_DOUBLE: 1757b8e80941Smrg data.d[c] = op[0]->value.b[c] ? op[1]->value.d[c] : op[2]->value.d[c]; 1758b8e80941Smrg break; 1759b8e80941Smrg case GLSL_TYPE_UINT64: 1760b8e80941Smrg data.u64[c] = op[0]->value.b[c] ? op[1]->value.u64[c] : op[2]->value.u64[c]; 1761b8e80941Smrg break; 1762b8e80941Smrg case GLSL_TYPE_INT64: 1763b8e80941Smrg data.i64[c] = op[0]->value.b[c] ? op[1]->value.i64[c] : op[2]->value.i64[c]; 1764b8e80941Smrg break; 1765b8e80941Smrg case GLSL_TYPE_BOOL: 1766b8e80941Smrg data.b[c] = op[0]->value.b[c] ? op[1]->value.b[c] : op[2]->value.b[c]; 1767b8e80941Smrg break; 1768b8e80941Smrg default: 1769b8e80941Smrg unreachable("invalid type"); 1770b8e80941Smrg } 1771b8e80941Smrg } 1772b8e80941Smrg break; 1773b8e80941Smrg 1774b8e80941Smrg case ir_triop_bitfield_extract: 1775b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1776b8e80941Smrg switch (op[0]->type->base_type) { 1777b8e80941Smrg case GLSL_TYPE_UINT: 1778b8e80941Smrg data.i[c] = bitfield_extract_uint(op[0]->value.u[c], op[1]->value.i[c], op[2]->value.i[c]); 1779b8e80941Smrg break; 1780b8e80941Smrg case GLSL_TYPE_INT: 1781b8e80941Smrg data.i[c] = bitfield_extract_int(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c]); 1782b8e80941Smrg break; 1783b8e80941Smrg default: 1784b8e80941Smrg unreachable("invalid type"); 1785b8e80941Smrg } 1786b8e80941Smrg } 1787b8e80941Smrg break; 1788b8e80941Smrg 1789b8e80941Smrg case ir_triop_vector_insert: { 1790b8e80941Smrg const unsigned idx = op[2]->value.u[0]; 1791b8e80941Smrg 1792b8e80941Smrg memcpy(&data, &op[0]->value, sizeof(data)); 1793b8e80941Smrg 1794b8e80941Smrg switch (this->type->base_type) { 1795b8e80941Smrg case GLSL_TYPE_UINT: 1796b8e80941Smrg data.u[idx] = op[1]->value.u[0]; 1797b8e80941Smrg break; 1798b8e80941Smrg case GLSL_TYPE_INT: 1799b8e80941Smrg data.i[idx] = op[1]->value.i[0]; 1800b8e80941Smrg break; 1801b8e80941Smrg case GLSL_TYPE_FLOAT: 1802b8e80941Smrg data.f[idx] = op[1]->value.f[0]; 1803b8e80941Smrg break; 1804b8e80941Smrg case GLSL_TYPE_DOUBLE: 1805b8e80941Smrg data.d[idx] = op[1]->value.d[0]; 1806b8e80941Smrg break; 1807b8e80941Smrg case GLSL_TYPE_UINT64: 1808b8e80941Smrg data.u64[idx] = op[1]->value.u64[0]; 1809b8e80941Smrg break; 1810b8e80941Smrg case GLSL_TYPE_INT64: 1811b8e80941Smrg data.i64[idx] = op[1]->value.i64[0]; 1812b8e80941Smrg break; 1813b8e80941Smrg case GLSL_TYPE_BOOL: 1814b8e80941Smrg data.b[idx] = op[1]->value.b[0]; 1815b8e80941Smrg break; 1816b8e80941Smrg default: 1817b8e80941Smrg unreachable("invalid type"); 1818b8e80941Smrg } 1819b8e80941Smrg break; 1820b8e80941Smrg } 1821b8e80941Smrg 1822b8e80941Smrg case ir_quadop_bitfield_insert: 1823b8e80941Smrg for (unsigned c = 0; c < op[0]->type->components(); c++) { 1824b8e80941Smrg switch (op[0]->type->base_type) { 1825b8e80941Smrg case GLSL_TYPE_UINT: 1826b8e80941Smrg 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]); 1827b8e80941Smrg break; 1828b8e80941Smrg case GLSL_TYPE_INT: 1829b8e80941Smrg 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]); 1830b8e80941Smrg break; 1831b8e80941Smrg default: 1832b8e80941Smrg unreachable("invalid type"); 1833b8e80941Smrg } 1834b8e80941Smrg } 1835b8e80941Smrg break; 1836b8e80941Smrg 1837b8e80941Smrg case ir_quadop_vector: 1838b8e80941Smrg for (unsigned c = 0; c < this->type->vector_elements; c++) { 1839b8e80941Smrg switch (this->type->base_type) { 1840b8e80941Smrg case GLSL_TYPE_UINT: 1841b8e80941Smrg data.u[c] = op[c]->value.u[0]; 1842b8e80941Smrg break; 1843b8e80941Smrg case GLSL_TYPE_INT: 1844b8e80941Smrg data.i[c] = op[c]->value.i[0]; 1845b8e80941Smrg break; 1846b8e80941Smrg case GLSL_TYPE_FLOAT: 1847b8e80941Smrg data.f[c] = op[c]->value.f[0]; 1848b8e80941Smrg break; 1849b8e80941Smrg case GLSL_TYPE_DOUBLE: 1850b8e80941Smrg data.d[c] = op[c]->value.d[0]; 1851b8e80941Smrg break; 1852b8e80941Smrg case GLSL_TYPE_UINT64: 1853b8e80941Smrg data.u64[c] = op[c]->value.u64[0]; 1854b8e80941Smrg break; 1855b8e80941Smrg case GLSL_TYPE_INT64: 1856b8e80941Smrg data.i64[c] = op[c]->value.i64[0]; 1857b8e80941Smrg break; 1858b8e80941Smrg case GLSL_TYPE_BOOL: 1859b8e80941Smrg data.b[c] = op[c]->value.b[0]; 1860b8e80941Smrg break; 1861b8e80941Smrg default: 1862b8e80941Smrg unreachable("invalid type"); 1863b8e80941Smrg } 1864b8e80941Smrg } 1865b8e80941Smrg break; 1866b8e80941Smrg 1867b8e80941Smrg default: 1868b8e80941Smrg /* FINISHME: Should handle all expression types. */ 1869b8e80941Smrg return NULL; 1870b8e80941Smrg } 1871b8e80941Smrg 1872