@@ -101,6 +101,36 @@ template <typename T> struct Atomic {
101
101
int (mem_ord), int (mem_ord));
102
102
}
103
103
104
+ // Atomic compare exchange (separate success and failure memory orders)
105
+ bool compare_exchange_strong (
106
+ T &expected, T desired, MemoryOrder success_order,
107
+ MemoryOrder failure_order,
108
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
109
+ return __atomic_compare_exchange_n (&val, &expected, desired, false ,
110
+ static_cast <int >(success_order),
111
+ static_cast <int >(failure_order));
112
+ }
113
+
114
+ // Atomic compare exchange (weak version)
115
+ bool compare_exchange_weak (
116
+ T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
117
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
118
+ return __atomic_compare_exchange_n (&val, &expected, desired, true ,
119
+ static_cast <int >(mem_ord),
120
+ static_cast <int >(mem_ord));
121
+ }
122
+
123
+ // Atomic compare exchange (weak version with separate success and failure
124
+ // memory orders)
125
+ bool compare_exchange_weak (
126
+ T &expected, T desired, MemoryOrder success_order,
127
+ MemoryOrder failure_order,
128
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
129
+ return __atomic_compare_exchange_n (&val, &expected, desired, true ,
130
+ static_cast <int >(success_order),
131
+ static_cast <int >(failure_order));
132
+ }
133
+
104
134
T exchange (T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
105
135
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
106
136
#if __has_builtin(__scoped_atomic_exchange_n)
0 commit comments