@@ -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 GPCR:$rs1, simm12:$imm12),
1454+ def : Pat<(CapFrameAddrRegImm(cPTR GPCR:$rs1) , simm12:$imm12),
14551455 (CIncOffsetImm GPCR:$rs1, simm12:$imm12)>;
14561456
14571457/// Pointer-Arithmetic Instructions
@@ -1463,14 +1463,15 @@ 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)), (CIncOffset C0, GPR:$rs2)>;
1467- def : Pat<(inttoptr simm12:$imm12), (CIncOffsetImm C0, simm12:$imm12)>;
1468- def : Pat<(XLenVT (ptrtoint GPCR:$rs1)), (PseudoCGetAddr GPCR:$rs1)>;
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)>;
14691470}
14701471
14711472/// Null Capability Patterns
14721473
1473- def : Pat<(inttoptr (XLenVT 0)), (CLenVT (COPY C0))>;
1474+ def : Pat<(inttoptr(XLenVT 0)), (CLenVT(COPY(cPTR C0) ))>;
14741475def : Pat<(ptrtoint (CLenVT (inttoptr (XLenVT 0)))),
14751476 (XLenVT (COPY (XLenVT X0)))>;
14761477
@@ -1481,26 +1482,31 @@ def : Pat<(ptrtoint (CLenVT (inttoptr (XLenVT 0)))),
14811482// * Break untagged < tagged semantics
14821483// * Can't implement exact equality
14831484class CheriSetCCPatGpcrGpcr<PatFrag CondOp, dag GprGprDag>
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)))>;
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)))>;
14881489
14891490multiclass CheriSetCCPatGpcrImm<PatFrag CondOp, Operand ImmTy, dag GprImmDag> {
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)>;
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)>;
15041510}
15051511
15061512multiclass CheriSetCCPatGpcrSimm12<PatFrag CondOp, dag GprImmDag>
@@ -1510,9 +1516,9 @@ multiclass CheriSetCCPatGpcrSimm12Plus1<PatFrag CondOp, dag GprImmDag>
15101516 : CheriSetCCPatGpcrImm<CondOp, simm12_plus1, GprImmDag>;
15111517
15121518class CheriSetCCPatGpcrNull<PatFrag CondOp, dag GprDag>
1513- : Pat<(XLenVT (CondOp GPCR:$cs1, (inttoptr (XLenVT 0)))),
1514- (OutPatFrag<(ops node:$rs1), GprDag>
1515- (XLenVT (EXTRACT_SUBREG GPCR:$cs1, sub_cap_addr)))>;
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)))>;
15161522
15171523class Swap<PatFrag BinFrag>
15181524 : PatFrag<(ops node:$a, node:$b), (BinFrag $b, $a)>;
@@ -1555,11 +1561,10 @@ defm Select_GPCR : SelectCC_GPR_rrirr<GPCR, CLenVT>;
15551561// No dedicated instructions; see above
15561562
15571563class CheriBccPat<PatFrag CondOp, RVInstB Inst>
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)>;
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)>;
15631568
15641569def : CheriBccPat<seteq, BEQ>;
15651570def : CheriBccPat<setne, BNE>;
@@ -1569,11 +1574,10 @@ def : CheriBccPat<setult, BLTU>;
15691574def : CheriBccPat<setuge, BGEU>;
15701575
15711576class CheriBccSwapPat<PatFrag CondOp, RVInst InstBcc>
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)>;
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)>;
15771581
15781582def : CheriBccSwapPat<setgt, BLT>;
15791583def : CheriBccSwapPat<setle, BGE>;
@@ -1587,15 +1591,18 @@ def : PatGpcrGpcr<riscv_cap_equal_exact, CSEQX, XLenVT>;
15871591
15881592/// Special Capability Register Access Instructions
15891593
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))>;
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)))>;
15931598
15941599let Predicates = [HasCheri, IsCapMode] in
15951600def : Pat<(int_cheri_pcc_get), (AUIPCC 0)>;
15961601
1597- let Predicates = [HasCheri, NotCapMode] in
1598- def : Pat<(int_cheri_pcc_get), (CSpecialRW SCR_PCC.Encoding, C0)>;
1602+ let Predicates = [HasCheri,
1603+ NotCapMode] in def : Pat<(int_cheri_pcc_get),
1604+ (CSpecialRW SCR_PCC.Encoding,
1605+ (cPTR C0))>;
15991606
16001607/// Fast Register-Clearing Instructions
16011608
@@ -1824,13 +1831,14 @@ defm : PseudoCmpXchgPat<"atomic_cmp_swap_cap", PseudoCmpXchgCap, CLenVT, GPCR>;
18241831/// Capability Mode Instructions
18251832
18261833multiclass CheriLdPat<PatFrag LoadOp, RVInst Inst, ValueType ReturnVt = XLenVT> {
1827- def : Pat<(ReturnVt (LoadOp (CapRegImm GPCR:$rs1, simm12:$imm12))),
1834+ def : Pat<(ReturnVt(LoadOp(CapRegImm(cPTR GPCR:$rs1) , simm12:$imm12))),
18281835 (Inst GPCR:$rs1, simm12:$imm12)>;
18291836}
18301837
18311838multiclass CheriStPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy, ValueType StoreVt = XLenVT> {
1832- def : Pat<(StoreOp (StoreVt StTy:$rs2), (CapRegImm GPCR:$rs1, simm12:$imm12)),
1833- (Inst (StoreVt StTy:$rs2), GPCR:$rs1, simm12:$imm12)>;
1839+ def : Pat<(StoreOp(StoreVt StTy:$rs2), (CapRegImm(cPTR GPCR:$rs1),
1840+ simm12:$imm12)),
1841+ (Inst(StoreVt StTy:$rs2), GPCR:$rs1, simm12:$imm12)>;
18341842}
18351843
18361844multiclass CheriAtomicStPat<PatFrag StoreOp, RVInst Inst, RegisterClass StTy, ValueType StoreVt>
@@ -2287,6 +2295,11 @@ defm : CheriLdPat<load, CLC_128, CLenVT>;
22872295defm : CheriStPat<store, CSC_128, GPCR, CLenVT>;
22882296} // Predicates = [HasCheri, IsRV64, IsCapMode]
22892297
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+
22902303//===----------------------------------------------------------------------===//
22912304// Compress Instruction tablegen backend.
22922305//===----------------------------------------------------------------------===//
@@ -2429,7 +2442,17 @@ let Predicates = [HasCheri, IsRV32, IsCapMode, IsRVE] in {
24292442let mayLoad = true, mayStore = false, hasSideEffects = false in
24302443def PseudoCLLW : Pseudo<(outs GPCR:$dst), (ins bare_symbol:$src), [],
24312444 "cllc", "$dst, $src">;
2432- def : Pat<(load (cPTR (load (iPTR globaladdr:$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))))),
24332448 (PseudoCLLW bare_symbol:$src)>;
24342449} // Predicates = [HasCheri, IsRV32, IsCapMode, IsRVE]
2435-
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>; }
0 commit comments