|
|
|
|
@@ -115,6 +115,7 @@
|
|
|
|
|
#![stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic_load_store = "8"), allow(dead_code))]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic_load_store = "8"), allow(unused_imports))]
|
|
|
|
|
#![deny(unsafe_op_in_unsafe_fn)]
|
|
|
|
|
|
|
|
|
|
use self::Ordering::*;
|
|
|
|
|
|
|
|
|
|
@@ -2335,35 +2336,44 @@ fn strongest_failure_ordering(order: Ordering) -> Ordering {
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
unsafe fn atomic_store<T: Copy>(dst: *mut T, val: T, order: Ordering) {
|
|
|
|
|
match order {
|
|
|
|
|
Release => intrinsics::atomic_store_rel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_store_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_store(dst, val),
|
|
|
|
|
Acquire => panic!("there is no such thing as an acquire store"),
|
|
|
|
|
AcqRel => panic!("there is no such thing as an acquire/release store"),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_store`.
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Release => intrinsics::atomic_store_rel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_store_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_store(dst, val),
|
|
|
|
|
Acquire => panic!("there is no such thing as an acquire store"),
|
|
|
|
|
AcqRel => panic!("there is no such thing as an acquire/release store"),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
unsafe fn atomic_load<T: Copy>(dst: *const T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_load_acq(dst),
|
|
|
|
|
Relaxed => intrinsics::atomic_load_relaxed(dst),
|
|
|
|
|
SeqCst => intrinsics::atomic_load(dst),
|
|
|
|
|
Release => panic!("there is no such thing as a release load"),
|
|
|
|
|
AcqRel => panic!("there is no such thing as an acquire/release load"),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_load`.
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_load_acq(dst),
|
|
|
|
|
Relaxed => intrinsics::atomic_load_relaxed(dst),
|
|
|
|
|
SeqCst => intrinsics::atomic_load(dst),
|
|
|
|
|
Release => panic!("there is no such thing as a release load"),
|
|
|
|
|
AcqRel => panic!("there is no such thing as an acquire/release load"),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_swap<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xchg_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xchg_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xchg_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xchg_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xchg(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_swap`.
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xchg_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xchg_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xchg_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xchg_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xchg(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2371,12 +2381,15 @@ unsafe fn atomic_swap<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_add<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xadd_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xadd_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xadd_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xadd_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xadd(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_add`.
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xadd_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xadd_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xadd_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xadd_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xadd(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2384,12 +2397,15 @@ unsafe fn atomic_add<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_sub<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xsub_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xsub_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xsub_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xsub_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xsub(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_sub`.
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xsub_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xsub_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xsub_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xsub_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xsub(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2402,19 +2418,22 @@ unsafe fn atomic_compare_exchange<T: Copy>(
|
|
|
|
|
success: Ordering,
|
|
|
|
|
failure: Ordering,
|
|
|
|
|
) -> Result<T, T> {
|
|
|
|
|
let (val, ok) = match (success, failure) {
|
|
|
|
|
(Acquire, Acquire) => intrinsics::atomic_cxchg_acq(dst, old, new),
|
|
|
|
|
(Release, Relaxed) => intrinsics::atomic_cxchg_rel(dst, old, new),
|
|
|
|
|
(AcqRel, Acquire) => intrinsics::atomic_cxchg_acqrel(dst, old, new),
|
|
|
|
|
(Relaxed, Relaxed) => intrinsics::atomic_cxchg_relaxed(dst, old, new),
|
|
|
|
|
(SeqCst, SeqCst) => intrinsics::atomic_cxchg(dst, old, new),
|
|
|
|
|
(Acquire, Relaxed) => intrinsics::atomic_cxchg_acq_failrelaxed(dst, old, new),
|
|
|
|
|
(AcqRel, Relaxed) => intrinsics::atomic_cxchg_acqrel_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Relaxed) => intrinsics::atomic_cxchg_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Acquire) => intrinsics::atomic_cxchg_failacq(dst, old, new),
|
|
|
|
|
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
|
|
|
|
|
(_, Release) => panic!("there is no such thing as a release failure ordering"),
|
|
|
|
|
_ => panic!("a failure ordering can't be stronger than a success ordering"),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_compare_exchange`.
|
|
|
|
|
let (val, ok) = unsafe {
|
|
|
|
|
match (success, failure) {
|
|
|
|
|
(Acquire, Acquire) => intrinsics::atomic_cxchg_acq(dst, old, new),
|
|
|
|
|
(Release, Relaxed) => intrinsics::atomic_cxchg_rel(dst, old, new),
|
|
|
|
|
(AcqRel, Acquire) => intrinsics::atomic_cxchg_acqrel(dst, old, new),
|
|
|
|
|
(Relaxed, Relaxed) => intrinsics::atomic_cxchg_relaxed(dst, old, new),
|
|
|
|
|
(SeqCst, SeqCst) => intrinsics::atomic_cxchg(dst, old, new),
|
|
|
|
|
(Acquire, Relaxed) => intrinsics::atomic_cxchg_acq_failrelaxed(dst, old, new),
|
|
|
|
|
(AcqRel, Relaxed) => intrinsics::atomic_cxchg_acqrel_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Relaxed) => intrinsics::atomic_cxchg_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Acquire) => intrinsics::atomic_cxchg_failacq(dst, old, new),
|
|
|
|
|
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
|
|
|
|
|
(_, Release) => panic!("there is no such thing as a release failure ordering"),
|
|
|
|
|
_ => panic!("a failure ordering can't be stronger than a success ordering"),
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if ok { Ok(val) } else { Err(val) }
|
|
|
|
|
}
|
|
|
|
|
@@ -2428,19 +2447,22 @@ unsafe fn atomic_compare_exchange_weak<T: Copy>(
|
|
|
|
|
success: Ordering,
|
|
|
|
|
failure: Ordering,
|
|
|
|
|
) -> Result<T, T> {
|
|
|
|
|
let (val, ok) = match (success, failure) {
|
|
|
|
|
(Acquire, Acquire) => intrinsics::atomic_cxchgweak_acq(dst, old, new),
|
|
|
|
|
(Release, Relaxed) => intrinsics::atomic_cxchgweak_rel(dst, old, new),
|
|
|
|
|
(AcqRel, Acquire) => intrinsics::atomic_cxchgweak_acqrel(dst, old, new),
|
|
|
|
|
(Relaxed, Relaxed) => intrinsics::atomic_cxchgweak_relaxed(dst, old, new),
|
|
|
|
|
(SeqCst, SeqCst) => intrinsics::atomic_cxchgweak(dst, old, new),
|
|
|
|
|
(Acquire, Relaxed) => intrinsics::atomic_cxchgweak_acq_failrelaxed(dst, old, new),
|
|
|
|
|
(AcqRel, Relaxed) => intrinsics::atomic_cxchgweak_acqrel_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Relaxed) => intrinsics::atomic_cxchgweak_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Acquire) => intrinsics::atomic_cxchgweak_failacq(dst, old, new),
|
|
|
|
|
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
|
|
|
|
|
(_, Release) => panic!("there is no such thing as a release failure ordering"),
|
|
|
|
|
_ => panic!("a failure ordering can't be stronger than a success ordering"),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_compare_exchange_weak`.
|
|
|
|
|
let (val, ok) = unsafe {
|
|
|
|
|
match (success, failure) {
|
|
|
|
|
(Acquire, Acquire) => intrinsics::atomic_cxchgweak_acq(dst, old, new),
|
|
|
|
|
(Release, Relaxed) => intrinsics::atomic_cxchgweak_rel(dst, old, new),
|
|
|
|
|
(AcqRel, Acquire) => intrinsics::atomic_cxchgweak_acqrel(dst, old, new),
|
|
|
|
|
(Relaxed, Relaxed) => intrinsics::atomic_cxchgweak_relaxed(dst, old, new),
|
|
|
|
|
(SeqCst, SeqCst) => intrinsics::atomic_cxchgweak(dst, old, new),
|
|
|
|
|
(Acquire, Relaxed) => intrinsics::atomic_cxchgweak_acq_failrelaxed(dst, old, new),
|
|
|
|
|
(AcqRel, Relaxed) => intrinsics::atomic_cxchgweak_acqrel_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Relaxed) => intrinsics::atomic_cxchgweak_failrelaxed(dst, old, new),
|
|
|
|
|
(SeqCst, Acquire) => intrinsics::atomic_cxchgweak_failacq(dst, old, new),
|
|
|
|
|
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
|
|
|
|
|
(_, Release) => panic!("there is no such thing as a release failure ordering"),
|
|
|
|
|
_ => panic!("a failure ordering can't be stronger than a success ordering"),
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if ok { Ok(val) } else { Err(val) }
|
|
|
|
|
}
|
|
|
|
|
@@ -2448,48 +2470,60 @@ unsafe fn atomic_compare_exchange_weak<T: Copy>(
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_and<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_and_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_and_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_and_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_and_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_and(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_and`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_and_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_and_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_and_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_and_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_and(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_nand<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_nand_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_nand_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_nand_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_nand_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_nand(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_nand`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_nand_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_nand_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_nand_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_nand_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_nand(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_or<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_or_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_or_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_or_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_or_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_or(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_or`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_or_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_or_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_or_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_or_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_or(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_xor<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xor_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xor_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xor_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xor_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xor(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_xor`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xor_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_xor_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_xor_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_xor_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_xor(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2497,12 +2531,15 @@ unsafe fn atomic_xor<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_max<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_max_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_max_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_max_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_max_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_max(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_max`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_max_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_max_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_max_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_max_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_max(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2510,12 +2547,15 @@ unsafe fn atomic_max<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_min<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_min_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_min_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_min_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_min_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_min(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_min`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_min_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_min_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_min_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_min_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_min(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2523,12 +2563,15 @@ unsafe fn atomic_min<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_umax<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umax_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_umax_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_umax_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_umax_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_umax(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_umax`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umax_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_umax_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_umax_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_umax_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_umax(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2536,12 +2579,15 @@ unsafe fn atomic_umax<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_umin<T: Copy>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umin_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_umin_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_umin_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_umin_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_umin(dst, val),
|
|
|
|
|
// SAFETY: the caller must uphold the safety contract for `atomic_umin`
|
|
|
|
|
unsafe {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umin_acq(dst, val),
|
|
|
|
|
Release => intrinsics::atomic_umin_rel(dst, val),
|
|
|
|
|
AcqRel => intrinsics::atomic_umin_acqrel(dst, val),
|
|
|
|
|
Relaxed => intrinsics::atomic_umin_relaxed(dst, val),
|
|
|
|
|
SeqCst => intrinsics::atomic_umin(dst, val),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|