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 core::sync::atomic;
pub(crate) type State = u32;
#[inline(always)]
pub(crate) fn disable() -> State {
let ps: State;
unsafe {
asm!(
"rsil {ps}, 15", ps = out(reg) ps,
options(nostack),
);
}
ps
}
#[inline(always)]
pub(crate) unsafe fn restore(prev_ps: State) {
unsafe {
asm!(
"wsr.ps {prev_ps}", "rsync", prev_ps = in(reg) prev_ps,
options(nostack),
);
}
}