#[cfg(not(portable_atomic_no_asm))]
use core::arch::asm;
#[cfg_attr(
portable_atomic_no_cfg_target_has_atomic,
cfg(any(test, portable_atomic_no_atomic_cas))
)]
#[cfg_attr(
not(portable_atomic_no_cfg_target_has_atomic),
cfg(any(test, not(target_has_atomic = "ptr")))
)]
pub(super) use super::super::msp430 as atomic;
pub(crate) type State = u16;
#[inline(always)]
pub(crate) fn disable() -> State {
let sr: State;
unsafe {
#[cfg(not(portable_atomic_no_asm))]
asm!(
"mov r2, {sr}", "dint {{ nop", sr = out(reg) sr,
options(nostack),
);
#[cfg(portable_atomic_no_asm)]
{
llvm_asm!("mov r2, $0" : "=r"(sr) ::: "volatile");
llvm_asm!("dint { nop" ::: "memory" : "volatile");
}
}
sr
}
#[inline(always)]
pub(crate) unsafe fn restore(prev_sr: State) {
unsafe {
#[cfg(not(portable_atomic_no_asm))]
asm!(
"nop {{ mov {prev_sr}, r2 {{ nop", prev_sr = in(reg) prev_sr,
options(nostack),
);
#[cfg(portable_atomic_no_asm)]
llvm_asm!("nop { mov $0, r2 { nop" :: "r"(prev_sr) : "memory" : "volatile");
}
}