Skip to content

Commit 72189ea

Browse files
committed
[RISCV] Use SelectAddrRegRegScale for Qcisls instructions.
This reuses code from XTHeadMemIdex. This saves ~500 bytes from the isel table and provides more flexibility in what patterns can be matched.
1 parent 7e3af67 commit 72189ea

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,12 @@ def uimm6gt32 : ImmLeaf<XLenVT, [{
502502
// Addressing modes.
503503
def AddrRegImm : ComplexPattern<iPTR, 2, "SelectAddrRegImm">;
504504

505+
class AddrRegRegScale<int N>
506+
: ComplexPattern<iPTR, 3, "SelectAddrRegRegScale<"#N#">">;
507+
class AddrRegZextRegScale<int N>
508+
: ComplexPattern<i64, 3, "SelectAddrRegZextRegScale<"#N#", 32>",
509+
[], [], 10>;
510+
505511
// Return the negation of an immediate value.
506512
def NegImm : SDNodeXForm<imm, [{
507513
return CurDAG->getSignedTargetConstant(-N->getSExtValue(), SDLoc(N),

llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -743,32 +743,30 @@ def TH_SYNC_I : THCacheInst_void<0b11010, "th.sync.i">;
743743
def TH_SYNC_IS : THCacheInst_void<0b11011, "th.sync.is">;
744744
}
745745

746-
def AddrRegRegScale : ComplexPattern<iPTR, 3, "SelectAddrRegRegScale<3>">;
747-
def AddrRegZextRegScale
748-
: ComplexPattern<i64, 3, "SelectAddrRegZextRegScale<3, 32>",
749-
[], [], 10>;
746+
def AddrRegRegScale3 : AddrRegRegScale<3>;
747+
def AddrRegZextRegScale3 : AddrRegZextRegScale<3>;
750748

751749
multiclass LdIdxPat<PatFrag LoadOp, RVInst Inst, ValueType vt = XLenVT> {
752-
def : Pat<(vt (LoadOp (AddrRegRegScale (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), uimm2:$uimm2))),
750+
def : Pat<(vt (LoadOp (AddrRegRegScale3 (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), uimm2:$uimm2))),
753751
(Inst GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
754752
}
755753

756754
multiclass LdZextIdxPat<PatFrag LoadOp, RVInst Inst, ValueType vt = i64> {
757-
def : Pat<(vt (LoadOp (AddrRegZextRegScale (i64 GPR:$rs1), (i64 GPR:$rs2), uimm2:$uimm2))),
755+
def : Pat<(vt (LoadOp (AddrRegZextRegScale3 (i64 GPR:$rs1), (i64 GPR:$rs2), uimm2:$uimm2))),
758756
(Inst GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
759757
}
760758

761759
multiclass StIdxPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy,
762760
ValueType vt = XLenVT> {
763761
def : Pat<(StoreOp (vt StTy:$rd),
764-
(AddrRegRegScale (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), uimm2:$uimm2)),
762+
(AddrRegRegScale3 (XLenVT GPR:$rs1), (XLenVT GPR:$rs2), uimm2:$uimm2)),
765763
(Inst StTy:$rd, GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
766764
}
767765

768766
multiclass StZextIdxPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy,
769767
ValueType vt = i64> {
770768
def : Pat<(StoreOp (vt StTy:$rd),
771-
(AddrRegZextRegScale (i64 GPR:$rs1), (i64 GPR:$rs2), uimm2:$uimm2)),
769+
(AddrRegZextRegScale3 (i64 GPR:$rs1), (i64 GPR:$rs2), uimm2:$uimm2)),
772770
(Inst StTy:$rd, GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
773771
}
774772

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,6 @@ def AddLike: PatFrags<(ops node:$A, node:$B),
198198
return CurDAG->isBaseWithConstantOffset(SDValue(N, 0));
199199
}]>;
200200

201-
def AddShl : PatFrag<(ops node:$Ra, node:$Rb, node:$SH3),
202-
(add node:$Ra, (shl node:$Rb, node:$SH3))>;
203-
204201
def IntCCtoQCRISCVCC : SDNodeXForm<riscv_selectcc, [{
205202
ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
206203
int64_t Imm = cast<ConstantSDNode>(N->getOperand(1))->getSExtValue();
@@ -1324,12 +1321,14 @@ class QC48StPat<PatFrag StoreOp, RVInst48 Inst>
13241321
: Pat<(StoreOp (i32 GPR:$rs2), (AddLike (i32 GPR:$rs1), simm26_nosimm12:$imm26)),
13251322
(Inst GPR:$rs2, GPR:$rs1, simm26_nosimm12:$imm26)>;
13261323

1324+
def AddrRegRegScale7 : AddrRegRegScale<7>;
1325+
13271326
class QCScaledLdPat<PatFrag LoadOp, RVInst Inst>
1328-
: Pat<(i32 (LoadOp (AddShl (i32 GPRMem:$rs1), (i32 GPRNoX0:$rs2), uimm3:$shamt))),
1327+
: Pat<(i32 (LoadOp (AddrRegRegScale7 (i32 GPRMem:$rs1), (i32 GPRNoX0:$rs2), uimm3:$shamt))),
13291328
(Inst GPRMem:$rs1, GPRNoX0:$rs2, uimm3:$shamt)>;
13301329

13311330
class QCScaledStPat<PatFrag StoreOp, RVInst Inst>
1332-
: Pat<(StoreOp (i32 GPR:$rd), (AddShl (i32 GPRMem:$rs1), (i32 GPRNoX0:$rs2), uimm3:$shamt)),
1331+
: Pat<(StoreOp (i32 GPR:$rd), (AddrRegRegScale7 (i32 GPRMem:$rs1), (i32 GPRNoX0:$rs2), uimm3:$shamt)),
13331332
(Inst GPR:$rd, GPRMem:$rs1, GPRNoX0:$rs2, uimm3:$shamt)>;
13341333

13351334
// Match `riscv_brcc` and lower to the appropriate XQCIBI branch instruction.

0 commit comments

Comments
 (0)