@@ -211,6 +211,11 @@ class ALUW_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
211
211
: RVInstR<funct7, funct3, OPC_OP_32, (outs GPR:$rd),
212
212
(ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
213
213
214
+ let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
215
+ class Priv<string opcodestr, bits<7> funct7>
216
+ : RVInstR<funct7, 0b000, OPC_SYSTEM, (outs), (ins GPR:$rs1, GPR:$rs2),
217
+ opcodestr, "">;
218
+
214
219
//===----------------------------------------------------------------------===//
215
220
// Instructions
216
221
//===----------------------------------------------------------------------===//
@@ -333,6 +338,43 @@ def SRLW : ALUW_rr<0b0000000, 0b101, "srlw">;
333
338
def SRAW : ALUW_rr<0b0100000, 0b101, "sraw">;
334
339
} // Predicates = [IsRV64]
335
340
341
+ //===----------------------------------------------------------------------===//
342
+ // Privileged instructions
343
+ //===----------------------------------------------------------------------===//
344
+
345
+ let isBarrier = 1, isReturn = 1, isTerminator = 1 in {
346
+ def URET : Priv<"uret", 0b0000000> {
347
+ let rd = 0;
348
+ let rs1 = 0;
349
+ let rs2 = 0b00010;
350
+ }
351
+
352
+ def SRET : Priv<"sret", 0b0001000> {
353
+ let rd = 0;
354
+ let rs1 = 0;
355
+ let rs2 = 0b00010;
356
+ }
357
+
358
+ def MRET : Priv<"mret", 0b0011000> {
359
+ let rd = 0;
360
+ let rs1 = 0;
361
+ let rs2 = 0b00010;
362
+ }
363
+ } // isBarrier = 1, isReturn = 1, isTerminator = 1
364
+
365
+ def WFI : Priv<"wfi", 0b0001000> {
366
+ let rd = 0;
367
+ let rs1 = 0;
368
+ let rs2 = 0b00101;
369
+ }
370
+
371
+ let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
372
+ def SFENCE_VMA : RVInstR<0b0001001, 0b000, OPC_SYSTEM, (outs),
373
+ (ins GPR:$rs1, GPR:$rs2),
374
+ "sfence.vma", "$rs1, $rs2"> {
375
+ let rd = 0;
376
+ }
377
+
336
378
//===----------------------------------------------------------------------===//
337
379
// Pseudo-instructions and codegen patterns
338
380
//
0 commit comments