1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#![feature(llvm_asm)] #![no_std] use register::cpu::RegisterReadWrite; pub struct Reg; impl RegisterReadWrite<u64, ()> for Reg { #[inline] fn get(&self) -> u64 { let reg; unsafe { llvm_asm!("mv $0, sp" : "=r"(reg) ::: "volatile"); } reg } #[inline] fn set(&self, value: u64) { unsafe { llvm_asm!(concat!("mv sp, $0") :: "r"(value) :: "volatile") } } } impl RegisterReadWrite<u32, ()> for Reg { #[inline] fn get(&self) -> u32 { let reg; unsafe { llvm_asm!("mv $0, sp" : "=r"(reg) ::: "volatile"); } reg } #[inline] fn set(&self, value: u32) { unsafe { llvm_asm!(concat!("mv sp, $0") :: "r"(value) :: "volatile") } } } pub static SP: Reg = Reg {};