|
689 | 689 | (MOVDnop (MOVDconst [c])) => (MOVDconst [c]) |
690 | 690 |
|
691 | 691 | // Avoid unnecessary zero and sign extension when right shifting. |
692 | | -(SRAI <t> [x] (MOVWreg y)) && x >= 0 && x <= 31 => (SRAIW <t> [int64(x)] y) |
693 | | -(SRLI <t> [x] (MOVWUreg y)) && x >= 0 && x <= 31 => (SRLIW <t> [int64(x)] y) |
| 692 | +(SRAI [x] (MOVWreg y)) && x >= 0 && x <= 31 => (SRAIW [x] y) |
| 693 | +(SRLI [x] (MOVWUreg y)) && x >= 0 && x <= 31 => (SRLIW [x] y) |
694 | 694 |
|
695 | 695 | // Replace right shifts that exceed size of signed type. |
696 | 696 | (SRAI <t> [x] (MOVBreg y)) && x >= 8 => (SRAI [63] (SLLI <t> [56] y)) |
697 | 697 | (SRAI <t> [x] (MOVHreg y)) && x >= 16 => (SRAI [63] (SLLI <t> [48] y)) |
698 | | -(SRAI <t> [x] (MOVWreg y)) && x >= 32 => (SRAIW [31] y) |
| 698 | +(SRAI [x] (MOVWreg y)) && x >= 32 => (SRAIW [31] y) |
699 | 699 |
|
700 | 700 | // Eliminate right shifts that exceed size of unsigned type. |
701 | | -(SRLI <t> [x] (MOVBUreg y)) && x >= 8 => (MOVDconst <t> [0]) |
702 | | -(SRLI <t> [x] (MOVHUreg y)) && x >= 16 => (MOVDconst <t> [0]) |
703 | | -(SRLI <t> [x] (MOVWUreg y)) && x >= 32 => (MOVDconst <t> [0]) |
| 701 | +(SRLI [x] (MOVBUreg y)) && x >= 8 => (MOVDconst [0]) |
| 702 | +(SRLI [x] (MOVHUreg y)) && x >= 16 => (MOVDconst [0]) |
| 703 | +(SRLI [x] (MOVWUreg y)) && x >= 32 => (MOVDconst [0]) |
704 | 704 |
|
705 | 705 | // Fold constant into immediate instructions where possible. |
706 | 706 | (ADD (MOVDconst <t> [val]) x) && is32Bit(val) && !t.IsPtr() => (ADDI [val] x) |
707 | 707 | (AND (MOVDconst [val]) x) && is32Bit(val) => (ANDI [val] x) |
708 | 708 | (OR (MOVDconst [val]) x) && is32Bit(val) => (ORI [val] x) |
709 | 709 | (XOR (MOVDconst [val]) x) && is32Bit(val) => (XORI [val] x) |
710 | | -(ROL x (MOVDconst [val])) => (RORI [int64(int8(-val)&63)] x) |
711 | | -(ROLW x (MOVDconst [val])) => (RORIW [int64(int8(-val)&31)] x) |
712 | | -(ROR x (MOVDconst [val])) => (RORI [int64(val&63)] x) |
713 | | -(RORW x (MOVDconst [val])) => (RORIW [int64(val&31)] x) |
714 | | -(SLL x (MOVDconst [val])) => (SLLI [int64(val&63)] x) |
715 | | -(SRL x (MOVDconst [val])) => (SRLI [int64(val&63)] x) |
716 | | -(SLLW x (MOVDconst [val])) => (SLLIW [int64(val&31)] x) |
717 | | -(SRLW x (MOVDconst [val])) => (SRLIW [int64(val&31)] x) |
718 | | -(SRA x (MOVDconst [val])) => (SRAI [int64(val&63)] x) |
719 | | -(SRAW x (MOVDconst [val])) => (SRAIW [int64(val&31)] x) |
720 | | -(SLT x (MOVDconst [val])) && val >= -2048 && val <= 2047 => (SLTI [val] x) |
721 | | -(SLTU x (MOVDconst [val])) && val >= -2048 && val <= 2047 => (SLTIU [val] x) |
| 710 | +(ROL x (MOVDconst [val])) => (RORI [-val&63] x) |
| 711 | +(ROLW x (MOVDconst [val])) => (RORIW [-val&31] x) |
| 712 | +(ROR x (MOVDconst [val])) => (RORI [val&63] x) |
| 713 | +(RORW x (MOVDconst [val])) => (RORIW [val&31] x) |
| 714 | +(SLL x (MOVDconst [val])) => (SLLI [val&63] x) |
| 715 | +(SLLW x (MOVDconst [val])) => (SLLIW [val&31] x) |
| 716 | +(SRL x (MOVDconst [val])) => (SRLI [val&63] x) |
| 717 | +(SRLW x (MOVDconst [val])) => (SRLIW [val&31] x) |
| 718 | +(SRA x (MOVDconst [val])) => (SRAI [val&63] x) |
| 719 | +(SRAW x (MOVDconst [val])) => (SRAIW [val&31] x) |
| 720 | +(SLT x (MOVDconst [val])) && is12Bit(val) => (SLTI [val] x) |
| 721 | +(SLTU x (MOVDconst [val])) && is12Bit(val) => (SLTIU [val] x) |
722 | 722 |
|
723 | 723 | // Replace negated left rotation with right rotation. |
724 | 724 | (ROL x (NEG y)) => (ROR x y) |
|
782 | 782 | (SRAI [x] (MOVDconst [y])) => (MOVDconst [int64(y) >> uint32(x)]) |
783 | 783 |
|
784 | 784 | // Combine doubling via addition with shift. |
785 | | -(SLLI <t> [c] (ADD x x)) && c < t.Size() * 8 - 1 => (SLLI <t> [c+1] x) |
| 785 | +(SLLI <t> [c] (ADD x x)) && c < t.Size() * 8 - 1 => (SLLI [c+1] x) |
786 | 786 | (SLLI <t> [c] (ADD x x)) && c >= t.Size() * 8 - 1 => (MOVDconst [0]) |
787 | 787 |
|
788 | 788 | // SLTI/SLTIU with constants. |
|
0 commit comments