Mozilla MPL TODO: evaluate license, possibly rewrite https://github.com/Siguza/iometa/blob/master/src/a64.c */
| 573 | TODO: evaluate license, possibly rewrite |
| 574 | https://github.com/Siguza/iometa/blob/master/src/a64.c */ |
| 575 | uint64_t AdvSIMDExpandImm(uint8_t op, uint8_t cmode, uint64_t imm8) |
| 576 | { |
| 577 | uint64_t imm64; |
| 578 | switch ((cmode >> 1) & 0b111) |
| 579 | { |
| 580 | case 0b000: |
| 581 | imm64 = Replicate(imm8, 2, 32); |
| 582 | break; |
| 583 | case 0b001: |
| 584 | imm64 = Replicate(imm8 << 8, 2, 32); |
| 585 | break; |
| 586 | case 0b010: |
| 587 | imm64 = Replicate(imm8 << 16, 2, 32); |
| 588 | break; |
| 589 | case 0b011: |
| 590 | imm64 = Replicate(imm8 << 24, 2, 32); |
| 591 | break; |
| 592 | case 0b100: |
| 593 | imm64 = Replicate(imm8, 4, 16); |
| 594 | break; |
| 595 | case 0b101: |
| 596 | imm64 = Replicate(imm8 << 8, 4, 16); |
| 597 | break; |
| 598 | case 0b110: |
| 599 | imm64 = Replicate(imm8 << (8 << (cmode & 0b1)), 2, 32); |
| 600 | break; |
| 601 | case 0b111: |
| 602 | switch (((cmode & 0b1) << 1) | op) |
| 603 | { |
| 604 | case 0b00: |
| 605 | imm64 = Replicate(imm8, 8, 8); |
| 606 | break; |
| 607 | case 0b01: |
| 608 | #if 0 |
| 609 | imm8a = Replicate((imm8 >> 7) & 0b1, 8, 1); |
| 610 | imm8b = Replicate((imm8 >> 6) & 0b1, 8, 1); |
| 611 | imm8c = Replicate((imm8 >> 5) & 0b1, 8, 1); |
| 612 | imm8d = Replicate((imm8 >> 4) & 0b1, 8, 1); |
| 613 | imm8e = Replicate((imm8 >> 3) & 0b1, 8, 1); |
| 614 | imm8f = Replicate((imm8 >> 2) & 0b1, 8, 1); |
| 615 | imm8g = Replicate((imm8 >> 1) & 0b1, 8, 1); |
| 616 | imm8h = Replicate((imm8 ) & 0b1, 8, 1); |
| 617 | imm64 = (imm8a << 0x38) | (imm8b << 0x30) | (imm8c << 0x28) | (imm8d << 0x20) | (imm8e << 0x18) | (imm8f << 0x10) | (imm8g << 0x08) | imm8h; |
| 618 | #else |
| 619 | imm64 = imm8 | (imm8 << (0x08 - 1)) | (imm8 << (0x10 - 2)) | (imm8 << (0x18 - 3)) | |
| 620 | (imm8 << (0x20 - 4)) | (imm8 << (0x28 - 5)) | (imm8 << (0x30 - 6)) | |
| 621 | (imm8 << (0x38 - 7)); |
| 622 | imm64 &= 0x0101010101010101; |
| 623 | imm64 = Replicate(imm64, 8, 1); |
| 624 | #endif |
| 625 | break; |
| 626 | case 0b10: |
| 627 | imm64 = Replicate((((imm8 & 0xc0) ^ 0x80) << 24) | |
| 628 | (Replicate((imm8 >> 6) & 0b1, 5, 1) << 25) | ((imm8 & 0x3f) << 19), |
| 629 | 2, 32); |
| 630 | break; |
| 631 | case 0b11: |
| 632 | imm64 = (((imm8 & 0xc0) ^ 0x80) << 56) | (Replicate((imm8 >> 6) & 0b1, 8, 1) << 54) | |
no test coverage detected