@@ -1451,7 +1451,7 @@ def : PatGpcrUimm12<int_cheri_bounded_stack_cap, CSetBoundsImm>;
14511451def : PatGpcrGpr<int_cheri_bounded_stack_cap_dynamic, CSetBounds>;
14521452def : PatGpcrUimm12<int_cheri_bounded_stack_cap_dynamic, CSetBoundsImm>;
14531453
1454- def : Pat<(CapFrameAddrRegImm(cPTR GPCR:$rs1) , simm12:$imm12),
1454+ def : Pat<(CapFrameAddrRegImm GPCR:$rs1, simm12:$imm12),
14551455 (CIncOffsetImm GPCR:$rs1, simm12:$imm12)>;
14561456
14571457/// Pointer-Arithmetic Instructions
@@ -1463,15 +1463,14 @@ def : Pat<(XLenVT (int_cheri_cap_diff GPCR:$cs1, GPCR:$cs2)),
14631463 (XLenVT (EXTRACT_SUBREG GPCR:$cs2, sub_cap_addr)))>;
14641464
14651465let Predicates = [IsPureCapABI] in {
1466- def : Pat<(inttoptr(XLenVT GPR:$rs2)), (cPTR(CIncOffset(cPTR C0), GPR:$rs2))>;
1467- def : Pat<(inttoptr simm12:$imm12), (cPTR(CIncOffsetImm(cPTR C0),
1468- simm12:$imm12))>;
1469- def : Pat<(XLenVT(ptrtoint(cPTR GPCR:$rs1))), (PseudoCGetAddr GPCR:$rs1)>;
1466+ def : Pat<(inttoptr (XLenVT GPR:$rs2)), (CIncOffset C0, GPR:$rs2)>;
1467+ def : Pat<(inttoptr simm12:$imm12), (CIncOffsetImm C0, simm12:$imm12)>;
1468+ def : Pat<(XLenVT (ptrtoint GPCR:$rs1)), (PseudoCGetAddr GPCR:$rs1)>;
14701469}
14711470
14721471/// Null Capability Patterns
14731472
1474- def : Pat<(inttoptr(XLenVT 0)), (CLenVT(COPY(cPTR C0) ))>;
1473+ def : Pat<(inttoptr (XLenVT 0)), (CLenVT (COPY C0))>;
14751474def : Pat<(ptrtoint (CLenVT (inttoptr (XLenVT 0)))),
14761475 (XLenVT (COPY (XLenVT X0)))>;
14771476
@@ -1482,31 +1481,26 @@ def : Pat<(ptrtoint (CLenVT (inttoptr (XLenVT 0)))),
14821481// * Break untagged < tagged semantics
14831482// * Can't implement exact equality
14841483class CheriSetCCPatGpcrGpcr<PatFrag CondOp, dag GprGprDag>
1485- : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1), (cPTR GPCR:$cs2) )),
1486- (OutPatFrag<(ops node:$rs1, node:$rs2), GprGprDag>(XLenVT
1487- (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1488- (XLenVT(EXTRACT_SUBREG GPCR:$cs2, sub_cap_addr)))>;
1484+ : Pat<(XLenVT (CondOp GPCR:$cs1, GPCR:$cs2)),
1485+ (OutPatFrag<(ops node:$rs1, node:$rs2), GprGprDag>
1486+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1487+ (XLenVT (EXTRACT_SUBREG GPCR:$cs2, sub_cap_addr)))>;
14891488
14901489multiclass CheriSetCCPatGpcrImm<PatFrag CondOp, Operand ImmTy, dag GprImmDag> {
1491- def : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1), (inttoptr ImmTy:$imm12))),
1492- (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>(XLenVT
1493- (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1494- ImmTy:$imm12)>;
1495- def : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1), (cptradd(inttoptr(XLenVT 0)),
1496- ImmTy:$imm12))),
1497- (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>(XLenVT
1498- (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1499- ImmTy:$imm12)>;
1500- def : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1),
1501- (int_cheri_cap_offset_set(inttoptr(XLenVT 0)), ImmTy:$imm12))),
1502- (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>(XLenVT
1503- (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1504- ImmTy:$imm12)>;
1505- def : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1),
1506- (int_cheri_cap_address_set(inttoptr(XLenVT 0)), ImmTy:$imm12))),
1507- (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>(XLenVT
1508- (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)),
1509- ImmTy:$imm12)>;
1490+ def : Pat<(XLenVT (CondOp GPCR:$cs1, (inttoptr ImmTy:$imm12))),
1491+ (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>
1492+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)), ImmTy:$imm12)>;
1493+ def : Pat<(XLenVT (CondOp GPCR:$cs1, (cptradd (inttoptr (XLenVT 0)), ImmTy:$imm12))),
1494+ (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>
1495+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)), ImmTy:$imm12)>;
1496+ def : Pat<(XLenVT (CondOp GPCR:$cs1,
1497+ (int_cheri_cap_offset_set (inttoptr (XLenVT 0)), ImmTy:$imm12))),
1498+ (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>
1499+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)), ImmTy:$imm12)>;
1500+ def : Pat<(XLenVT (CondOp GPCR:$cs1,
1501+ (int_cheri_cap_address_set (inttoptr (XLenVT 0)), ImmTy:$imm12))),
1502+ (OutPatFrag<(ops node:$rs1, node:$imm12), GprImmDag>
1503+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)), ImmTy:$imm12)>;
15101504}
15111505
15121506multiclass CheriSetCCPatGpcrSimm12<PatFrag CondOp, dag GprImmDag>
@@ -1516,9 +1510,9 @@ multiclass CheriSetCCPatGpcrSimm12Plus1<PatFrag CondOp, dag GprImmDag>
15161510 : CheriSetCCPatGpcrImm<CondOp, simm12_plus1, GprImmDag>;
15171511
15181512class CheriSetCCPatGpcrNull<PatFrag CondOp, dag GprDag>
1519- : Pat<(XLenVT(CondOp(cPTR GPCR:$cs1) , (inttoptr(XLenVT 0)))),
1520- (OutPatFrag<(ops node:$rs1), GprDag>(XLenVT(EXTRACT_SUBREG GPCR:$cs1,
1521- sub_cap_addr)))>;
1513+ : Pat<(XLenVT (CondOp GPCR:$cs1, (inttoptr (XLenVT 0)))),
1514+ (OutPatFrag<(ops node:$rs1), GprDag>
1515+ (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)))>;
15221516
15231517class Swap<PatFrag BinFrag>
15241518 : PatFrag<(ops node:$a, node:$b), (BinFrag $b, $a)>;
@@ -1561,10 +1555,11 @@ defm Select_GPCR : SelectCC_GPR_rrirr<GPCR, CLenVT>;
15611555// No dedicated instructions; see above
15621556
15631557class CheriBccPat<PatFrag CondOp, RVInstB Inst>
1564- : Pat<(brcond(XLenVT(CondOp(cPTR GPCR:$rs1), (cPTR GPCR:$rs2))), bb:$imm12),
1565- (Inst(XLenVT(EXTRACT_SUBREG GPCR:$rs1, sub_cap_addr)),
1566- (XLenVT(EXTRACT_SUBREG GPCR:$rs2, sub_cap_addr)),
1567- simm13_lsb0:$imm12)>;
1558+ : Pat<(brcond (XLenVT (CondOp GPCR:$rs1, GPCR:$rs2)), bb:$imm12),
1559+ (Inst
1560+ (XLenVT (EXTRACT_SUBREG GPCR:$rs1, sub_cap_addr)),
1561+ (XLenVT (EXTRACT_SUBREG GPCR:$rs2, sub_cap_addr)),
1562+ simm13_lsb0:$imm12)>;
15681563
15691564def : CheriBccPat<seteq, BEQ>;
15701565def : CheriBccPat<setne, BNE>;
@@ -1574,10 +1569,11 @@ def : CheriBccPat<setult, BLTU>;
15741569def : CheriBccPat<setuge, BGEU>;
15751570
15761571class CheriBccSwapPat<PatFrag CondOp, RVInst InstBcc>
1577- : Pat<(brcond(XLenVT(CondOp(cPTR GPCR:$rs1), (cPTR GPCR:$rs2))), bb:$imm12),
1578- (InstBcc(XLenVT(EXTRACT_SUBREG GPCR:$rs2, sub_cap_addr)),
1579- (XLenVT(EXTRACT_SUBREG GPCR:$rs1, sub_cap_addr)),
1580- simm13_lsb0:$imm12)>;
1572+ : Pat<(brcond (XLenVT (CondOp GPCR:$rs1, GPCR:$rs2)), bb:$imm12),
1573+ (InstBcc
1574+ (XLenVT (EXTRACT_SUBREG GPCR:$rs2, sub_cap_addr)),
1575+ (XLenVT (EXTRACT_SUBREG GPCR:$rs1, sub_cap_addr)),
1576+ simm13_lsb0:$imm12)>;
15811577
15821578def : CheriBccSwapPat<setgt, BLT>;
15831579def : CheriBccSwapPat<setle, BGE>;
@@ -1591,18 +1587,15 @@ def : PatGpcrGpcr<riscv_cap_equal_exact, CSEQX, XLenVT>;
15911587
15921588/// Special Capability Register Access Instructions
15931589
1594- def : Pat<(int_cheri_ddc_get), (CSpecialRW SCR_DDC.Encoding, (cPTR C0))>;
1595- let Predicates = [HasCheri,
1596- IsPureCapABI] in def : Pat<(int_cheri_stack_cap_get),
1597- (CLenVT(COPY(cPTR C2)))>;
1590+ def : Pat<(int_cheri_ddc_get), (CSpecialRW SCR_DDC.Encoding, C0)>;
1591+ let Predicates = [HasCheri, IsPureCapABI] in
1592+ def : Pat<(int_cheri_stack_cap_get), (CLenVT (COPY C2))>;
15981593
15991594let Predicates = [HasCheri, IsCapMode] in
16001595def : Pat<(int_cheri_pcc_get), (AUIPCC 0)>;
16011596
1602- let Predicates = [HasCheri,
1603- NotCapMode] in def : Pat<(int_cheri_pcc_get),
1604- (CSpecialRW SCR_PCC.Encoding,
1605- (cPTR C0))>;
1597+ let Predicates = [HasCheri, NotCapMode] in
1598+ def : Pat<(int_cheri_pcc_get), (CSpecialRW SCR_PCC.Encoding, C0)>;
16061599
16071600/// Fast Register-Clearing Instructions
16081601
@@ -1831,14 +1824,13 @@ defm : PseudoCmpXchgPat<"atomic_cmp_swap_cap", PseudoCmpXchgCap, CLenVT, GPCR>;
18311824/// Capability Mode Instructions
18321825
18331826multiclass CheriLdPat<PatFrag LoadOp, RVInst Inst, ValueType ReturnVt = XLenVT> {
1834- def : Pat<(ReturnVt(LoadOp(CapRegImm(cPTR GPCR:$rs1) , simm12:$imm12))),
1827+ def : Pat<(ReturnVt (LoadOp (CapRegImm GPCR:$rs1, simm12:$imm12))),
18351828 (Inst GPCR:$rs1, simm12:$imm12)>;
18361829}
18371830
18381831multiclass CheriStPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy, ValueType StoreVt = XLenVT> {
1839- def : Pat<(StoreOp(StoreVt StTy:$rs2), (CapRegImm(cPTR GPCR:$rs1),
1840- simm12:$imm12)),
1841- (Inst(StoreVt StTy:$rs2), GPCR:$rs1, simm12:$imm12)>;
1832+ def : Pat<(StoreOp (StoreVt StTy:$rs2), (CapRegImm GPCR:$rs1, simm12:$imm12)),
1833+ (Inst (StoreVt StTy:$rs2), GPCR:$rs1, simm12:$imm12)>;
18421834}
18431835
18441836multiclass CheriAtomicStPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy, ValueType StoreVt>
@@ -2295,11 +2287,6 @@ defm : CheriLdPat<load, CLC_128, CLenVT>;
22952287defm : CheriStPat<store, CSC_128, GPCR, CLenVT>;
22962288} // Predicates = [HasCheri, IsRV64, IsCapMode]
22972289
2298- let Predicates = [HasCheri, HasCheriot, IsRV32, IsCapMode] in {
2299- defm : CheriLdPat<load, CLC_64, f64>;
2300- defm : CheriStPat<store, CSC_64, GPCR, f64>;
2301- } // Predicates = [HasCheri, HasCheriot, IsRV32, IsCapMode]
2302-
23032290//===----------------------------------------------------------------------===//
23042291// Compress Instruction tablegen backend.
23052292//===----------------------------------------------------------------------===//
@@ -2442,17 +2429,7 @@ let Predicates = [HasCheri, IsRV32, IsCapMode, IsRVE] in {
24422429let mayLoad = true, mayStore = false, hasSideEffects = false in
24432430def PseudoCLLW : Pseudo<(outs GPCR:$dst), (ins bare_symbol:$src), [],
24442431 "cllc", "$dst, $src">;
2445- def : Pat<(c64(load(cPTR(load(iPTR globaladdr:$src))))),
2446- (PseudoCLLW bare_symbol:$src)>;
2447- def : Pat<(f64(load(cPTR(load(iPTR globaladdr:$src))))),
2432+ def : Pat<(load (cPTR (load (iPTR globaladdr:$src)))),
24482433 (PseudoCLLW bare_symbol:$src)>;
24492434} // Predicates = [HasCheri, IsRV32, IsCapMode, IsRVE]
2450-
2451- // Cheriot stores f64 in cap registers, so bitcasting between f64 and c64
2452- // is a no-op.
2453- multiclass NopCapRegCast<ValueType Ty1, ValueType Ty2> {
2454- def : Pat<(Ty1(bitconvert(Ty2 GPCR:$Val))), (Ty1 GPCR:$Val)>;
2455- def : Pat<(Ty2(bitconvert(Ty1 GPCR:$Val))), (Ty2 GPCR:$Val)>;
2456- }
2457-
2458- let Predicates = [HasCheri, HasCheriot] in { defm : NopCapRegCast<c64, f64>; }
2435+
0 commit comments