@@ -164,6 +164,7 @@ pub trait TyVisitor {
164164 fn visit_self ( & mut self ) -> bool ;
165165}
166166
167+ #[ cfg( stage0) ]
167168extern "rust-intrinsic" {
168169 pub fn atomic_cxchg < T > ( dst : & mut T , old : T , src : T ) -> T ;
169170 pub fn atomic_cxchg_acq < T > ( dst : & mut T , old : T , src : T ) -> T ;
@@ -244,6 +245,96 @@ extern "rust-intrinsic" {
244245 pub fn atomic_umax_rel < T > ( dst : & mut T , src : T ) -> T ;
245246 pub fn atomic_umax_acqrel < T > ( dst : & mut T , src : T ) -> T ;
246247 pub fn atomic_umax_relaxed < T > ( dst : & mut T , src : T ) -> T ;
248+ }
249+
250+ #[ cfg( not( stage0) ) ]
251+ extern "rust-intrinsic" {
252+
253+ // NB: These intrinsics take unsafe pointers because they mutate aliased
254+ // memory, which is not valid for either `&` or `&mut`.
255+
256+ pub fn atomic_cxchg < T > ( dst : * mut T , old : T , src : T ) -> T ;
257+ pub fn atomic_cxchg_acq < T > ( dst : * mut T , old : T , src : T ) -> T ;
258+ pub fn atomic_cxchg_rel < T > ( dst : * mut T , old : T , src : T ) -> T ;
259+ pub fn atomic_cxchg_acqrel < T > ( dst : * mut T , old : T , src : T ) -> T ;
260+ pub fn atomic_cxchg_relaxed < T > ( dst : * mut T , old : T , src : T ) -> T ;
261+
262+ pub fn atomic_load < T > ( src : * T ) -> T ;
263+ pub fn atomic_load_acq < T > ( src : * T ) -> T ;
264+ pub fn atomic_load_relaxed < T > ( src : * T ) -> T ;
265+
266+ pub fn atomic_store < T > ( dst : * mut T , val : T ) ;
267+ pub fn atomic_store_rel < T > ( dst : * mut T , val : T ) ;
268+ pub fn atomic_store_relaxed < T > ( dst : * mut T , val : T ) ;
269+
270+ pub fn atomic_xchg < T > ( dst : * mut T , src : T ) -> T ;
271+ pub fn atomic_xchg_acq < T > ( dst : * mut T , src : T ) -> T ;
272+ pub fn atomic_xchg_rel < T > ( dst : * mut T , src : T ) -> T ;
273+ pub fn atomic_xchg_acqrel < T > ( dst : * mut T , src : T ) -> T ;
274+ pub fn atomic_xchg_relaxed < T > ( dst : * mut T , src : T ) -> T ;
275+
276+ pub fn atomic_xadd < T > ( dst : * mut T , src : T ) -> T ;
277+ pub fn atomic_xadd_acq < T > ( dst : * mut T , src : T ) -> T ;
278+ pub fn atomic_xadd_rel < T > ( dst : * mut T , src : T ) -> T ;
279+ pub fn atomic_xadd_acqrel < T > ( dst : * mut T , src : T ) -> T ;
280+ pub fn atomic_xadd_relaxed < T > ( dst : * mut T , src : T ) -> T ;
281+
282+ pub fn atomic_xsub < T > ( dst : * mut T , src : T ) -> T ;
283+ pub fn atomic_xsub_acq < T > ( dst : * mut T , src : T ) -> T ;
284+ pub fn atomic_xsub_rel < T > ( dst : * mut T , src : T ) -> T ;
285+ pub fn atomic_xsub_acqrel < T > ( dst : * mut T , src : T ) -> T ;
286+ pub fn atomic_xsub_relaxed < T > ( dst : * mut T , src : T ) -> T ;
287+
288+ pub fn atomic_and < T > ( dst : * mut T , src : T ) -> T ;
289+ pub fn atomic_and_acq < T > ( dst : * mut T , src : T ) -> T ;
290+ pub fn atomic_and_rel < T > ( dst : * mut T , src : T ) -> T ;
291+ pub fn atomic_and_acqrel < T > ( dst : * mut T , src : T ) -> T ;
292+ pub fn atomic_and_relaxed < T > ( dst : * mut T , src : T ) -> T ;
293+
294+ pub fn atomic_nand < T > ( dst : * mut T , src : T ) -> T ;
295+ pub fn atomic_nand_acq < T > ( dst : * mut T , src : T ) -> T ;
296+ pub fn atomic_nand_rel < T > ( dst : * mut T , src : T ) -> T ;
297+ pub fn atomic_nand_acqrel < T > ( dst : * mut T , src : T ) -> T ;
298+ pub fn atomic_nand_relaxed < T > ( dst : * mut T , src : T ) -> T ;
299+
300+ pub fn atomic_or < T > ( dst : * mut T , src : T ) -> T ;
301+ pub fn atomic_or_acq < T > ( dst : * mut T , src : T ) -> T ;
302+ pub fn atomic_or_rel < T > ( dst : * mut T , src : T ) -> T ;
303+ pub fn atomic_or_acqrel < T > ( dst : * mut T , src : T ) -> T ;
304+ pub fn atomic_or_relaxed < T > ( dst : * mut T , src : T ) -> T ;
305+
306+ pub fn atomic_xor < T > ( dst : * mut T , src : T ) -> T ;
307+ pub fn atomic_xor_acq < T > ( dst : * mut T , src : T ) -> T ;
308+ pub fn atomic_xor_rel < T > ( dst : * mut T , src : T ) -> T ;
309+ pub fn atomic_xor_acqrel < T > ( dst : * mut T , src : T ) -> T ;
310+ pub fn atomic_xor_relaxed < T > ( dst : * mut T , src : T ) -> T ;
311+
312+ pub fn atomic_max < T > ( dst : * mut T , src : T ) -> T ;
313+ pub fn atomic_max_acq < T > ( dst : * mut T , src : T ) -> T ;
314+ pub fn atomic_max_rel < T > ( dst : * mut T , src : T ) -> T ;
315+ pub fn atomic_max_acqrel < T > ( dst : * mut T , src : T ) -> T ;
316+ pub fn atomic_max_relaxed < T > ( dst : * mut T , src : T ) -> T ;
317+
318+ pub fn atomic_min < T > ( dst : * mut T , src : T ) -> T ;
319+ pub fn atomic_min_acq < T > ( dst : * mut T , src : T ) -> T ;
320+ pub fn atomic_min_rel < T > ( dst : * mut T , src : T ) -> T ;
321+ pub fn atomic_min_acqrel < T > ( dst : * mut T , src : T ) -> T ;
322+ pub fn atomic_min_relaxed < T > ( dst : * mut T , src : T ) -> T ;
323+
324+ pub fn atomic_umin < T > ( dst : * mut T , src : T ) -> T ;
325+ pub fn atomic_umin_acq < T > ( dst : * mut T , src : T ) -> T ;
326+ pub fn atomic_umin_rel < T > ( dst : * mut T , src : T ) -> T ;
327+ pub fn atomic_umin_acqrel < T > ( dst : * mut T , src : T ) -> T ;
328+ pub fn atomic_umin_relaxed < T > ( dst : * mut T , src : T ) -> T ;
329+
330+ pub fn atomic_umax < T > ( dst : * mut T , src : T ) -> T ;
331+ pub fn atomic_umax_acq < T > ( dst : * mut T , src : T ) -> T ;
332+ pub fn atomic_umax_rel < T > ( dst : * mut T , src : T ) -> T ;
333+ pub fn atomic_umax_acqrel < T > ( dst : * mut T , src : T ) -> T ;
334+ pub fn atomic_umax_relaxed < T > ( dst : * mut T , src : T ) -> T ;
335+ }
336+
337+ extern "rust-intrinsic" {
247338
248339 pub fn atomic_fence ( ) ;
249340 pub fn atomic_fence_acq ( ) ;
0 commit comments