mips32 0.1.0

low-level reg read/write for mips32
Documentation
use core::arch::asm;
use crate::Reg;

macro_rules! DEFINE_GPR {
    ($ident:ident,$str:literal) => {
        #[allow(non_camel_case_types)]
        pub struct $ident;
        impl Reg for $ident {
            #[inline(never)]
            fn read() -> usize {
                let _ret : usize;
                unsafe {
                    asm!(concat!(".set noat\nadd {}, ",$str,",$zero\n.set at\n"),out(reg) _ret,options(nomem,nostack));
                } 
                _ret
            }
            #[inline(never)]
            fn write(val: usize) {
                unsafe {
                    asm!(concat!(".set noat\nadd ",$str,",{}, $zero\n.set at\n"),in(reg) val,options(nomem,nostack));
                }
            }
        }
    };
}



DEFINE_GPR!(v0,"$v0");
DEFINE_GPR!(v1,"$v1");
DEFINE_GPR!(a0,"$a0");
DEFINE_GPR!(a1,"$a1");
DEFINE_GPR!(a2,"$a2");
DEFINE_GPR!(a3,"$a3");
DEFINE_GPR!(t0,"$t0");
DEFINE_GPR!(t1,"$t1");
DEFINE_GPR!(t2,"$t2");
DEFINE_GPR!(t3,"$t3");
DEFINE_GPR!(t4,"$t4");
DEFINE_GPR!(t5,"$t5");
DEFINE_GPR!(t6,"$t6");
DEFINE_GPR!(t7,"$t7");
DEFINE_GPR!(s0,"$s0");
DEFINE_GPR!(s1,"$s1");
DEFINE_GPR!(s2,"$s2");
DEFINE_GPR!(s3,"$s3");
DEFINE_GPR!(s4,"$s4");
DEFINE_GPR!(s5,"$s5");
DEFINE_GPR!(s6,"$s6");
DEFINE_GPR!(s7,"$s7");
DEFINE_GPR!(t8,"$t8");
DEFINE_GPR!(t9,"$t9");
DEFINE_GPR!(k0,"$k0");
DEFINE_GPR!(k1,"$k1");
DEFINE_GPR!(gp,"$gp");
DEFINE_GPR!(sp,"$sp");
DEFINE_GPR!(fp,"$fp");
DEFINE_GPR!(ra,"$ra");