|
1 | | -use crate::{mem::SizedTypeProperties, cfg_match, intrinsics}; |
| 1 | +use crate::mem::SizedTypeProperties; |
| 2 | +use crate::{cfg_match, intrinsics}; |
2 | 3 |
|
3 | 4 | macro_rules! read_volatile { |
4 | 5 | ($name:ident, $express:expr) => { |
@@ -100,6 +101,33 @@ macro_rules! write_volatile { |
100 | 101 | } |
101 | 102 |
|
102 | 103 | 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 | + } |
103 | 131 | _ => { |
104 | 132 | write_volatile!(dst, src, intrinsics::volatile_store(dst, src)); |
105 | 133 | } |
|
0 commit comments