@@ -1312,6 +1312,30 @@ class QCIMVCCIPat<CondCode Cond, QCIMVCCI Inst, DAGOperand InTyImm>
1312
1312
: Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), InTyImm:$imm, Cond)), (XLenVT GPRNoX0:$rs3), (XLenVT GPRNoX0:$rd)),
1313
1313
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, GPRNoX0:$rs3)>;
1314
1314
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
+
1315
1339
// Match `riscv_brcc` and lower to the appropriate XQCIBI branch instruction.
1316
1340
class BcciPat<CondCode Cond, QCIBranchInst_rii Inst, DAGOperand InTyImm>
1317
1341
: Pat<(riscv_brcc (XLenVT GPRNoX0:$rs1), InTyImm:$rs2, Cond, bb:$imm12),
@@ -1461,6 +1485,37 @@ def : QCIMVCCIPat <SETLT, QC_MVLTI, simm5>;
1461
1485
def : QCIMVCCIPat <SETULT, QC_MVLTUI, uimm5>;
1462
1486
}
1463
1487
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
+
1464
1519
//===----------------------------------------------------------------------===/i
1465
1520
// Compress Instruction tablegen backend.
1466
1521
//===----------------------------------------------------------------------===//
0 commit comments