1 switch (this->operation) { 2 case ir_unop_bit_not: 3 for (unsigned c = 0; c < op[0]->type->components(); c++) { 4 switch (op[0]->type->base_type) { 5 case GLSL_TYPE_UINT: 6 data.u[c] = ~ op[0]->value.u[c]; 7 break; 8 case GLSL_TYPE_INT: 9 data.i[c] = ~ op[0]->value.i[c]; 10 break; 11 default: 12 unreachable("invalid type"); 13 } 14 } 15 break; 16 17 case ir_unop_logic_not: 18 for (unsigned c = 0; c < op[0]->type->components(); c++) { 19 switch (op[0]->type->base_type) { 20 case GLSL_TYPE_BOOL: 21 data.b[c] = !op[0]->value.b[c]; 22 break; 23 default: 24 unreachable("invalid type"); 25 } 26 } 27 break; 28 29 case ir_unop_neg: 30 for (unsigned c = 0; c < op[0]->type->components(); c++) { 31 switch (op[0]->type->base_type) { 32 case GLSL_TYPE_UINT: 33 data.u[c] = -((int) op[0]->value.u[c]); 34 break; 35 case GLSL_TYPE_INT: 36 data.i[c] = -op[0]->value.i[c]; 37 break; 38 case GLSL_TYPE_FLOAT: 39 data.f[c] = -op[0]->value.f[c]; 40 break; 41 case GLSL_TYPE_DOUBLE: 42 data.d[c] = -op[0]->value.d[c]; 43 break; 44 default: 45 unreachable("invalid type"); 46 } 47 } 48 break; 49 50 case ir_unop_abs: 51 for (unsigned c = 0; c < op[0]->type->components(); c++) { 52 switch (op[0]->type->base_type) { 53 case GLSL_TYPE_INT: 54 data.i[c] = op[0]->value.i[c] < 0 ? -op[0]->value.i[c] : op[0]->value.i[c]; 55 break; 56 case GLSL_TYPE_FLOAT: 57 data.f[c] = fabsf(op[0]->value.f[c]); 58 break; 59 case GLSL_TYPE_DOUBLE: 60 data.d[c] = fabs(op[0]->value.d[c]); 61 break; 62 default: 63 unreachable("invalid type"); 64 } 65 } 66 break; 67 68 case ir_unop_sign: 69 for (unsigned c = 0; c < op[0]->type->components(); c++) { 70 switch (op[0]->type->base_type) { 71 case GLSL_TYPE_INT: 72 data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0); 73 break; 74 case GLSL_TYPE_FLOAT: 75 data.f[c] = float((op[0]->value.f[c] > 0.0F) - (op[0]->value.f[c] < 0.0F)); 76 break; 77 case GLSL_TYPE_DOUBLE: 78 data.d[c] = double((op[0]->value.d[c] > 0.0) - (op[0]->value.d[c] < 0.0)); 79 break; 80 default: 81 unreachable("invalid type"); 82 } 83 } 84 break; 85 86 case ir_unop_rcp: 87 for (unsigned c = 0; c < op[0]->type->components(); c++) { 88 switch (op[0]->type->base_type) { 89 case GLSL_TYPE_FLOAT: 90 data.f[c] = op[0]->value.f[c] != 0.0F ? 1.0F / op[0]->value.f[c] : 0.0F; 91 break; 92 case GLSL_TYPE_DOUBLE: 93 data.d[c] = op[0]->value.d[c] != 0.0 ? 1.0 / op[0]->value.d[c] : 0.0; 94 break; 95 default: 96 unreachable("invalid type"); 97 } 98 } 99 break; 100 101 case ir_unop_rsq: 102 for (unsigned c = 0; c < op[0]->type->components(); c++) { 103 switch (op[0]->type->base_type) { 104 case GLSL_TYPE_FLOAT: 105 data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]); 106 break; 107 case GLSL_TYPE_DOUBLE: 108 data.d[c] = 1.0 / sqrt(op[0]->value.d[c]); 109 break; 110 default: 111 unreachable("invalid type"); 112 } 113 } 114 break; 115 116 case ir_unop_sqrt: 117 for (unsigned c = 0; c < op[0]->type->components(); c++) { 118 switch (op[0]->type->base_type) { 119 case GLSL_TYPE_FLOAT: 120 data.f[c] = sqrtf(op[0]->value.f[c]); 121 break; 122 case GLSL_TYPE_DOUBLE: 123 data.d[c] = sqrt(op[0]->value.d[c]); 124 break; 125 default: 126 unreachable("invalid type"); 127 } 128 } 129 break; 130 131 case ir_unop_exp: 132 for (unsigned c = 0; c < op[0]->type->components(); c++) { 133 switch (op[0]->type->base_type) { 134 case GLSL_TYPE_FLOAT: 135 data.f[c] = expf(op[0]->value.f[c]); 136 break; 137 default: 138 unreachable("invalid type"); 139 } 140 } 141 break; 142 143 case ir_unop_log: 144 for (unsigned c = 0; c < op[0]->type->components(); c++) { 145 switch (op[0]->type->base_type) { 146 case GLSL_TYPE_FLOAT: 147 data.f[c] = logf(op[0]->value.f[c]); 148 break; 149 default: 150 unreachable("invalid type"); 151 } 152 } 153 break; 154 155 case ir_unop_exp2: 156 for (unsigned c = 0; c < op[0]->type->components(); c++) { 157 switch (op[0]->type->base_type) { 158 case GLSL_TYPE_FLOAT: 159 data.f[c] = exp2f(op[0]->value.f[c]); 160 break; 161 default: 162 unreachable("invalid type"); 163 } 164 } 165 break; 166 167 case ir_unop_log2: 168 for (unsigned c = 0; c < op[0]->type->components(); c++) { 169 switch (op[0]->type->base_type) { 170 case GLSL_TYPE_FLOAT: 171 data.f[c] = log2f(op[0]->value.f[c]); 172 break; 173 default: 174 unreachable("invalid type"); 175 } 176 } 177 break; 178 179 case ir_unop_f2i: 180 for (unsigned c = 0; c < op[0]->type->components(); c++) { 181 switch (op[0]->type->base_type) { 182 case GLSL_TYPE_FLOAT: 183 data.i[c] = (int) op[0]->value.f[c]; 184 break; 185 default: 186 unreachable("invalid type"); 187 } 188 } 189 break; 190 191 case ir_unop_f2u: 192 for (unsigned c = 0; c < op[0]->type->components(); c++) { 193 switch (op[0]->type->base_type) { 194 case GLSL_TYPE_FLOAT: 195 data.u[c] = (unsigned) op[0]->value.f[c]; 196 break; 197 default: 198 unreachable("invalid type"); 199 } 200 } 201 break; 202 203 case ir_unop_i2f: 204 for (unsigned c = 0; c < op[0]->type->components(); c++) { 205 switch (op[0]->type->base_type) { 206 case GLSL_TYPE_INT: 207 data.f[c] = (float) op[0]->value.i[c]; 208 break; 209 default: 210 unreachable("invalid type"); 211 } 212 } 213 break; 214 215 case ir_unop_f2b: 216 for (unsigned c = 0; c < op[0]->type->components(); c++) { 217 switch (op[0]->type->base_type) { 218 case GLSL_TYPE_FLOAT: 219 data.b[c] = op[0]->value.f[c] != 0.0F ? true : false; 220 break; 221 default: 222 unreachable("invalid type"); 223 } 224 } 225 break; 226 227 case ir_unop_b2f: 228 for (unsigned c = 0; c < op[0]->type->components(); c++) { 229 switch (op[0]->type->base_type) { 230 case GLSL_TYPE_BOOL: 231 data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F; 232 break; 233 default: 234 unreachable("invalid type"); 235 } 236 } 237 break; 238 239 case ir_unop_i2b: 240 for (unsigned c = 0; c < op[0]->type->components(); c++) { 241 switch (op[0]->type->base_type) { 242 case GLSL_TYPE_UINT: 243 data.b[c] = op[0]->value.u[c] ? true : false; 244 break; 245 case GLSL_TYPE_INT: 246 data.b[c] = op[0]->value.i[c] ? true : false; 247 break; 248 default: 249 unreachable("invalid type"); 250 } 251 } 252 break; 253 254 case ir_unop_b2i: 255 for (unsigned c = 0; c < op[0]->type->components(); c++) { 256 switch (op[0]->type->base_type) { 257 case GLSL_TYPE_BOOL: 258 data.i[c] = op[0]->value.b[c] ? 1 : 0; 259 break; 260 default: 261 unreachable("invalid type"); 262 } 263 } 264 break; 265 266 case ir_unop_u2f: 267 for (unsigned c = 0; c < op[0]->type->components(); c++) { 268 switch (op[0]->type->base_type) { 269 case GLSL_TYPE_UINT: 270 data.f[c] = (float) op[0]->value.u[c]; 271 break; 272 default: 273 unreachable("invalid type"); 274 } 275 } 276 break; 277 278 case ir_unop_i2u: 279 for (unsigned c = 0; c < op[0]->type->components(); c++) { 280 switch (op[0]->type->base_type) { 281 case GLSL_TYPE_INT: 282 data.u[c] = op[0]->value.i[c]; 283 break; 284 default: 285 unreachable("invalid type"); 286 } 287 } 288 break; 289 290 case ir_unop_u2i: 291 for (unsigned c = 0; c < op[0]->type->components(); c++) { 292 switch (op[0]->type->base_type) { 293 case GLSL_TYPE_UINT: 294 data.i[c] = op[0]->value.u[c]; 295 break; 296 default: 297 unreachable("invalid type"); 298 } 299 } 300 break; 301 302 case ir_unop_d2f: 303 for (unsigned c = 0; c < op[0]->type->components(); c++) { 304 switch (op[0]->type->base_type) { 305 case GLSL_TYPE_DOUBLE: 306 data.f[c] = op[0]->value.d[c]; 307 break; 308 default: 309 unreachable("invalid type"); 310 } 311 } 312 break; 313 314 case ir_unop_f2d: 315 for (unsigned c = 0; c < op[0]->type->components(); c++) { 316 switch (op[0]->type->base_type) { 317 case GLSL_TYPE_FLOAT: 318 data.d[c] = op[0]->value.f[c]; 319 break; 320 default: 321 unreachable("invalid type"); 322 } 323 } 324 break; 325 326 case ir_unop_d2i: 327 for (unsigned c = 0; c < op[0]->type->components(); c++) { 328 switch (op[0]->type->base_type) { 329 case GLSL_TYPE_DOUBLE: 330 data.i[c] = op[0]->value.d[c]; 331 break; 332 default: 333 unreachable("invalid type"); 334 } 335 } 336 break; 337 338 case ir_unop_i2d: 339 for (unsigned c = 0; c < op[0]->type->components(); c++) { 340 switch (op[0]->type->base_type) { 341 case GLSL_TYPE_INT: 342 data.d[c] = op[0]->value.i[c]; 343 break; 344 default: 345 unreachable("invalid type"); 346 } 347 } 348 break; 349 350 case ir_unop_d2u: 351 for (unsigned c = 0; c < op[0]->type->components(); c++) { 352 switch (op[0]->type->base_type) { 353 case GLSL_TYPE_DOUBLE: 354 data.u[c] = op[0]->value.d[c]; 355 break; 356 default: 357 unreachable("invalid type"); 358 } 359 } 360 break; 361 362 case ir_unop_u2d: 363 for (unsigned c = 0; c < op[0]->type->components(); c++) { 364 switch (op[0]->type->base_type) { 365 case GLSL_TYPE_UINT: 366 data.d[c] = op[0]->value.u[c]; 367 break; 368 default: 369 unreachable("invalid type"); 370 } 371 } 372 break; 373 374 case ir_unop_d2b: 375 for (unsigned c = 0; c < op[0]->type->components(); c++) { 376 switch (op[0]->type->base_type) { 377 case GLSL_TYPE_DOUBLE: 378 data.b[c] = op[0]->value.d[c] != 0.0; 379 break; 380 default: 381 unreachable("invalid type"); 382 } 383 } 384 break; 385 386 case ir_unop_bitcast_i2f: 387 for (unsigned c = 0; c < op[0]->type->components(); c++) { 388 switch (op[0]->type->base_type) { 389 case GLSL_TYPE_INT: 390 data.f[c] = bitcast_u2f(op[0]->value.i[c]); 391 break; 392 default: 393 unreachable("invalid type"); 394 } 395 } 396 break; 397 398 case ir_unop_bitcast_f2i: 399 for (unsigned c = 0; c < op[0]->type->components(); c++) { 400 switch (op[0]->type->base_type) { 401 case GLSL_TYPE_FLOAT: 402 data.i[c] = bitcast_f2u(op[0]->value.f[c]); 403 break; 404 default: 405 unreachable("invalid type"); 406 } 407 } 408 break; 409 410 case ir_unop_bitcast_u2f: 411 for (unsigned c = 0; c < op[0]->type->components(); c++) { 412 switch (op[0]->type->base_type) { 413 case GLSL_TYPE_UINT: 414 data.f[c] = bitcast_u2f(op[0]->value.u[c]); 415 break; 416 default: 417 unreachable("invalid type"); 418 } 419 } 420 break; 421 422 case ir_unop_bitcast_f2u: 423 for (unsigned c = 0; c < op[0]->type->components(); c++) { 424 switch (op[0]->type->base_type) { 425 case GLSL_TYPE_FLOAT: 426 data.u[c] = bitcast_f2u(op[0]->value.f[c]); 427 break; 428 default: 429 unreachable("invalid type"); 430 } 431 } 432 break; 433 434 case ir_unop_trunc: 435 for (unsigned c = 0; c < op[0]->type->components(); c++) { 436 switch (op[0]->type->base_type) { 437 case GLSL_TYPE_FLOAT: 438 data.f[c] = truncf(op[0]->value.f[c]); 439 break; 440 case GLSL_TYPE_DOUBLE: 441 data.d[c] = trunc(op[0]->value.d[c]); 442 break; 443 default: 444 unreachable("invalid type"); 445 } 446 } 447 break; 448 449 case ir_unop_ceil: 450 for (unsigned c = 0; c < op[0]->type->components(); c++) { 451 switch (op[0]->type->base_type) { 452 case GLSL_TYPE_FLOAT: 453 data.f[c] = ceilf(op[0]->value.f[c]); 454 break; 455 case GLSL_TYPE_DOUBLE: 456 data.d[c] = ceil(op[0]->value.d[c]); 457 break; 458 default: 459 unreachable("invalid type"); 460 } 461 } 462 break; 463 464 case ir_unop_floor: 465 for (unsigned c = 0; c < op[0]->type->components(); c++) { 466 switch (op[0]->type->base_type) { 467 case GLSL_TYPE_FLOAT: 468 data.f[c] = floorf(op[0]->value.f[c]); 469 break; 470 case GLSL_TYPE_DOUBLE: 471 data.d[c] = floor(op[0]->value.d[c]); 472 break; 473 default: 474 unreachable("invalid type"); 475 } 476 } 477 break; 478 479 case ir_unop_fract: 480 for (unsigned c = 0; c < op[0]->type->components(); c++) { 481 switch (op[0]->type->base_type) { 482 case GLSL_TYPE_FLOAT: 483 data.f[c] = op[0]->value.f[c] - floorf(op[0]->value.f[c]); 484 break; 485 case GLSL_TYPE_DOUBLE: 486 data.d[c] = op[0]->value.d[c] - floor(op[0]->value.d[c]); 487 break; 488 default: 489 unreachable("invalid type"); 490 } 491 } 492 break; 493 494 case ir_unop_round_even: 495 for (unsigned c = 0; c < op[0]->type->components(); c++) { 496 switch (op[0]->type->base_type) { 497 case GLSL_TYPE_FLOAT: 498 data.f[c] = _mesa_roundevenf(op[0]->value.f[c]); 499 break; 500 case GLSL_TYPE_DOUBLE: 501 data.d[c] = _mesa_roundeven(op[0]->value.d[c]); 502 break; 503 default: 504 unreachable("invalid type"); 505 } 506 } 507 break; 508 509 case ir_unop_sin: 510 for (unsigned c = 0; c < op[0]->type->components(); c++) { 511 switch (op[0]->type->base_type) { 512 case GLSL_TYPE_FLOAT: 513 data.f[c] = sinf(op[0]->value.f[c]); 514 break; 515 default: 516 unreachable("invalid type"); 517 } 518 } 519 break; 520 521 case ir_unop_cos: 522 for (unsigned c = 0; c < op[0]->type->components(); c++) { 523 switch (op[0]->type->base_type) { 524 case GLSL_TYPE_FLOAT: 525 data.f[c] = cosf(op[0]->value.f[c]); 526 break; 527 default: 528 unreachable("invalid type"); 529 } 530 } 531 break; 532 533 case ir_unop_dFdx: 534 for (unsigned c = 0; c < op[0]->type->components(); c++) { 535 switch (op[0]->type->base_type) { 536 case GLSL_TYPE_FLOAT: 537 data.f[c] = 0.0f; 538 break; 539 default: 540 unreachable("invalid type"); 541 } 542 } 543 break; 544 545 case ir_unop_dFdx_coarse: 546 for (unsigned c = 0; c < op[0]->type->components(); c++) { 547 switch (op[0]->type->base_type) { 548 case GLSL_TYPE_FLOAT: 549 data.f[c] = 0.0f; 550 break; 551 default: 552 unreachable("invalid type"); 553 } 554 } 555 break; 556 557 case ir_unop_dFdx_fine: 558 for (unsigned c = 0; c < op[0]->type->components(); c++) { 559 switch (op[0]->type->base_type) { 560 case GLSL_TYPE_FLOAT: 561 data.f[c] = 0.0f; 562 break; 563 default: 564 unreachable("invalid type"); 565 } 566 } 567 break; 568 569 case ir_unop_dFdy: 570 for (unsigned c = 0; c < op[0]->type->components(); c++) { 571 switch (op[0]->type->base_type) { 572 case GLSL_TYPE_FLOAT: 573 data.f[c] = 0.0f; 574 break; 575 default: 576 unreachable("invalid type"); 577 } 578 } 579 break; 580 581 case ir_unop_dFdy_coarse: 582 for (unsigned c = 0; c < op[0]->type->components(); c++) { 583 switch (op[0]->type->base_type) { 584 case GLSL_TYPE_FLOAT: 585 data.f[c] = 0.0f; 586 break; 587 default: 588 unreachable("invalid type"); 589 } 590 } 591 break; 592 593 case ir_unop_dFdy_fine: 594 for (unsigned c = 0; c < op[0]->type->components(); c++) { 595 switch (op[0]->type->base_type) { 596 case GLSL_TYPE_FLOAT: 597 data.f[c] = 0.0f; 598 break; 599 default: 600 unreachable("invalid type"); 601 } 602 } 603 break; 604 605 case ir_unop_pack_snorm_2x16: 606 switch (op[0]->type->base_type) { 607 case GLSL_TYPE_FLOAT: 608 data.u[0] = pack_2x16(pack_snorm_1x16, op[0]->value.f[0], op[0]->value.f[1]); 609 break; 610 default: 611 unreachable("invalid type"); 612 } 613 break; 614 615 case ir_unop_pack_snorm_4x8: 616 switch (op[0]->type->base_type) { 617 case GLSL_TYPE_FLOAT: 618 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]); 619 break; 620 default: 621 unreachable("invalid type"); 622 } 623 break; 624 625 case ir_unop_pack_unorm_2x16: 626 switch (op[0]->type->base_type) { 627 case GLSL_TYPE_FLOAT: 628 data.u[0] = pack_2x16(pack_unorm_1x16, op[0]->value.f[0], op[0]->value.f[1]); 629 break; 630 default: 631 unreachable("invalid type"); 632 } 633 break; 634 635 case ir_unop_pack_unorm_4x8: 636 switch (op[0]->type->base_type) { 637 case GLSL_TYPE_FLOAT: 638 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]); 639 break; 640 default: 641 unreachable("invalid type"); 642 } 643 break; 644 645 case ir_unop_pack_half_2x16: 646 switch (op[0]->type->base_type) { 647 case GLSL_TYPE_FLOAT: 648 data.u[0] = pack_2x16(pack_half_1x16, op[0]->value.f[0], op[0]->value.f[1]); 649 break; 650 default: 651 unreachable("invalid type"); 652 } 653 break; 654 655 case ir_unop_unpack_snorm_2x16: 656 unpack_2x16(unpack_snorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 657 break; 658 659 case ir_unop_unpack_snorm_4x8: 660 unpack_4x8(unpack_snorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]); 661 break; 662 663 case ir_unop_unpack_unorm_2x16: 664 unpack_2x16(unpack_unorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 665 break; 666 667 case ir_unop_unpack_unorm_4x8: 668 unpack_4x8(unpack_unorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]); 669 break; 670 671 case ir_unop_unpack_half_2x16: 672 unpack_2x16(unpack_half_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]); 673 break; 674 675 case ir_unop_bitfield_reverse: 676 for (unsigned c = 0; c < op[0]->type->components(); c++) { 677 switch (op[0]->type->base_type) { 678 case GLSL_TYPE_UINT: 679 data.u[c] = bitfield_reverse(op[0]->value.u[c]); 680 break; 681 case GLSL_TYPE_INT: 682 data.i[c] = bitfield_reverse(op[0]->value.i[c]); 683 break; 684 default: 685 unreachable("invalid type"); 686 } 687 } 688 break; 689 690 case ir_unop_bit_count: 691 for (unsigned c = 0; c < op[0]->type->components(); c++) { 692 switch (op[0]->type->base_type) { 693 case GLSL_TYPE_UINT: 694 data.i[c] = _mesa_bitcount(op[0]->value.u[c]); 695 break; 696 case GLSL_TYPE_INT: 697 data.i[c] = _mesa_bitcount(op[0]->value.i[c]); 698 break; 699 default: 700 unreachable("invalid type"); 701 } 702 } 703 break; 704 705 case ir_unop_find_msb: 706 for (unsigned c = 0; c < op[0]->type->components(); c++) { 707 switch (op[0]->type->base_type) { 708 case GLSL_TYPE_UINT: 709 data.i[c] = find_msb_uint(op[0]->value.u[c]); 710 break; 711 case GLSL_TYPE_INT: 712 data.i[c] = find_msb_int(op[0]->value.i[c]); 713 break; 714 default: 715 unreachable("invalid type"); 716 } 717 } 718 break; 719 720 case ir_unop_find_lsb: 721 for (unsigned c = 0; c < op[0]->type->components(); c++) { 722 switch (op[0]->type->base_type) { 723 case GLSL_TYPE_UINT: 724 data.i[c] = find_msb_uint(op[0]->value.u[c] & -op[0]->value.u[c]); 725 break; 726 case GLSL_TYPE_INT: 727 data.i[c] = find_msb_uint(op[0]->value.i[c] & -op[0]->value.i[c]); 728 break; 729 default: 730 unreachable("invalid type"); 731 } 732 } 733 break; 734 735 case ir_unop_saturate: 736 for (unsigned c = 0; c < op[0]->type->components(); c++) { 737 switch (op[0]->type->base_type) { 738 case GLSL_TYPE_FLOAT: 739 data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f); 740 break; 741 default: 742 unreachable("invalid type"); 743 } 744 } 745 break; 746 747 case ir_unop_pack_double_2x32: 748 memcpy(&data.d[0], &op[0]->value.u[0], sizeof(double)); 749 break; 750 751 case ir_unop_unpack_double_2x32: 752 memcpy(&data.u[0], &op[0]->value.d[0], sizeof(double)); 753 break; 754 755 case ir_binop_add: 756 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 757 for (unsigned c = 0, c0 = 0, c1 = 0; 758 c < components; 759 c0 += c0_inc, c1 += c1_inc, c++) { 760 761 switch (op[0]->type->base_type) { 762 case GLSL_TYPE_UINT: 763 data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1]; 764 break; 765 case GLSL_TYPE_INT: 766 data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1]; 767 break; 768 case GLSL_TYPE_FLOAT: 769 data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1]; 770 break; 771 case GLSL_TYPE_DOUBLE: 772 data.d[c] = op[0]->value.d[c0] + op[1]->value.d[c1]; 773 break; 774 default: 775 unreachable("invalid type"); 776 } 777 } 778 break; 779 780 case ir_binop_sub: 781 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 782 for (unsigned c = 0, c0 = 0, c1 = 0; 783 c < components; 784 c0 += c0_inc, c1 += c1_inc, c++) { 785 786 switch (op[0]->type->base_type) { 787 case GLSL_TYPE_UINT: 788 data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1]; 789 break; 790 case GLSL_TYPE_INT: 791 data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1]; 792 break; 793 case GLSL_TYPE_FLOAT: 794 data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1]; 795 break; 796 case GLSL_TYPE_DOUBLE: 797 data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1]; 798 break; 799 default: 800 unreachable("invalid type"); 801 } 802 } 803 break; 804 805 case ir_binop_mul: 806 /* Check for equal types, or unequal types involving scalars */ 807 if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix()) 808 || op0_scalar || op1_scalar) { 809 for (unsigned c = 0, c0 = 0, c1 = 0; 810 c < components; 811 c0 += c0_inc, c1 += c1_inc, c++) { 812 813 switch (op[0]->type->base_type) { 814 case GLSL_TYPE_UINT: 815 data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1]; 816 break; 817 case GLSL_TYPE_INT: 818 data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1]; 819 break; 820 case GLSL_TYPE_FLOAT: 821 data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1]; 822 break; 823 case GLSL_TYPE_DOUBLE: 824 data.d[c] = op[0]->value.d[c0] * op[1]->value.d[c1]; 825 break; 826 default: 827 unreachable("invalid type"); 828 } 829 } 830 } else { 831 assert(op[0]->type->is_matrix() || op[1]->type->is_matrix()); 832 833 /* Multiply an N-by-M matrix with an M-by-P matrix. Since either 834 * matrix can be a GLSL vector, either N or P can be 1. 835 * 836 * For vec*mat, the vector is treated as a row vector. This 837 * means the vector is a 1-row x M-column matrix. 838 * 839 * For mat*vec, the vector is treated as a column vector. Since 840 * matrix_columns is 1 for vectors, this just works. 841 */ 842 const unsigned n = op[0]->type->is_vector() 843 ? 1 : op[0]->type->vector_elements; 844 const unsigned m = op[1]->type->vector_elements; 845 const unsigned p = op[1]->type->matrix_columns; 846 for (unsigned j = 0; j < p; j++) { 847 for (unsigned i = 0; i < n; i++) { 848 for (unsigned k = 0; k < m; k++) { 849 if (op[0]->type->base_type == GLSL_TYPE_DOUBLE) 850 data.d[i+n*j] += op[0]->value.d[i+n*k]*op[1]->value.d[k+m*j]; 851 else 852 data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j]; 853 } 854 } 855 } 856 } 857 break; 858 859 case ir_binop_div: 860 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 861 for (unsigned c = 0, c0 = 0, c1 = 0; 862 c < components; 863 c0 += c0_inc, c1 += c1_inc, c++) { 864 865 switch (op[0]->type->base_type) { 866 case GLSL_TYPE_UINT: 867 data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] / op[1]->value.u[c1]; 868 break; 869 case GLSL_TYPE_INT: 870 data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] / op[1]->value.i[c1]; 871 break; 872 case GLSL_TYPE_FLOAT: 873 data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1]; 874 break; 875 case GLSL_TYPE_DOUBLE: 876 data.d[c] = op[0]->value.d[c0] / op[1]->value.d[c1]; 877 break; 878 default: 879 unreachable("invalid type"); 880 } 881 } 882 break; 883 884 case ir_binop_mod: 885 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 886 for (unsigned c = 0, c0 = 0, c1 = 0; 887 c < components; 888 c0 += c0_inc, c1 += c1_inc, c++) { 889 890 switch (op[0]->type->base_type) { 891 case GLSL_TYPE_UINT: 892 data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] % op[1]->value.u[c1]; 893 break; 894 case GLSL_TYPE_INT: 895 data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] % op[1]->value.i[c1]; 896 break; 897 case GLSL_TYPE_FLOAT: 898 data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]); 899 break; 900 case GLSL_TYPE_DOUBLE: 901 data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1] * floor(op[0]->value.d[c0] / op[1]->value.d[c1]); 902 break; 903 default: 904 unreachable("invalid type"); 905 } 906 } 907 break; 908 909 case ir_binop_less: 910 for (unsigned c = 0; c < op[0]->type->components(); c++) { 911 switch (op[0]->type->base_type) { 912 case GLSL_TYPE_UINT: 913 data.b[c] = op[0]->value.u[c] < op[1]->value.u[c]; 914 break; 915 case GLSL_TYPE_INT: 916 data.b[c] = op[0]->value.i[c] < op[1]->value.i[c]; 917 break; 918 case GLSL_TYPE_FLOAT: 919 data.b[c] = op[0]->value.f[c] < op[1]->value.f[c]; 920 break; 921 case GLSL_TYPE_DOUBLE: 922 data.b[c] = op[0]->value.d[c] < op[1]->value.d[c]; 923 break; 924 default: 925 unreachable("invalid type"); 926 } 927 } 928 break; 929 930 case ir_binop_greater: 931 for (unsigned c = 0; c < op[0]->type->components(); c++) { 932 switch (op[0]->type->base_type) { 933 case GLSL_TYPE_UINT: 934 data.b[c] = op[0]->value.u[c] > op[1]->value.u[c]; 935 break; 936 case GLSL_TYPE_INT: 937 data.b[c] = op[0]->value.i[c] > op[1]->value.i[c]; 938 break; 939 case GLSL_TYPE_FLOAT: 940 data.b[c] = op[0]->value.f[c] > op[1]->value.f[c]; 941 break; 942 case GLSL_TYPE_DOUBLE: 943 data.b[c] = op[0]->value.d[c] > op[1]->value.d[c]; 944 break; 945 default: 946 unreachable("invalid type"); 947 } 948 } 949 break; 950 951 case ir_binop_lequal: 952 for (unsigned c = 0; c < op[0]->type->components(); c++) { 953 switch (op[0]->type->base_type) { 954 case GLSL_TYPE_UINT: 955 data.b[c] = op[0]->value.u[c] <= op[1]->value.u[c]; 956 break; 957 case GLSL_TYPE_INT: 958 data.b[c] = op[0]->value.i[c] <= op[1]->value.i[c]; 959 break; 960 case GLSL_TYPE_FLOAT: 961 data.b[c] = op[0]->value.f[c] <= op[1]->value.f[c]; 962 break; 963 case GLSL_TYPE_DOUBLE: 964 data.b[c] = op[0]->value.d[c] <= op[1]->value.d[c]; 965 break; 966 default: 967 unreachable("invalid type"); 968 } 969 } 970 break; 971 972 case ir_binop_gequal: 973 for (unsigned c = 0; c < op[0]->type->components(); c++) { 974 switch (op[0]->type->base_type) { 975 case GLSL_TYPE_UINT: 976 data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c]; 977 break; 978 case GLSL_TYPE_INT: 979 data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c]; 980 break; 981 case GLSL_TYPE_FLOAT: 982 data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c]; 983 break; 984 case GLSL_TYPE_DOUBLE: 985 data.b[c] = op[0]->value.d[c] >= op[1]->value.d[c]; 986 break; 987 default: 988 unreachable("invalid type"); 989 } 990 } 991 break; 992 993 case ir_binop_equal: 994 for (unsigned c = 0; c < op[0]->type->components(); c++) { 995 switch (op[0]->type->base_type) { 996 case GLSL_TYPE_UINT: 997 data.b[c] = op[0]->value.u[c] == op[1]->value.u[c]; 998 break; 999 case GLSL_TYPE_INT: 1000 data.b[c] = op[0]->value.i[c] == op[1]->value.i[c]; 1001 break; 1002 case GLSL_TYPE_FLOAT: 1003 data.b[c] = op[0]->value.f[c] == op[1]->value.f[c]; 1004 break; 1005 case GLSL_TYPE_DOUBLE: 1006 data.b[c] = op[0]->value.d[c] == op[1]->value.d[c]; 1007 break; 1008 case GLSL_TYPE_BOOL: 1009 data.b[c] = op[0]->value.b[c] == op[1]->value.b[c]; 1010 break; 1011 default: 1012 unreachable("invalid type"); 1013 } 1014 } 1015 break; 1016 1017 case ir_binop_nequal: 1018 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1019 switch (op[0]->type->base_type) { 1020 case GLSL_TYPE_UINT: 1021 data.b[c] = op[0]->value.u[c] != op[1]->value.u[c]; 1022 break; 1023 case GLSL_TYPE_INT: 1024 data.b[c] = op[0]->value.i[c] != op[1]->value.i[c]; 1025 break; 1026 case GLSL_TYPE_FLOAT: 1027 data.b[c] = op[0]->value.f[c] != op[1]->value.f[c]; 1028 break; 1029 case GLSL_TYPE_DOUBLE: 1030 data.b[c] = op[0]->value.d[c] != op[1]->value.d[c]; 1031 break; 1032 case GLSL_TYPE_BOOL: 1033 data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; 1034 break; 1035 default: 1036 unreachable("invalid type"); 1037 } 1038 } 1039 break; 1040 1041 case ir_binop_all_equal: 1042 data.b[0] = op[0]->has_value(op[1]); 1043 break; 1044 1045 case ir_binop_any_nequal: 1046 data.b[0] = !op[0]->has_value(op[1]); 1047 break; 1048 1049 case ir_binop_lshift: 1050 assert(op[0]->type->base_type == GLSL_TYPE_UINT || 1051 op[0]->type->base_type == GLSL_TYPE_INT); 1052 assert(op[1]->type->base_type == GLSL_TYPE_UINT || 1053 op[1]->type->base_type == GLSL_TYPE_INT); 1054 for (unsigned c = 0, c0 = 0, c1 = 0; 1055 c < components; 1056 c0 += c0_inc, c1 += c1_inc, c++) { 1057 1058 switch (op[0]->type->base_type) { 1059 case GLSL_TYPE_UINT: 1060 data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1]; 1061 break; 1062 case GLSL_TYPE_INT: 1063 data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1]; 1064 break; 1065 default: 1066 unreachable("invalid type"); 1067 } 1068 } 1069 break; 1070 1071 case ir_binop_rshift: 1072 assert(op[0]->type->base_type == GLSL_TYPE_UINT || 1073 op[0]->type->base_type == GLSL_TYPE_INT); 1074 assert(op[1]->type->base_type == GLSL_TYPE_UINT || 1075 op[1]->type->base_type == GLSL_TYPE_INT); 1076 for (unsigned c = 0, c0 = 0, c1 = 0; 1077 c < components; 1078 c0 += c0_inc, c1 += c1_inc, c++) { 1079 1080 switch (op[0]->type->base_type) { 1081 case GLSL_TYPE_UINT: 1082 data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1]; 1083 break; 1084 case GLSL_TYPE_INT: 1085 data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1]; 1086 break; 1087 default: 1088 unreachable("invalid type"); 1089 } 1090 } 1091 break; 1092 1093 case ir_binop_bit_and: 1094 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1095 for (unsigned c = 0, c0 = 0, c1 = 0; 1096 c < components; 1097 c0 += c0_inc, c1 += c1_inc, c++) { 1098 1099 switch (op[0]->type->base_type) { 1100 case GLSL_TYPE_UINT: 1101 data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1]; 1102 break; 1103 case GLSL_TYPE_INT: 1104 data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1]; 1105 break; 1106 default: 1107 unreachable("invalid type"); 1108 } 1109 } 1110 break; 1111 1112 case ir_binop_bit_xor: 1113 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1114 for (unsigned c = 0, c0 = 0, c1 = 0; 1115 c < components; 1116 c0 += c0_inc, c1 += c1_inc, c++) { 1117 1118 switch (op[0]->type->base_type) { 1119 case GLSL_TYPE_UINT: 1120 data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1]; 1121 break; 1122 case GLSL_TYPE_INT: 1123 data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1]; 1124 break; 1125 default: 1126 unreachable("invalid type"); 1127 } 1128 } 1129 break; 1130 1131 case ir_binop_bit_or: 1132 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1133 for (unsigned c = 0, c0 = 0, c1 = 0; 1134 c < components; 1135 c0 += c0_inc, c1 += c1_inc, c++) { 1136 1137 switch (op[0]->type->base_type) { 1138 case GLSL_TYPE_UINT: 1139 data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1]; 1140 break; 1141 case GLSL_TYPE_INT: 1142 data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1]; 1143 break; 1144 default: 1145 unreachable("invalid type"); 1146 } 1147 } 1148 break; 1149 1150 case ir_binop_logic_and: 1151 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1152 switch (op[0]->type->base_type) { 1153 case GLSL_TYPE_BOOL: 1154 data.b[c] = op[0]->value.b[c] && op[1]->value.b[c]; 1155 break; 1156 default: 1157 unreachable("invalid type"); 1158 } 1159 } 1160 break; 1161 1162 case ir_binop_logic_xor: 1163 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1164 switch (op[0]->type->base_type) { 1165 case GLSL_TYPE_BOOL: 1166 data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; 1167 break; 1168 default: 1169 unreachable("invalid type"); 1170 } 1171 } 1172 break; 1173 1174 case ir_binop_logic_or: 1175 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1176 switch (op[0]->type->base_type) { 1177 case GLSL_TYPE_BOOL: 1178 data.b[c] = op[0]->value.b[c] || op[1]->value.b[c]; 1179 break; 1180 default: 1181 unreachable("invalid type"); 1182 } 1183 } 1184 break; 1185 1186 case ir_binop_dot: 1187 switch (op[0]->type->base_type) { 1188 case GLSL_TYPE_FLOAT: 1189 data.f[0] = dot_f(op[0], op[1]); 1190 break; 1191 case GLSL_TYPE_DOUBLE: 1192 data.d[0] = dot_d(op[0], op[1]); 1193 break; 1194 default: 1195 unreachable("invalid type"); 1196 } 1197 break; 1198 1199 case ir_binop_min: 1200 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1201 for (unsigned c = 0, c0 = 0, c1 = 0; 1202 c < components; 1203 c0 += c0_inc, c1 += c1_inc, c++) { 1204 1205 switch (op[0]->type->base_type) { 1206 case GLSL_TYPE_UINT: 1207 data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]); 1208 break; 1209 case GLSL_TYPE_INT: 1210 data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]); 1211 break; 1212 case GLSL_TYPE_FLOAT: 1213 data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]); 1214 break; 1215 case GLSL_TYPE_DOUBLE: 1216 data.d[c] = MIN2(op[0]->value.d[c0], op[1]->value.d[c1]); 1217 break; 1218 default: 1219 unreachable("invalid type"); 1220 } 1221 } 1222 break; 1223 1224 case ir_binop_max: 1225 assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 1226 for (unsigned c = 0, c0 = 0, c1 = 0; 1227 c < components; 1228 c0 += c0_inc, c1 += c1_inc, c++) { 1229 1230 switch (op[0]->type->base_type) { 1231 case GLSL_TYPE_UINT: 1232 data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]); 1233 break; 1234 case GLSL_TYPE_INT: 1235 data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]); 1236 break; 1237 case GLSL_TYPE_FLOAT: 1238 data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]); 1239 break; 1240 case GLSL_TYPE_DOUBLE: 1241 data.d[c] = MAX2(op[0]->value.d[c0], op[1]->value.d[c1]); 1242 break; 1243 default: 1244 unreachable("invalid type"); 1245 } 1246 } 1247 break; 1248 1249 case ir_binop_pow: 1250 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1251 switch (op[0]->type->base_type) { 1252 case GLSL_TYPE_FLOAT: 1253 data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]); 1254 break; 1255 default: 1256 unreachable("invalid type"); 1257 } 1258 } 1259 break; 1260 1261 case ir_binop_ldexp: 1262 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1263 switch (op[0]->type->base_type) { 1264 case GLSL_TYPE_FLOAT: 1265 data.f[c] = ldexpf_flush_subnormal(op[0]->value.f[c], op[1]->value.i[c]); 1266 break; 1267 case GLSL_TYPE_DOUBLE: 1268 data.d[c] = ldexp_flush_subnormal(op[0]->value.d[c], op[1]->value.i[c]); 1269 break; 1270 default: 1271 unreachable("invalid type"); 1272 } 1273 } 1274 break; 1275 1276 case ir_binop_vector_extract: { 1277 const int c = CLAMP(op[1]->value.i[0], 0, 1278 (int) op[0]->type->vector_elements - 1); 1279 1280 switch (op[0]->type->base_type) { 1281 case GLSL_TYPE_UINT: 1282 data.u[0] = op[0]->value.u[c]; 1283 break; 1284 case GLSL_TYPE_INT: 1285 data.i[0] = op[0]->value.i[c]; 1286 break; 1287 case GLSL_TYPE_FLOAT: 1288 data.f[0] = op[0]->value.f[c]; 1289 break; 1290 case GLSL_TYPE_DOUBLE: 1291 data.d[0] = op[0]->value.d[c]; 1292 break; 1293 case GLSL_TYPE_BOOL: 1294 data.b[0] = op[0]->value.b[c]; 1295 break; 1296 default: 1297 unreachable("invalid type"); 1298 } 1299 break; 1300 } 1301 1302 case ir_triop_fma: 1303 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1304 switch (op[0]->type->base_type) { 1305 case GLSL_TYPE_FLOAT: 1306 data.f[c] = op[0]->value.f[c] * op[1]->value.f[c] + op[2]->value.f[c]; 1307 break; 1308 case GLSL_TYPE_DOUBLE: 1309 data.d[c] = op[0]->value.d[c] * op[1]->value.d[c] + op[2]->value.d[c]; 1310 break; 1311 default: 1312 unreachable("invalid type"); 1313 } 1314 } 1315 break; 1316 1317 case ir_triop_lrp: { 1318 assert(op[0]->type->base_type == GLSL_TYPE_FLOAT || 1319 op[0]->type->base_type == GLSL_TYPE_DOUBLE); 1320 assert(op[1]->type->base_type == GLSL_TYPE_FLOAT || 1321 op[1]->type->base_type == GLSL_TYPE_DOUBLE); 1322 assert(op[2]->type->base_type == GLSL_TYPE_FLOAT || 1323 op[2]->type->base_type == GLSL_TYPE_DOUBLE); 1324 1325 unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; 1326 for (unsigned c = 0, c2 = 0; c < components; c2 += c2_inc, c++) { 1327 switch (this->type->base_type) { 1328 case GLSL_TYPE_FLOAT: 1329 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]); 1330 break; 1331 case GLSL_TYPE_DOUBLE: 1332 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]); 1333 break; 1334 default: 1335 unreachable("invalid type"); 1336 } 1337 } 1338 break; 1339 } 1340 1341 case ir_triop_csel: 1342 for (unsigned c = 0; c < components; c++) { 1343 switch (this->type->base_type) { 1344 case GLSL_TYPE_UINT: 1345 data.u[c] = op[0]->value.b[c] ? op[1]->value.u[c] : op[2]->value.u[c]; 1346 break; 1347 case GLSL_TYPE_INT: 1348 data.i[c] = op[0]->value.b[c] ? op[1]->value.i[c] : op[2]->value.i[c]; 1349 break; 1350 case GLSL_TYPE_FLOAT: 1351 data.f[c] = op[0]->value.b[c] ? op[1]->value.f[c] : op[2]->value.f[c]; 1352 break; 1353 case GLSL_TYPE_DOUBLE: 1354 data.d[c] = op[0]->value.b[c] ? op[1]->value.d[c] : op[2]->value.d[c]; 1355 break; 1356 case GLSL_TYPE_BOOL: 1357 data.b[c] = op[0]->value.b[c] ? op[1]->value.b[c] : op[2]->value.b[c]; 1358 break; 1359 default: 1360 unreachable("invalid type"); 1361 } 1362 } 1363 break; 1364 1365 case ir_triop_bitfield_extract: 1366 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1367 switch (op[0]->type->base_type) { 1368 case GLSL_TYPE_UINT: 1369 data.i[c] = bitfield_extract_uint(op[0]->value.u[c], op[1]->value.i[c], op[2]->value.i[c]); 1370 break; 1371 case GLSL_TYPE_INT: 1372 data.i[c] = bitfield_extract_int(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c]); 1373 break; 1374 default: 1375 unreachable("invalid type"); 1376 } 1377 } 1378 break; 1379 1380 case ir_triop_vector_insert: { 1381 const unsigned idx = op[2]->value.u[0]; 1382 1383 memcpy(&data, &op[0]->value, sizeof(data)); 1384 1385 switch (this->type->base_type) { 1386 case GLSL_TYPE_UINT: 1387 data.u[idx] = op[1]->value.u[0]; 1388 break; 1389 case GLSL_TYPE_INT: 1390 data.i[idx] = op[1]->value.i[0]; 1391 break; 1392 case GLSL_TYPE_FLOAT: 1393 data.f[idx] = op[1]->value.f[0]; 1394 break; 1395 case GLSL_TYPE_DOUBLE: 1396 data.d[idx] = op[1]->value.d[0]; 1397 break; 1398 case GLSL_TYPE_BOOL: 1399 data.b[idx] = op[1]->value.b[0]; 1400 break; 1401 default: 1402 unreachable("invalid type"); 1403 } 1404 break; 1405 } 1406 1407 case ir_quadop_bitfield_insert: 1408 for (unsigned c = 0; c < op[0]->type->components(); c++) { 1409 switch (op[0]->type->base_type) { 1410 case GLSL_TYPE_UINT: 1411 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]); 1412 break; 1413 case GLSL_TYPE_INT: 1414 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]); 1415 break; 1416 default: 1417 unreachable("invalid type"); 1418 } 1419 } 1420 break; 1421 1422 case ir_quadop_vector: 1423 for (unsigned c = 0; c < this->type->vector_elements; c++) { 1424 switch (this->type->base_type) { 1425 case GLSL_TYPE_UINT: 1426 data.u[c] = op[c]->value.u[0]; 1427 break; 1428 case GLSL_TYPE_INT: 1429 data.i[c] = op[c]->value.i[0]; 1430 break; 1431 case GLSL_TYPE_FLOAT: 1432 data.f[c] = op[c]->value.f[0]; 1433 break; 1434 case GLSL_TYPE_DOUBLE: 1435 data.d[c] = op[c]->value.d[0]; 1436 break; 1437 case GLSL_TYPE_BOOL: 1438 data.b[c] = op[c]->value.b[0]; 1439 break; 1440 default: 1441 unreachable("invalid type"); 1442 } 1443 } 1444 break; 1445 1446 default: 1447 /* FINISHME: Should handle all expression types. */ 1448 return NULL; 1449 } 1450 1451