|
1 | | -use crate::{mem::SizedTypeProperties, cfg_match, intrinsics}; |
| 1 | +use crate::mem::SizedTypeProperties; |
| 2 | +use crate::{cfg_match, intrinsics}; |
2 | 3 |
|
3 | 4 | /// Performs a volatile read of the value from `src` without moving it. This |
4 | 5 | /// leaves the memory in `src` unchanged. |
@@ -203,6 +204,33 @@ pub unsafe fn write_volatile<T>(dst: *mut T, src: T) { |
203 | 204 | ) => crate::ub_checks::maybe_is_aligned_and_not_null(addr, align, is_zst) |
204 | 205 | ); |
205 | 206 | cfg_match! { |
| 207 | + all(target_arch = "arm", target_feature = "thumb-mode", target_pointer_width = "32") => { |
| 208 | + { |
| 209 | + use crate::arch::asm; |
| 210 | + use crate::mem::MaybeUninit; |
| 211 | + |
| 212 | + match size_of::<T>() { |
| 213 | + 1 => |
| 214 | + asm!( |
| 215 | + "strb {val}, [{dest}]", |
| 216 | + val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u8>>(src), |
| 217 | + dest = in(reg) dst |
| 218 | + ), |
| 219 | + |
| 220 | + 2 => asm!( |
| 221 | + "strh {val}, [{dest}]", |
| 222 | + val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u16>>(src), |
| 223 | + dest = in(reg) dst, |
| 224 | + ), |
| 225 | + 4 => asm!( |
| 226 | + "str {val}, [{dest}]", |
| 227 | + val = in(reg) intrinsics::transmute_unchecked::<T, MaybeUninit<u32>>(src), |
| 228 | + dest = in(reg) dst |
| 229 | + ), |
| 230 | + _ => intrinsics::volatile_store(dst, src) |
| 231 | + } |
| 232 | + } |
| 233 | + } |
206 | 234 | _ => { |
207 | 235 | intrinsics::volatile_store(dst, src); |
208 | 236 | } |
|
0 commit comments