pub struct Vm<Isa = Instr<ReservedOp>>where
Isa: InstructionSet,{
pub registers: Box<CoreRegs>,
/* private fields */
}Expand description
Alu virtual machine providing single-core execution environment
Fields§
§registers: Box<CoreRegs>A set of registers
Implementations§
source§impl<Isa> Vm<Isa>where
Isa: InstructionSet,
impl<Isa> Vm<Isa>where Isa: InstructionSet,
Runtime for program execution.
sourcepub fn new() -> Self
pub fn new() -> Self
Constructs new virtual machine instance.
Examples found in repository?
examples/asm.rs (line 106)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
fn main() {
let code = aluasm! {
clr r1024[5] ;
put 5,a16[8] ;
putif 0xaf67937b5498dc,r256[1] ;
putif 13,a8[1] ;
swp a8[1],a8[2] ;
swp f256[8],f256[7] ;
dup a256[1],a256[7] ;
mov a16[1],a16[2] ;
mov r256[8],r256[7] ;
cpy a256[1],a256[7] ;
cnv f128[4],a128[3] ;
spy a1024[15],r1024[24] ;
gt.u a8[5],a64[9] ;
lt.s a8[5],a64[9] ;
gt.e f64[5],f64[9] ;
lt.r f64[5],f64[9] ;
gt r160[5],r256[9] ;
lt r160[5],r256[9] ;
eq.e a8[5],a8[9] ;
eq.n r160[5],r160[9] ;
eq.e f64[19],f64[29] ;
ifn a32[32] ;
ifz r2048[17] ;
inv st0 ;
st.s a8[1] ;
put 13,a32[12] ;
put 66,a32[13] ;
add.uc a32[12],a32[13] ;
add.sw a32[12],a32[13] ;
sub.sc a32[13],a32[12] ;
mul.uw a32[12],a32[13] ;
div.cu a32[12],a32[13] ;
put 2.13,f32[12] ;
put 5.18,f32[13] ;
add.z f32[12],f32[13] ;
sub.n f32[13],f32[12] ;
mul.c f32[12],f32[13] ;
div.f f32[12],f32[13] ;
rem a64[8],a8[2] ;
inc a16[3] ;
add 5,a16[4] ;
dec a16[8] ;
sub 82,a16[4] ;
neg a64[16] ;
abs f128[11] ;
and a32[5],a32[6],a32[5] ;
xor r128[5],r128[6],r128[5] ;
shr.u a256[12],a16[2] ;
shr.s a256[12],a16[2] ;
shl r256[24],a16[22] ;
shr r256[24],a16[22] ;
scr r256[24],a16[22] ;
scl r256[24],a16[22] ;
rev a512[28] ;
ripemd s16[9],r160[7] ;
sha2 s16[19],r256[2] ;
secpgen r256[1],r512[1] ;
dup r512[1],r512[22] ;
spy a512[1],r512[22] ;
secpmul r256[1],r512[1],r512[2] ;
secpadd r512[22],r512[1] ;
secpneg r512[1],r512[3] ;
ifz a16[8] ;
jif 190 ;
jmp 6 ;
call 56 @ alu1wnhusevxmdphv3dh8ada44k0xw66ahq9nzhkv39z07hmudhp380sq0dtml ;
ret ;
};
println!("Instructions:\n{:#?}\n", code);
let lib = Lib::assemble(&code).unwrap();
let code = lib.disassemble::<Instr>().unwrap();
println!("Assembly:");
for instr in code {
println!("\t\t{}", instr);
}
let lib_repr = lib.to_string();
eprint!("\nExecuting the program {} ... ", lib.id());
let program = Prog::<Instr>::new(lib);
let mut runtime = Vm::<Instr>::new();
match runtime.run(&program, &()) {
true => eprintln!("success"),
false => eprintln!("failure"),
}
println!("\nVM microprocessor core state:\n{:#?}", runtime.registers);
println!("\n{}\n", lib_repr);
}sourcepub fn run(
&mut self,
program: &impl Program<Isa = Isa>,
context: &Isa::Context<'_>
) -> bool
pub fn run( &mut self, program: &impl Program<Isa = Isa>, context: &Isa::Context<'_> ) -> bool
Executes the program starting from the provided entry point (set with
[Program::set_entrypoint] and [Program::with], or initialized to 0 offset of the
first used library if [Program::new] was used).
Returns
Value of the st0 register at the end of the program execution.
Examples found in repository?
examples/asm.rs (line 107)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
fn main() {
let code = aluasm! {
clr r1024[5] ;
put 5,a16[8] ;
putif 0xaf67937b5498dc,r256[1] ;
putif 13,a8[1] ;
swp a8[1],a8[2] ;
swp f256[8],f256[7] ;
dup a256[1],a256[7] ;
mov a16[1],a16[2] ;
mov r256[8],r256[7] ;
cpy a256[1],a256[7] ;
cnv f128[4],a128[3] ;
spy a1024[15],r1024[24] ;
gt.u a8[5],a64[9] ;
lt.s a8[5],a64[9] ;
gt.e f64[5],f64[9] ;
lt.r f64[5],f64[9] ;
gt r160[5],r256[9] ;
lt r160[5],r256[9] ;
eq.e a8[5],a8[9] ;
eq.n r160[5],r160[9] ;
eq.e f64[19],f64[29] ;
ifn a32[32] ;
ifz r2048[17] ;
inv st0 ;
st.s a8[1] ;
put 13,a32[12] ;
put 66,a32[13] ;
add.uc a32[12],a32[13] ;
add.sw a32[12],a32[13] ;
sub.sc a32[13],a32[12] ;
mul.uw a32[12],a32[13] ;
div.cu a32[12],a32[13] ;
put 2.13,f32[12] ;
put 5.18,f32[13] ;
add.z f32[12],f32[13] ;
sub.n f32[13],f32[12] ;
mul.c f32[12],f32[13] ;
div.f f32[12],f32[13] ;
rem a64[8],a8[2] ;
inc a16[3] ;
add 5,a16[4] ;
dec a16[8] ;
sub 82,a16[4] ;
neg a64[16] ;
abs f128[11] ;
and a32[5],a32[6],a32[5] ;
xor r128[5],r128[6],r128[5] ;
shr.u a256[12],a16[2] ;
shr.s a256[12],a16[2] ;
shl r256[24],a16[22] ;
shr r256[24],a16[22] ;
scr r256[24],a16[22] ;
scl r256[24],a16[22] ;
rev a512[28] ;
ripemd s16[9],r160[7] ;
sha2 s16[19],r256[2] ;
secpgen r256[1],r512[1] ;
dup r512[1],r512[22] ;
spy a512[1],r512[22] ;
secpmul r256[1],r512[1],r512[2] ;
secpadd r512[22],r512[1] ;
secpneg r512[1],r512[3] ;
ifz a16[8] ;
jif 190 ;
jmp 6 ;
call 56 @ alu1wnhusevxmdphv3dh8ada44k0xw66ahq9nzhkv39z07hmudhp380sq0dtml ;
ret ;
};
println!("Instructions:\n{:#?}\n", code);
let lib = Lib::assemble(&code).unwrap();
let code = lib.disassemble::<Instr>().unwrap();
println!("Assembly:");
for instr in code {
println!("\t\t{}", instr);
}
let lib_repr = lib.to_string();
eprint!("\nExecuting the program {} ... ", lib.id());
let program = Prog::<Instr>::new(lib);
let mut runtime = Vm::<Instr>::new();
match runtime.run(&program, &()) {
true => eprintln!("success"),
false => eprintln!("failure"),
}
println!("\nVM microprocessor core state:\n{:#?}", runtime.registers);
println!("\n{}\n", lib_repr);
}