|
| 1 | +//==----- RISCVMacroFusion.td - Macro Fusion Definitions -----*- tablegen -*-=// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | + |
| 9 | +// ===---------------------------------------------------------------------===// |
| 10 | +// The following definitions describe the macro fusion predicators. |
| 11 | + |
| 12 | +// Fuse LUI followed by ADDI or ADDIW. |
| 13 | +// rd = imm[31:0] which decomposes to |
| 14 | +// lui rd, imm[31:12] |
| 15 | +// addi(w) rd, rd, imm[11:0] |
| 16 | +def TuneLUIADDIFusion |
| 17 | + : SimpleFusion<"lui-addi-fusion", "HasLUIADDIFusion", "Enable LUI+ADDI macro fusion", |
| 18 | + CheckOpcode<[LUI]>, |
| 19 | + CheckOpcode<[ADDI, ADDIW]>>; |
| 20 | + |
| 21 | +// Fuse AUIPC followed by ADDI |
| 22 | +// auipc rd, imm20 |
| 23 | +// addi rd, rd, imm12 |
| 24 | +def TuneAUIPCADDIFusion |
| 25 | + : SimpleFusion<"auipc-addi-fusion", "HasAUIPCADDIFusion", |
| 26 | + "Enable AUIPC+ADDI macrofusion", |
| 27 | + CheckOpcode<[AUIPC]>, |
| 28 | + CheckOpcode<[ADDI, ADDIW]>>; |
| 29 | + |
| 30 | +// Fuse zero extension of halfword: |
| 31 | +// slli rd, rs1, 48 |
| 32 | +// srli rd, rd, 48 |
| 33 | +def TuneZExtHFusion |
| 34 | + : SimpleFusion<"zexth-fusion", "HasZExtHFusion", |
| 35 | + "Enable SLLI+SRLI to be fused to zero extension of halfword", |
| 36 | + CheckAll<[ |
| 37 | + CheckOpcode<[SLLI]>, |
| 38 | + CheckImmOperand<2, 48> |
| 39 | + ]>, |
| 40 | + CheckAll<[ |
| 41 | + CheckOpcode<[SRLI]>, |
| 42 | + CheckIsImmOperand<2>, |
| 43 | + CheckImmOperand<2, 48> |
| 44 | + ]>>; |
| 45 | + |
| 46 | +// Fuse zero extension of word: |
| 47 | +// slli rd, rs1, 32 |
| 48 | +// srli rd, rd, 32 |
| 49 | +def TuneZExtWFusion |
| 50 | + : SimpleFusion<"zextw-fusion", "HasZExtWFusion", |
| 51 | + "Enable SLLI+SRLI to be fused to zero extension of word", |
| 52 | + CheckAll<[ |
| 53 | + CheckOpcode<[SLLI]>, |
| 54 | + CheckImmOperand<2, 32> |
| 55 | + ]>, |
| 56 | + CheckAll<[ |
| 57 | + CheckOpcode<[SRLI]>, |
| 58 | + CheckIsImmOperand<2>, |
| 59 | + CheckImmOperand<2, 32> |
| 60 | + ]>>; |
| 61 | + |
| 62 | +// Fuse shifted zero extension of word: |
| 63 | +// slli rd, rs1, 32 |
| 64 | +// srli rd, rd, x |
| 65 | +// where 0 <= x < 32 |
| 66 | +def TuneShiftedZExtWFusion |
| 67 | + : SimpleFusion<"shifted-zextw-fusion", "HasShiftedZExtWFusion", |
| 68 | + "Enable SLLI+SRLI to be fused when computing (shifted) word zero extension", |
| 69 | + CheckAll<[ |
| 70 | + CheckOpcode<[SLLI]>, |
| 71 | + CheckImmOperand<2, 32> |
| 72 | + ]>, |
| 73 | + CheckAll<[ |
| 74 | + CheckOpcode<[SRLI]>, |
| 75 | + CheckIsImmOperand<2>, |
| 76 | + CheckImmOperandRange<2, 0, 31> |
| 77 | + ]>>; |
| 78 | + |
| 79 | +// Fuse load with add: |
| 80 | +// add rd, rs1, rs2 |
| 81 | +// ld rd, 0(rd) |
| 82 | +def TuneLDADDFusion |
| 83 | + : SimpleFusion<"ld-add-fusion", "HasLDADDFusion", "Enable LD+ADD macrofusion", |
| 84 | + CheckOpcode<[ADD]>, |
| 85 | + CheckAll<[ |
| 86 | + CheckOpcode<[LD]>, |
| 87 | + CheckIsImmOperand<2>, |
| 88 | + CheckImmOperand<2, 0> |
| 89 | + ]>>; |
0 commit comments