Skip to content

Commit 66969c9

Browse files
authored
[RISCV] Add ISel patterns for Qualcomm uC Xqcics extension (#146675)
Add CodeGen support for conditional select instructions in this extension
1 parent eba35cc commit 66969c9

File tree

4 files changed

+717
-1
lines changed

4 files changed

+717
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
438438
}
439439

440440
if (!Subtarget.useCCMovInsn() && !Subtarget.hasVendorXTHeadCondMov() &&
441-
!Subtarget.hasVendorXqcicm())
441+
!Subtarget.hasVendorXqcicm() && !Subtarget.hasVendorXqcics())
442442
setOperationAction(ISD::SELECT, XLenVT, Custom);
443443

444444
if (Subtarget.hasVendorXqcia() && !Subtarget.is64Bit()) {

llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,30 @@ class QCIMVCCIPat<CondCode Cond, QCIMVCCI Inst, DAGOperand InTyImm>
13121312
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), InTyImm:$imm, Cond)), (XLenVT GPRNoX0:$rs3), (XLenVT GPRNoX0:$rd)),
13131313
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, GPRNoX0:$rs3)>;
13141314

1315+
class QCISELECTCCIPat<CondCode Cond, QCISELECTCCI Inst>
1316+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), simm5:$imm, Cond)), (XLenVT GPRNoX0:$rs2), (XLenVT GPRNoX0:$rs3)),
1317+
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1318+
1319+
class QCISELECTICCIPat<CondCode Cond, QCISELECTICCI Inst>
1320+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), simm5:$imm, Cond)), (XLenVT GPRNoX0:$rs2), simm5:$simm2),
1321+
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, simm5:$simm2)>;
1322+
1323+
class QCISELECTICCIPatInv<CondCode Cond, QCISELECTICCI Inst>
1324+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), simm5:$imm, Cond)), simm5:$simm2, (XLenVT GPRNoX0:$rs2)),
1325+
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, simm5:$simm2)>;
1326+
1327+
class QCISELECTICCPat<CondCode Cond, QCISELECTICC Inst>
1328+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), (XLenVT GPRNoX0:$rs1), Cond)), (XLenVT GPRNoX0:$rs2), simm5:$simm2),
1329+
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm2)>;
1330+
1331+
class QCISELECTICCPatInv<CondCode Cond, QCISELECTICC Inst>
1332+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), (XLenVT GPRNoX0:$rs1), Cond)), simm5:$simm2, (XLenVT GPRNoX0:$rs2)),
1333+
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm2)>;
1334+
1335+
class QCISELECTIICCPat<CondCode Cond, QCISELECTIICC Inst>
1336+
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rd), (XLenVT GPRNoX0:$rs1), Cond)), simm5:$simm1, simm5:$simm2),
1337+
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, simm5:$simm1, simm5:$simm2)>;
1338+
13151339
// Match `riscv_brcc` and lower to the appropriate XQCIBI branch instruction.
13161340
class BcciPat<CondCode Cond, QCIBranchInst_rii Inst, DAGOperand InTyImm>
13171341
: Pat<(riscv_brcc (XLenVT GPRNoX0:$rs1), InTyImm:$rs2, Cond, bb:$imm12),
@@ -1461,6 +1485,37 @@ def : QCIMVCCIPat <SETLT, QC_MVLTI, simm5>;
14611485
def : QCIMVCCIPat <SETULT, QC_MVLTUI, uimm5>;
14621486
}
14631487

1488+
let Predicates = [HasVendorXqcics, IsRV32] in {
1489+
def : Pat<(select (XLenVT GPRNoX0:$rd), (XLenVT GPRNoX0:$rs2),(XLenVT GPRNoX0:$rs3)),
1490+
(QC_SELECTNEI GPRNoX0:$rd, (XLenVT 0), GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1491+
def : Pat<(select (XLenVT GPRNoX0:$rd), (XLenVT GPRNoX0:$rs2), simm5:$simm2),
1492+
(QC_SELECTINEI GPRNoX0:$rd, (XLenVT 0), GPRNoX0:$rs2, simm5:$simm2)>;
1493+
def : Pat<(select (XLenVT GPRNoX0:$rd), simm5:$simm2,(XLenVT GPRNoX0:$rs2)),
1494+
(QC_SELECTIEQI GPRNoX0:$rd, (XLenVT 0), GPRNoX0:$rs2, simm5:$simm2)>;
1495+
1496+
// Below AddedComplexity is added to prefer these conditional select instructions over
1497+
// conditional move instructions
1498+
let AddedComplexity = 1 in {
1499+
def : QCISELECTCCIPat <SETEQ, QC_SELECTEQI>;
1500+
def : QCISELECTCCIPat <SETNE, QC_SELECTNEI>;
1501+
}
1502+
1503+
def : QCISELECTICCIPat <SETEQ, QC_SELECTIEQI>;
1504+
def : QCISELECTICCIPat <SETNE, QC_SELECTINEI>;
1505+
1506+
def : QCISELECTICCIPatInv <SETEQ, QC_SELECTINEI>;
1507+
def : QCISELECTICCIPatInv <SETNE, QC_SELECTIEQI>;
1508+
1509+
def : QCISELECTICCPat <SETEQ, QC_SELECTIEQ>;
1510+
def : QCISELECTICCPat <SETNE, QC_SELECTINE>;
1511+
1512+
def : QCISELECTICCPatInv <SETEQ, QC_SELECTINE>;
1513+
def : QCISELECTICCPatInv <SETNE, QC_SELECTIEQ>;
1514+
1515+
def : QCISELECTIICCPat <SETEQ, QC_SELECTIIEQ>;
1516+
def : QCISELECTIICCPat <SETNE, QC_SELECTIINE>;
1517+
} // Predicates = [HasVendorXqcics, IsRV32]
1518+
14641519
//===----------------------------------------------------------------------===/i
14651520
// Compress Instruction tablegen backend.
14661521
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)