Skip to content

Commit 220ad11

Browse files
committed
Add thumb asm volatile writes
1 parent c94ee9b commit 220ad11

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

library/core/src/ptr/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,6 @@ pub use non_null::NonNull;
425425
mod unique;
426426
#[unstable(feature = "ptr_internals", issue = "none")]
427427
pub use unique::Unique;
428-
429428
#[stable(feature = "volatile", since = "1.9.0")]
430429
pub use volatile::{read_volatile, write_volatile};
431430

library/core/src/ptr/volatile.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::{mem::SizedTypeProperties, cfg_match, intrinsics};
1+
use crate::mem::SizedTypeProperties;
2+
use crate::{cfg_match, intrinsics};
23

34
macro_rules! read_volatile {
45
($name:ident, $express:expr) => {
@@ -100,6 +101,33 @@ macro_rules! write_volatile {
100101
}
101102

102103
cfg_match! {
104+
all(target_arch = "arm", target_feature = "thumb-mode", target_pointer_width = "32") => {
105+
write_volatile!(dst, src, {
106+
use crate::arch::asm;
107+
use crate::mem::MaybeUninit;
108+
109+
match size_of::<T>() {
110+
1 =>
111+
asm!(
112+
"strb {val}, [{dest}]",
113+
val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u8>>(src),
114+
dest = in(reg) dst
115+
),
116+
117+
2 => asm!(
118+
"strh {val}, [{dest}]",
119+
val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u16>>(src),
120+
dest = in(reg) dst,
121+
),
122+
4 => asm!(
123+
"str {val}, [{dest}]",
124+
val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u32>>(src),
125+
dest = in(reg) dst
126+
),
127+
_ => intrinsics::volatile_store(dst, src)
128+
}
129+
});
130+
}
103131
_ => {
104132
write_volatile!(dst, src, intrinsics::volatile_store(dst, src));
105133
}

0 commit comments

Comments
 (0)