From f35f0b433837ea796b606cfb8523f4e76072f72a Mon Sep 17 00:00:00 2001 From: Noa <33094578+coolreader18@users.noreply.github.com> Date: Thu, 11 Nov 2021 17:42:18 -0600 Subject: [PATCH] Use :e registers on x32 --- src/elision.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/elision.rs b/src/elision.rs index 66d61618..dae39cb5 100644 --- a/src/elision.rs +++ b/src/elision.rs @@ -56,6 +56,16 @@ impl AtomicElisionExt for AtomicUsize { fn elision_compare_exchange_acquire(&self, current: usize, new: usize) -> Result { unsafe { let prev: usize; + #[cfg(target_pointer_width = "32")] + asm!( + "xacquire", + "lock", + "cmpxchg [{:e}], {:e}", + in(reg) self, + in(reg) new, + inout("eax") current => prev, + ); + #[cfg(target_pointer_width = "64")] asm!( "xacquire", "lock", @@ -76,6 +86,15 @@ impl AtomicElisionExt for AtomicUsize { fn elision_fetch_sub_release(&self, val: usize) -> usize { unsafe { let prev: usize; + #[cfg(target_pointer_width = "32")] + asm!( + "xrelease", + "lock", + "xadd [{:e}], {:e}", + in(reg) self, + inout(reg) val.wrapping_neg() => prev, + ); + #[cfg(target_pointer_width = "64")] asm!( "xrelease", "lock",