//==----- RISCVMacroFusion.td - Macro Fusion Definitions -----*- tablegen -*-=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // ===---------------------------------------------------------------------===// // The following definitions describe the macro fusion predicators. // Fuse LUI followed by ADDI or ADDIW: // rd = imm[31:0] which decomposes to // lui rd, imm[31:12] // addi(w) rd, rd, imm[11:0] def TuneLUIADDIFusion : SimpleFusion<"lui-addi-fusion", "HasLUIADDIFusion", "Enable LUI+ADDI macro fusion", CheckOpcode<[LUI]>, CheckOpcode<[ADDI, ADDIW]>>; // Fuse AUIPC followed by ADDI: // auipc rd, imm20 // addi rd, rd, imm12 def TuneAUIPCADDIFusion : SimpleFusion<"auipc-addi-fusion", "HasAUIPCADDIFusion", "Enable AUIPC+ADDI macrofusion", CheckOpcode<[AUIPC]>, CheckOpcode<[ADDI]>>; // Fuse zero extension of halfword: // slli rd, rs1, 48 // srli rd, rd, 48 def TuneZExtHFusion : SimpleFusion<"zexth-fusion", "HasZExtHFusion", "Enable SLLI+SRLI to be fused to zero extension of halfword", CheckAll<[ CheckOpcode<[SLLI]>, CheckIsImmOperand<2>, CheckImmOperand<2, 48> ]>, CheckAll<[ CheckOpcode<[SRLI]>, CheckIsImmOperand<2>, CheckImmOperand<2, 48> ]>>; // Fuse zero extension of word: // slli rd, rs1, 32 // srli rd, rd, 32 def TuneZExtWFusion : SimpleFusion<"zextw-fusion", "HasZExtWFusion", "Enable SLLI+SRLI to be fused to zero extension of word", CheckAll<[ CheckOpcode<[SLLI]>, CheckIsImmOperand<2>, CheckImmOperand<2, 32> ]>, CheckAll<[ CheckOpcode<[SRLI]>, CheckIsImmOperand<2>, CheckImmOperand<2, 32> ]>>; // Fuse shifted zero extension of word: // slli rd, rs1, 32 // srli rd, rd, x // where 0 <= x < 32 def TuneShiftedZExtWFusion : SimpleFusion<"shifted-zextw-fusion", "HasShiftedZExtWFusion", "Enable SLLI+SRLI to be fused when computing (shifted) word zero extension", CheckAll<[ CheckOpcode<[SLLI]>, CheckIsImmOperand<2>, CheckImmOperand<2, 32> ]>, CheckAll<[ CheckOpcode<[SRLI]>, CheckIsImmOperand<2>, CheckImmOperandRange<2, 0, 31> ]>>; // Fuse load with add: // add rd, rs1, rs2 // ld rd, 0(rd) def TuneLDADDFusion : SimpleFusion<"ld-add-fusion", "HasLDADDFusion", "Enable LD+ADD macrofusion", CheckOpcode<[ADD]>, CheckAll<[ CheckOpcode<[LD]>, CheckIsImmOperand<2>, CheckImmOperand<2, 0> ]>>;