diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index 1e2b18bf9b038..59d00cca56bc1 100644 --- a/src/libcore/sync/atomic.rs +++ b/src/libcore/sync/atomic.rs @@ -1512,7 +1512,17 @@ assert!(max_foo == 42); reason = "easier and faster min/max than writing manual CAS loop", issue = "48655")] pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type { - unsafe { $max_fn(self.v.get(), val, order) } + #[cfg(not(target_arch = "armv5te"))] + #[inline(always)] + fn inner(&self, val: $int_type, order: Ordering) -> $int_type { + unsafe { $max_fn(self.v.get(), val, order) } + } + #[cfg(target_arch = "arm5vte")] + #[inline(always)] + fn inner(&self, val: $int_type, order: Ordering) -> $int_type { + self.fetch_update(|v| Some(v.max(val)), order, order).unwrap() + } + inner(self, val, order) } } @@ -1553,7 +1563,17 @@ assert_eq!(min_foo, 12); reason = "easier and faster min/max than writing manual CAS loop", issue = "48655")] pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type { - unsafe { $min_fn(self.v.get(), val, order) } + #[cfg(not(target_arch = "armv5te"))] + #[inline(always)] + fn inner(a: &$atomic_type, val: $int_type, order: Ordering) -> $int_type { + unsafe { $min_fn(a.v.get(), val, order) } + } + #[cfg(target_arch = "arm5vte")] + #[inline(always)] + fn inner(a: &$atomic_type, val: $int_type, order: Ordering) -> $int_type { + a.fetch_update(|v| Some(v.min(val)), order, order).unwrap() + } + inner(self, val, order) } } @@ -1869,6 +1889,7 @@ unsafe fn atomic_xor(dst: *mut T, val: T, order: Ordering) -> T { } } +#[cfg(not(target_arch = "armv5te"))] /// returns the max value (signed comparison) #[inline] unsafe fn atomic_max(dst: *mut T, val: T, order: Ordering) -> T { @@ -1882,6 +1903,7 @@ unsafe fn atomic_max(dst: *mut T, val: T, order: Ordering) -> T { } } +#[cfg(not(target_arch = "armv5te"))] /// returns the min value (signed comparison) #[inline] unsafe fn atomic_min(dst: *mut T, val: T, order: Ordering) -> T { @@ -1895,6 +1917,7 @@ unsafe fn atomic_min(dst: *mut T, val: T, order: Ordering) -> T { } } +#[cfg(not(target_arch = "armv5te"))] /// returns the max value (signed comparison) #[inline] unsafe fn atomic_umax(dst: *mut T, val: T, order: Ordering) -> T { @@ -1908,6 +1931,7 @@ unsafe fn atomic_umax(dst: *mut T, val: T, order: Ordering) -> T { } } +#[cfg(not(target_arch = "armv5te"))] /// returns the min value (signed comparison) #[inline] unsafe fn atomic_umin(dst: *mut T, val: T, order: Ordering) -> T {