From 19c0dfb7f24f70fd3c3916dc8c10622fa65afa15 Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sat, 21 Jul 2018 14:56:30 +0200 Subject: [PATCH 1/2] make Atomic*::min/max work on armv5te --- src/libcore/sync/atomic.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index 1e2b18bf9b038..8c7b49efc8c40 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(&self, val: $int_type, order: Ordering) -> $int_type { + unsafe { $min_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.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 { From 96edb05502e0ac2caa61c137810dba87b1174b6c Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Sat, 21 Jul 2018 17:34:13 +0200 Subject: [PATCH 2/2] fix misplaced self --- src/libcore/sync/atomic.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index 8c7b49efc8c40..59d00cca56bc1 100644 --- a/src/libcore/sync/atomic.rs +++ b/src/libcore/sync/atomic.rs @@ -1565,13 +1565,13 @@ assert_eq!(min_foo, 12); pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type { #[cfg(not(target_arch = "armv5te"))] #[inline(always)] - fn inner(&self, val: $int_type, order: Ordering) -> $int_type { - unsafe { $min_fn(self.v.get(), val, order) } + 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(&self, val: $int_type, order: Ordering) -> $int_type { - self.fetch_update(|v| Some(v.min(val)), order, order).unwrap() + 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) }