@@ -109,22 +109,63 @@ defm AMOCAS_Q : AMO_rr_aq_rl<0b00101, 0b100, "amocas.q">;
109
109
// Pseudo-instructions and codegen patterns
110
110
//===----------------------------------------------------------------------===//
111
111
112
+ // An atomic load operation that does not need either acquire or release
113
+ // semantics.
114
+ class relaxed_load<PatFrags base>
115
+ : PatFrag<(ops node:$ptr), (base node:$ptr)> {
116
+ let IsAtomic = 1;
117
+ let IsAtomicOrderingMonotonic = 1;
118
+ }
119
+
120
+ // A atomic load operation that actually needs acquire semantics.
121
+ class acquiring_load<PatFrags base>
122
+ : PatFrag<(ops node:$ptr), (base node:$ptr)> {
123
+ let IsAtomic = 1;
124
+ let IsAtomicOrderingAcquire = 1;
125
+ }
126
+
127
+ // An atomic load operation that needs sequential consistency.
128
+ class seq_cst_load<PatFrags base>
129
+ : PatFrag<(ops node:$ptr), (base node:$ptr)> {
130
+ let IsAtomic = 1;
131
+ let IsAtomicOrderingSequentiallyConsistent = 1;
132
+ }
133
+
134
+ // An atomic store operation that doesn't actually need to be atomic on RISCV.
135
+ class relaxed_store<PatFrag base>
136
+ : PatFrag<(ops node:$ptr, node:$val), (base node:$val, node:$ptr)> {
137
+ let IsAtomic = 1;
138
+ let IsAtomicOrderingMonotonic = 1;
139
+ }
140
+
141
+ // A store operation that actually needs release semantics.
142
+ class releasing_store<PatFrag base>
143
+ : PatFrag<(ops node:$ptr, node:$val), (base node:$val, node:$ptr)> {
144
+ let IsAtomic = 1;
145
+ let IsAtomicOrderingReleaseOrStronger = 1;
146
+ }
147
+
148
+ // A store operation that actually needs sequential consistency.
149
+ class seq_cst_store<PatFrag base>
150
+ : PatFrag<(ops node:$ptr, node:$val), (base node:$val, node:$ptr)> {
151
+ let IsAtomic = 1;
152
+ let IsAtomicOrderingSequentiallyConsistent = 1;
153
+ }
154
+
112
155
// Atomic load/store are available under both +a and +force-atomics.
113
- // Fences will be inserted for atomic load/stores according to the logic in
114
- // RISCVTargetLowering::{emitLeadingFence,emitTrailingFence}.
115
156
let Predicates = [HasAtomicLdSt] in {
116
- def : LdPat<atomic_load_8, LB>;
117
- def : LdPat<atomic_load_16, LH>;
118
- def : LdPat<atomic_load_32, LW>;
157
+ def : LdPat<relaxed_load< atomic_load_8> , LB>;
158
+ def : LdPat<relaxed_load< atomic_load_16> , LH>;
159
+ def : LdPat<relaxed_load< atomic_load_32> , LW>;
119
160
120
- def : StPat<atomic_store_8, SB, GPR, XLenVT>;
121
- def : StPat<atomic_store_16, SH, GPR, XLenVT>;
122
- def : StPat<atomic_store_32, SW, GPR, XLenVT>;
161
+ def : StPat<relaxed_store< atomic_store_8> , SB, GPR, XLenVT>;
162
+ def : StPat<relaxed_store< atomic_store_16> , SH, GPR, XLenVT>;
163
+ def : StPat<relaxed_store< atomic_store_32> , SW, GPR, XLenVT>;
123
164
}
124
165
125
166
let Predicates = [HasAtomicLdSt, IsRV64] in {
126
- def : LdPat<atomic_load_64, LD, i64>;
127
- def : StPat<atomic_store_64, SD, GPR, i64>;
167
+ def : LdPat<relaxed_load< atomic_load_64> , LD, i64>;
168
+ def : StPat<relaxed_store< atomic_store_64> , SD, GPR, i64>;
128
169
}
129
170
130
171
/// AMOs
0 commit comments