@@ -30,6 +30,19 @@ multiclass LR_r_aq_rl<bits<3> funct3, string opcodestr> {
30
30
def _AQ_RL : LR_r<1, 1, funct3, opcodestr # ".aqrl">;
31
31
}
32
32
33
+ let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
34
+ class SC_r<bit aq, bit rl, bits<3> funct3, string opcodestr>
35
+ : RVInstRAtomic<0b00011, aq, rl, funct3, OPC_AMO,
36
+ (outs GPR:$rd), (ins GPRMemZeroOffset:$rs1, GPR:$rs2),
37
+ opcodestr, "$rd, $rs2, $rs1">;
38
+
39
+ multiclass SC_r_aq_rl<bits<3> funct3, string opcodestr> {
40
+ def "" : SC_r<0, 0, funct3, opcodestr>;
41
+ def _AQ : SC_r<1, 0, funct3, opcodestr # ".aq">;
42
+ def _RL : SC_r<0, 1, funct3, opcodestr # ".rl">;
43
+ def _AQ_RL : SC_r<1, 1, funct3, opcodestr # ".aqrl">;
44
+ }
45
+
33
46
let hasSideEffects = 0, mayLoad = 1, mayStore = 1 in
34
47
class AMO_rr<bits<5> funct5, bit aq, bit rl, bits<3> funct3, string opcodestr>
35
48
: RVInstRAtomic<funct5, aq, rl, funct3, OPC_AMO,
@@ -49,7 +62,7 @@ multiclass AMO_rr_aq_rl<bits<5> funct5, bits<3> funct3, string opcodestr> {
49
62
50
63
let Predicates = [HasStdExtAOrZalrsc], IsSignExtendingOpW = 1 in {
51
64
defm LR_W : LR_r_aq_rl<0b010, "lr.w">, Sched<[WriteAtomicLDW, ReadAtomicLDW]>;
52
- defm SC_W : AMO_rr_aq_rl<0b00011, 0b010, "sc.w">,
65
+ defm SC_W : SC_r_aq_rl< 0b010, "sc.w">,
53
66
Sched<[WriteAtomicSTW, ReadAtomicSTW, ReadAtomicSTW]>;
54
67
} // Predicates = [HasStdExtAOrZalrsc], IsSignExtendingOpW = 1
55
68
@@ -76,7 +89,7 @@ defm AMOMAXU_W : AMO_rr_aq_rl<0b11100, 0b010, "amomaxu.w">,
76
89
77
90
let Predicates = [HasStdExtAOrZalrsc, IsRV64] in {
78
91
defm LR_D : LR_r_aq_rl<0b011, "lr.d">, Sched<[WriteAtomicLDD, ReadAtomicLDD]>;
79
- defm SC_D : AMO_rr_aq_rl<0b00011, 0b011, "sc.d">,
92
+ defm SC_D : SC_r_aq_rl< 0b011, "sc.d">,
80
93
Sched<[WriteAtomicSTD, ReadAtomicSTD, ReadAtomicSTD]>;
81
94
} // Predicates = [HasStdExtAOrZalrsc, IsRV64]
82
95
0 commit comments