@@ -201,11 +201,12 @@ multiclass AMO_C_rr_aq_rl<string YLenstr, bits<5> funct5, bits<3> funct3,
201201}
202202
203203multiclass CheriLoad_ri<bits<3> funct3, string opcodestr> {
204- let hasSideEffects = 0, mayLoad = 1, mayStore = 0,
205- DecoderNamespace = "CapModeOnly_" in def ""
206- : RVInstI<funct3, OPC_LOAD, (outs GPR:$rd),
207- (ins YGPR:$rs1, simm12:$imm12), "c"#opcodestr,
208- "$rd, ${imm12}(${rs1})">;
204+ let hasSideEffects = 0, mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1,
205+ DecoderNamespace = "CapModeOnly_" in {
206+ def "" : RVInstI<funct3, OPC_LOAD, (outs GPR:$rd),
207+ (ins YGPR:$rs1, simm12:$imm12), "c"#opcodestr,
208+ "$rd, ${imm12}(${rs1})">;
209+ }
209210 def : InstAlias<opcodestr#" $rd, ${imm12}(${rs1})",
210211 (!cast<Instruction>(NAME) GPR:$rd, YGPR:$rs1, simm12:$imm12),
211212 0>;
@@ -326,9 +327,9 @@ class CCheriStackStore<bits<3> funct3, string OpcodeStr,
326327 : RVInst16CSS<funct3, 0b10, (outs), (ins cls:$rs2, CSP:$rs1, opnd:$imm),
327328 OpcodeStr, "$rs2, ${imm}(${rs1})">;
328329
329- let hasSideEffects = 0, mayLoad = 1,
330- mayStore = 0 in class CCheriLoad_ri<bits<3> funct3, string OpcodeStr,
331- RegisterClass cls, DAGOperand opnd>
330+ let hasSideEffects = 0, mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in
331+ class CCheriLoad_ri<bits<3> funct3, string OpcodeStr,
332+ RegisterClass cls, DAGOperand opnd>
332333 : RVInst16CL<funct3, 0b00, (outs cls:$rd), (ins YGPRC:$rs1, opnd:$imm),
333334 OpcodeStr, "$rd, ${imm}(${rs1})">;
334335
@@ -906,25 +907,25 @@ defm CSD : CheriStore_ri<0b011, "sd">;
906907} // Predicates = [HasCheri, IsRV64, IsCapMode]
907908
908909let Predicates = [HasCheri, IsRV32, IsCapMode] in {
909- let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 1,
910- mayStore = 0 in def CLC_64
911- : RVInstI<0x3, OPC_LOAD, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
912- "clc", "$rd, ${imm12}(${rs1})">;
910+ let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0,
911+ mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in {
912+ def CLC_64 : RVInstI<0x3, OPC_LOAD, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
913+ "clc", "$rd, ${imm12}(${rs1})">;
914+ }
913915 def : InstAlias<"lc $rd, ${imm12}(${rs1})",
914916 (CLC_64 YGPR:$rd, YGPR:$rs1, simm12:$imm12), 0>;
915917
916- let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 0,
917- mayStore =
918- 1 in def CSC_64 : RVInstS<0x3, OPC_STORE, (outs),
919- (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
920- "csc", "$rs2, ${imm12}(${rs1})">;
918+ let DecoderNamespace = "RISCV32CapModeOnly_", hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
919+ def CSC_64 : RVInstS<0x3, OPC_STORE, (outs), (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
920+ "csc", "$rs2, ${imm12}(${rs1})">;
921+ }
921922 def : InstAlias<"sc $rs2, ${imm12}(${rs1})",
922- (CSC_64 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
923+ (CSC_64 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
923924
924- defm : CPrefixedInstAlias<"lc $rd, (${rs1})", (CLC_64 YGPR:$rd, YGPR:$rs1,
925- 0)>;
926- defm : CPrefixedInstAlias<"sc $rs2, (${rs1})", (CSC_64 YGPR:$rs2, YGPR:$rs1,
927- 0)>;
925+ defm : CPrefixedInstAlias<"lc $rd, (${rs1})",
926+ (CLC_64 YGPR:$rd, YGPR:$rs1, 0)>;
927+ defm : CPrefixedInstAlias<"sc $rs2, (${rs1})",
928+ (CSC_64 YGPR:$rs2, YGPR:$rs1, 0)>;
928929}
929930
930931let Predicates = [HasCheriot] in {
@@ -935,25 +936,25 @@ let Predicates = [HasCheriot] in {
935936}
936937
937938let Predicates = [HasCheri, IsRV64, IsCapMode] in {
938- let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 1,
939- mayStore = 0 in def CLC_128
940- : RVInstI<0x2, OPC_MISC_MEM, (outs YGPR:$rd),
941- (ins YGPR:$rs1, simm12:$imm12), "clc", "$rd, ${imm12}(${rs1})">;
939+ let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0,
940+ mayLoad = 1, mayStore = 0, canFoldAsLoad = 1, isReMaterializable = 1 in {
941+ def CLC_128 : RVInstI<0x2, OPC_MISC_MEM, (outs YGPR:$rd), (ins YGPR:$rs1, simm12:$imm12),
942+ "clc", "$rd, ${imm12}(${rs1})">;
943+ }
942944 def : InstAlias<"lc $rd, ${imm12}(${rs1})",
943945 (CLC_128 YGPR:$rd, YGPR:$rs1, simm12:$imm12), 0>;
944946
945- let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 0,
946- mayStore =
947- 1 in def CSC_128 : RVInstS<0x4, OPC_STORE, (outs),
948- (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
949- "csc", "$rs2, ${imm12}(${rs1})">;
947+ let DecoderNamespace = "CapModeOnly_", hasSideEffects = 0, mayLoad = 0, mayStore = 1 in {
948+ def CSC_128 : RVInstS<0x4, OPC_STORE, (outs), (ins YGPR:$rs2, YGPR:$rs1, simm12:$imm12),
949+ "csc", "$rs2, ${imm12}(${rs1})">;
950+ }
950951 def : InstAlias<"sc $rs2, ${imm12}(${rs1})",
951952 (CSC_128 YGPR:$rs2, YGPR:$rs1, simm12:$imm12), 0>;
952953
953- defm : CPrefixedInstAlias<"lc $rd, (${rs1})", (CLC_128 YGPR:$rd, YGPR:$rs1,
954- 0)>;
955- defm : CPrefixedInstAlias<"sc $rs2, (${rs1})", (CSC_128 YGPR:$rs2, YGPR:$rs1,
956- 0)>;
954+ defm : CPrefixedInstAlias<"lc $rd, (${rs1})",
955+ (CLC_128 YGPR:$rd, YGPR:$rs1, 0)>;
956+ defm : CPrefixedInstAlias<"sc $rs2, (${rs1})",
957+ (CSC_128 YGPR:$rs2, YGPR:$rs1, 0)>;
957958}
958959
959960let Predicates = [HasCheri, IsCapMode] in {
0 commit comments