@@ -109,22 +109,63 @@ defm AMOCAS_Q : AMO_rr_aq_rl<0b00101, 0b100, "amocas.q">;
109109// Pseudo-instructions and codegen patterns
110110//===----------------------------------------------------------------------===//
111111
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+
112155// 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}.
115156let 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>;
119160
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>;
123164}
124165
125166let 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>;
128169}
129170
130171/// AMOs
0 commit comments