@@ -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.
13161340class 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>;
14611485def : 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