Skip to content

Commit a0e2046

Browse files
committed
Add options to asm
- Use `nomem` when neither memory access nor reordering prevention is needed. - Use `nostack` when not pushing data to the stack. - Use `preserves_flags` when not modifying the status register. refs: https://doc.rust-lang.org/nightly/unstable-book/language-features/asm-experimental-arch.html#flags-covered-by-preserves_flags - Add comments explaining why specific options are not used.
1 parent 4ee7a8b commit a0e2046

File tree

5 files changed

+12
-7
lines changed

5 files changed

+12
-7
lines changed

src/asm.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ use crate::asm;
66
#[inline(always)]
77
pub fn nop() {
88
unsafe {
9-
asm!("nop");
9+
asm!("nop", options(nostack, preserves_flags));
1010
}
1111
}
1212

1313
/// A compiler fence, prevents instruction reordering.
1414
#[inline(always)]
1515
pub fn barrier() {
1616
unsafe {
17-
asm!("");
17+
// Do not use `nomem` and `readonly` because prevent preceding and subsequent memory accesses from being reordered.
18+
asm!("", options(nostack, preserves_flags));
1819
}
1920
}

src/interrupt.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ pub fn disable() {
1010
match () {
1111
#[cfg(target_arch = "msp430")]
1212
() => unsafe {
13-
asm!("dint {{ nop");
13+
// Do not use `nomem` and `readonly` because prevent subsequent memory accesses from being reordered before interrupts are disabled.
14+
// Do not use `preserves_flags` because dint modifies the GIE (global interrupt enable) bit of the status register.
15+
asm!("dint {{ nop", options(nostack));
1416
},
1517
#[cfg(not(target_arch = "msp430"))]
1618
() => {}
@@ -29,7 +31,9 @@ pub unsafe fn enable() {
2931
match () {
3032
#[cfg(target_arch = "msp430")]
3133
() => {
32-
asm!("nop {{ eint {{ nop");
34+
// Do not use `nomem` and `readonly` because prevent preceding memory accesses from being reordered after interrupts are enabled.
35+
// Do not use `preserves_flags` because eint modifies the GIE (global interrupt enable) bit of the status register.
36+
asm!("nop {{ eint {{ nop", options(nostack));
3337
}
3438
#[cfg(not(target_arch = "msp430"))]
3539
() => {}

src/register/pc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::asm;
77
pub fn read() -> u16 {
88
let r;
99
unsafe {
10-
asm!("mov R0, {0}", out(reg) r);
10+
asm!("mov R0, {0}", out(reg) r, options(nomem, nostack, preserves_flags));
1111
}
1212
r
1313
}

src/register/sp.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::asm;
77
pub fn read() -> u16 {
88
let r;
99
unsafe {
10-
asm!("mov R1, {0}", out(reg) r);
10+
asm!("mov R1, {0}", out(reg) r, options(nomem, nostack, preserves_flags));
1111
}
1212
r
1313
}

src/register/sr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl Sr {
7979
pub fn read() -> Sr {
8080
let r: u16;
8181
unsafe {
82-
asm!("mov R2, {0}", out(reg) r);
82+
asm!("mov R2, {0}", out(reg) r, options(nomem, nostack, preserves_flags));
8383
}
8484
Sr { bits: r }
8585
}

0 commit comments

Comments
 (0)