@@ -1343,51 +1343,51 @@ class QCScaledStPat<PatFrag StoreOp, RVInst Inst>
1343
1343
(Inst GPR:$rd, GPRMem:$rs1, GPRNoX0:$rs2, uimm3:$shamt)>;
1344
1344
1345
1345
class QCIMVCCPat<CondCode Cond, QCIMVCC Inst>
1346
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rs1), (i32 GPRNoX0:$rs2), Cond)) , (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd)),
1346
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 GPRNoX0:$rs2), Cond, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd) )),
1347
1347
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1348
1348
1349
1349
class QCIMVCCIPat<CondCode Cond, QCIMVCCI Inst, DAGOperand InTyImm>
1350
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rs1), InTyImm:$imm, Cond)) , (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd)),
1350
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), InTyImm:$imm, Cond, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd) )),
1351
1351
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, GPRNoX0:$rs3)>;
1352
1352
1353
1353
class QCISELECTCCIPat<CondCode Cond, QCISELECTCCI Inst>
1354
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), simm5:$imm, Cond)) , (i32 GPRNoX0:$rs2), (i32 GPRNoX0:$rs3)),
1354
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), simm5:$imm, Cond, (i32 GPRNoX0:$rs2), (i32 GPRNoX0:$rs3) )),
1355
1355
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1356
1356
1357
1357
class QCISELECTICCIPat<CondCode Cond, QCISELECTICCI Inst>
1358
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), simm5:$imm, Cond)) , (i32 GPRNoX0:$rs2), simm5:$simm2),
1358
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), simm5:$imm, Cond, (i32 GPRNoX0:$rs2), simm5:$simm2) ),
1359
1359
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, simm5:$simm2)>;
1360
1360
1361
1361
class QCISELECTICCIPatInv<CondCode Cond, QCISELECTICCI Inst>
1362
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), simm5:$imm, Cond)) , simm5:$simm2, (i32 GPRNoX0:$rs2)),
1362
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), simm5:$imm, Cond, simm5:$simm2, (i32 GPRNoX0:$rs2) )),
1363
1363
(Inst GPRNoX0:$rd, simm5:$imm, GPRNoX0:$rs2, simm5:$simm2)>;
1364
1364
1365
1365
class QCISELECTICCPat<CondCode Cond, QCISELECTICC Inst>
1366
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond)) , (i32 GPRNoX0:$rs2), simm5:$simm2),
1366
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond, (i32 GPRNoX0:$rs2), simm5:$simm2) ),
1367
1367
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm2)>;
1368
1368
1369
1369
class QCISELECTICCPatInv<CondCode Cond, QCISELECTICC Inst>
1370
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond)) , simm5:$simm2, (i32 GPRNoX0:$rs2)),
1370
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond, simm5:$simm2, (i32 GPRNoX0:$rs2) )),
1371
1371
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm2)>;
1372
1372
1373
1373
class QCISELECTIICCPat<CondCode Cond, QCISELECTIICC Inst>
1374
- : Pat<(select ( i32 (setcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond)) , simm5:$simm1, simm5:$simm2),
1374
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs1), Cond, simm5:$simm1, simm5:$simm2) ),
1375
1375
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, simm5:$simm1, simm5:$simm2)>;
1376
1376
1377
1377
class QCILICCPat<CondCode Cond, QCILICC Inst>
1378
- : Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), (XLenVT GPRNoX0:$rs2), Cond)) , simm5:$simm, (XLenVT GPRNoX0:$rd)),
1378
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 GPRNoX0:$rs2), Cond, simm5:$simm, (i32 GPRNoX0:$rd) )),
1379
1379
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm)>;
1380
1380
1381
1381
class QCILICCPatInv<CondCode Cond, QCILICC Inst>
1382
- : Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), (XLenVT GPRNoX0:$rs2), Cond)) , (XLenVT GPRNoX0:$rd), simm5:$simm),
1382
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 GPRNoX0:$rs2), Cond, (i32 GPRNoX0:$rd), simm5:$simm) ),
1383
1383
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, simm5:$simm)>;
1384
1384
1385
1385
class QCILICCIPat<CondCode Cond, QCILICC Inst, DAGOperand InTyImm>
1386
- : Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), InTyImm:$imm, Cond)) , simm5:$simm, (XLenVT GPRNoX0:$rd)),
1386
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), InTyImm:$imm, Cond, simm5:$simm, (i32 GPRNoX0:$rd) )),
1387
1387
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, simm5:$simm)>;
1388
1388
1389
1389
class QCILICCIPatInv<CondCode Cond, QCILICC Inst, DAGOperand InTyImm>
1390
- : Pat<(select (XLenVT (setcc (XLenVT GPRNoX0:$rs1), InTyImm:$imm, Cond)) , (XLenVT GPRNoX0:$rd), simm5:$simm),
1390
+ : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), InTyImm:$imm, Cond, (i32 GPRNoX0:$rd), simm5:$simm) ),
1391
1391
(Inst GPRNoX0:$rd, GPRNoX0:$rs1, InTyImm:$imm, simm5:$simm)>;
1392
1392
1393
1393
// Match `riscv_brcc` and lower to the appropriate XQCIBI branch instruction.
@@ -1539,81 +1539,93 @@ let Predicates = [HasVendorXqciint, IsRV32] in
1539
1539
def : Pat<(riscv_mileaveret_glue), (QC_C_MILEAVERET)>;
1540
1540
1541
1541
let Predicates = [HasVendorXqcicm, IsRV32] in {
1542
- def : Pat<(select (i32 GPRNoX0:$rs1), (i32 GPRNoX0:$rd),(i32 GPRNoX0:$rs3)),
1543
- (QC_MVEQI GPRNoX0:$rd, GPRNoX0:$rs1, (i32 0), GPRNoX0:$rs3)>;
1544
-
1545
- def : QCIMVCCPat <SETEQ, QC_MVEQ>;
1546
- def : QCIMVCCPat <SETNE, QC_MVNE>;
1547
- def : QCIMVCCPat <SETLT, QC_MVLT>;
1548
- def : QCIMVCCPat <SETULT, QC_MVLTU>;
1549
-
1550
- def : QCIMVCCIPat <SETLT, QC_MVLTI, simm5>;
1551
- def : QCIMVCCIPat <SETULT, QC_MVLTUI, uimm5>;
1552
- }
1553
-
1554
- // Prioritize Xqcics over these patterns.
1555
- let Predicates = [HasVendorXqcicm, NoVendorXqcics, IsRV32] in {
1556
- def : QCIMVCCIPat <SETEQ, QC_MVEQI, simm5>;
1557
- def : QCIMVCCIPat <SETNE, QC_MVNEI, simm5>;
1542
+ // (SELECT X, Y, Z) is canonicalised to `(riscv_selectcc x, 0, NE, y, z)`.
1543
+ // This exists to prioritise over the `Select_GPR_Using_CC_GPR` pattern.
1544
+ def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 0), SETNE, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
1545
+ (QC_MVNEI GPRNoX0:$rd, GPRNoX0:$rs1, 0, GPRNoX0:$rs3)>;
1546
+ def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rs1), (i32 0), SETEQ, (i32 GPRNoX0:$rs3), (i32 GPRNoX0:$rd))),
1547
+ (QC_MVEQI GPRNoX0:$rd, GPRNoX0:$rs1, 0, GPRNoX0:$rs3)>;
1548
+
1549
+ def : QCIMVCCPat<SETEQ, QC_MVEQ>;
1550
+ def : QCIMVCCPat<SETNE, QC_MVNE>;
1551
+ def : QCIMVCCPat<SETLT, QC_MVLT>;
1552
+ def : QCIMVCCPat<SETULT, QC_MVLTU>;
1553
+ def : QCIMVCCPat<SETGE, QC_MVGE>;
1554
+ def : QCIMVCCPat<SETUGE, QC_MVGEU>;
1555
+
1556
+ def : QCIMVCCIPat<SETEQ, QC_MVEQI, simm5>;
1557
+ def : QCIMVCCIPat<SETNE, QC_MVNEI, simm5>;
1558
+ def : QCIMVCCIPat<SETLT, QC_MVLTI, simm5>;
1559
+ def : QCIMVCCIPat<SETULT, QC_MVLTUI, uimm5>;
1560
+ def : QCIMVCCIPat<SETGE, QC_MVGEI, simm5>;
1561
+ def : QCIMVCCIPat<SETUGE, QC_MVGEUI, uimm5>;
1558
1562
}
1559
1563
1560
- let Predicates = [HasVendorXqcicli, HasVendorXqcicsOrXqcicm, IsRV32] in {
1561
- def : QCILICCPat <SETEQ, QC_LIEQ>;
1562
- def : QCILICCPat <SETNE, QC_LINE>;
1563
- def : QCILICCPat <SETLT, QC_LILT>;
1564
- def : QCILICCPat <SETGE, QC_LIGE>;
1565
- def : QCILICCPat <SETULT, QC_LILTU>;
1566
- def : QCILICCPat <SETUGE, QC_LIGEU>;
1567
-
1568
- def : QCILICCIPat <SETEQ, QC_LIEQI, simm5>;
1569
- def : QCILICCIPat <SETNE, QC_LINEI, simm5>;
1570
- def : QCILICCIPat <SETLT, QC_LILTI, simm5>;
1571
- def : QCILICCIPat <SETGE, QC_LIGEI, simm5>;
1572
- def : QCILICCIPat <SETULT, QC_LILTUI, uimm5>;
1573
- def : QCILICCIPat <SETUGE, QC_LIGEUI, uimm5>;
1574
-
1575
- def : QCILICCPatInv <SETNE, QC_LIEQ>;
1576
- def : QCILICCPatInv <SETEQ, QC_LINE>;
1577
- def : QCILICCPatInv <SETGE, QC_LILT>;
1578
- def : QCILICCPatInv <SETLT, QC_LIGE>;
1579
- def : QCILICCPatInv <SETUGE, QC_LILTU>;
1580
- def : QCILICCPatInv <SETULT, QC_LIGEU>;
1581
-
1582
- def : QCILICCIPatInv <SETNE, QC_LIEQI, simm5>;
1583
- def : QCILICCIPatInv <SETEQ, QC_LINEI, simm5>;
1584
- def : QCILICCIPatInv <SETGE, QC_LILTI, simm5>;
1585
- def : QCILICCIPatInv <SETLT, QC_LIGEI, simm5>;
1586
- def : QCILICCIPatInv <SETUGE, QC_LILTUI, uimm5>;
1587
- def : QCILICCIPatInv <SETULT, QC_LIGEUI, uimm5>;
1588
- }
1564
+ let Predicates = [HasVendorXqcicli, IsRV32] in {
1565
+ def : QCILICCPat<SETEQ, QC_LIEQ>;
1566
+ def : QCILICCPat<SETNE, QC_LINE>;
1567
+ def : QCILICCPat<SETLT, QC_LILT>;
1568
+ def : QCILICCPat<SETGE, QC_LIGE>;
1569
+ def : QCILICCPat<SETULT, QC_LILTU>;
1570
+ def : QCILICCPat<SETUGE, QC_LIGEU>;
1571
+
1572
+ def : QCILICCIPat<SETEQ, QC_LIEQI, simm5>;
1573
+ def : QCILICCIPat<SETNE, QC_LINEI, simm5>;
1574
+ def : QCILICCIPat<SETLT, QC_LILTI, simm5>;
1575
+ def : QCILICCIPat<SETGE, QC_LIGEI, simm5>;
1576
+ def : QCILICCIPat<SETULT, QC_LILTUI, uimm5>;
1577
+ def : QCILICCIPat<SETUGE, QC_LIGEUI, uimm5>;
1578
+
1579
+ def : QCILICCPatInv<SETNE, QC_LIEQ>;
1580
+ def : QCILICCPatInv<SETEQ, QC_LINE>;
1581
+ def : QCILICCPatInv<SETGE, QC_LILT>;
1582
+ def : QCILICCPatInv<SETLT, QC_LIGE>;
1583
+ def : QCILICCPatInv<SETUGE, QC_LILTU>;
1584
+ def : QCILICCPatInv<SETULT, QC_LIGEU>;
1585
+
1586
+ def : QCILICCIPatInv<SETNE, QC_LIEQI, simm5>;
1587
+ def : QCILICCIPatInv<SETEQ, QC_LINEI, simm5>;
1588
+ def : QCILICCIPatInv<SETGE, QC_LILTI, simm5>;
1589
+ def : QCILICCIPatInv<SETLT, QC_LIGEI, simm5>;
1590
+ def : QCILICCIPatInv<SETUGE, QC_LILTUI, uimm5>;
1591
+ def : QCILICCIPatInv<SETULT, QC_LIGEUI, uimm5>;
1592
+ } // Predicates = [HasVendorXqcicli, IsRV32]
1589
1593
1590
1594
let Predicates = [HasVendorXqcics, IsRV32] in {
1591
- def : Pat<(select (i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs2),(i32 GPRNoX0:$rs3)),
1592
- (QC_SELECTNEI GPRNoX0:$rd, (i32 0), GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1593
- def : Pat<(select ( i32 GPRNoX0:$rd), (i32 GPRNoX0:$rs2), simm5:$simm2),
1595
+ // (SELECT X, Y, Z) is canonicalised to `(riscv_selectcc x, 0, NE, y, z)`.
1596
+ // These exist to prioritise over the `Select_GPR_Using_CC_GPR` pattern.
1597
+ def : Pat<(i32 (riscv_selectcc ( i32 GPRNoX0:$rd), (i32 0), SETNE, (i32 GPRNoX0:$rs2), simm5:$simm2) ),
1594
1598
(QC_SELECTINEI GPRNoX0:$rd, (i32 0), GPRNoX0:$rs2, simm5:$simm2)>;
1595
- def : Pat<(select ( i32 GPRNoX0:$rd), simm5:$simm2,(i32 GPRNoX0:$rs2)),
1599
+ def : Pat<(i32 (riscv_selectcc ( i32 GPRNoX0:$rd), (i32 0), SETNE, simm5:$simm2, (i32 GPRNoX0:$rs2) )),
1596
1600
(QC_SELECTIEQI GPRNoX0:$rd, (i32 0), GPRNoX0:$rs2, simm5:$simm2)>;
1597
1601
1598
- def : QCISELECTCCIPat <SETEQ, QC_SELECTEQI>;
1599
- def : QCISELECTCCIPat <SETNE, QC_SELECTNEI>;
1600
-
1601
- def : QCISELECTICCIPat <SETEQ, QC_SELECTIEQI>;
1602
- def : QCISELECTICCIPat <SETNE, QC_SELECTINEI>;
1602
+ def : QCISELECTICCIPat<SETEQ, QC_SELECTIEQI>;
1603
+ def : QCISELECTICCIPat<SETNE, QC_SELECTINEI>;
1603
1604
1604
- def : QCISELECTICCIPatInv <SETEQ, QC_SELECTINEI>;
1605
- def : QCISELECTICCIPatInv <SETNE, QC_SELECTIEQI>;
1605
+ def : QCISELECTICCIPatInv<SETEQ, QC_SELECTINEI>;
1606
+ def : QCISELECTICCIPatInv<SETNE, QC_SELECTIEQI>;
1606
1607
1607
- def : QCISELECTICCPat <SETEQ, QC_SELECTIEQ>;
1608
- def : QCISELECTICCPat <SETNE, QC_SELECTINE>;
1608
+ def : QCISELECTICCPat<SETEQ, QC_SELECTIEQ>;
1609
+ def : QCISELECTICCPat<SETNE, QC_SELECTINE>;
1609
1610
1610
- def : QCISELECTICCPatInv <SETEQ, QC_SELECTINE>;
1611
- def : QCISELECTICCPatInv <SETNE, QC_SELECTIEQ>;
1611
+ def : QCISELECTICCPatInv<SETEQ, QC_SELECTINE>;
1612
+ def : QCISELECTICCPatInv<SETNE, QC_SELECTIEQ>;
1612
1613
1613
- def : QCISELECTIICCPat <SETEQ, QC_SELECTIIEQ>;
1614
- def : QCISELECTIICCPat <SETNE, QC_SELECTIINE>;
1614
+ def : QCISELECTIICCPat<SETEQ, QC_SELECTIIEQ>;
1615
+ def : QCISELECTIICCPat<SETNE, QC_SELECTIINE>;
1615
1616
} // Predicates = [HasVendorXqcics, IsRV32]
1616
1617
1618
+ // Prioritize Xqcicm over these patterns, because Xqcicm is compressible.
1619
+ let Predicates = [HasVendorXqcics, NoVendorXqcicm, IsRV32] in {
1620
+ def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), (i32 0), SETNE, (i32 GPRNoX0:$rs2), (i32 GPRNoX0:$rs3))),
1621
+ (QC_SELECTNEI GPRNoX0:$rd, (i32 0), GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1622
+ def : Pat<(i32 (riscv_selectcc (i32 GPRNoX0:$rd), (i32 0), SETEQ, (i32 GPRNoX0:$rs2), (i32 GPRNoX0:$rs3))),
1623
+ (QC_SELECTEQI GPRNoX0:$rd, (i32 0), GPRNoX0:$rs2, GPRNoX0:$rs3)>;
1624
+
1625
+ def : QCISELECTCCIPat<SETEQ, QC_SELECTEQI>;
1626
+ def : QCISELECTCCIPat<SETNE, QC_SELECTNEI>;
1627
+ }
1628
+
1617
1629
let Predicates = [HasVendorXqcilsm, IsRV32] in {
1618
1630
def : Pat<(qc_setwmi GPR:$rs3, GPR:$rs1, tuimm5nonzero:$uimm5, tuimm7_lsb00:$uimm7),
1619
1631
(QC_SETWMI GPR:$rs3, GPR:$rs1, tuimm5nonzero:$uimm5, tuimm7_lsb00:$uimm7)>;
0 commit comments