From f95c24ee954cf688fc1414493ffa24bc509691b8 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Sun, 26 Jan 2020 11:18:53 -0500 Subject: [PATCH] Add/rename/implement instructions based on new spec * Add Mod instruction * Rename Neg -> INeg * Rename Copy -> MemCopy * Add RegCopy Signed-off-by: Alek Ratzloff --- src/vm/inst.rs | 6 ++++-- src/vm/vm.rs | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vm/inst.rs b/src/vm/inst.rs index 27b29a9..8604c4c 100644 --- a/src/vm/inst.rs +++ b/src/vm/inst.rs @@ -6,7 +6,8 @@ pub enum Inst { Add(Reg, Reg), Mul(Reg, Reg), Div(Reg, Reg), - Neg(Reg), + Mod(Reg, Reg), + INeg(Reg), And(Reg, Reg), Or(Reg, Reg), Xor(Reg, Reg), @@ -21,7 +22,8 @@ pub enum Inst { Load(Reg, Reg), Store(Reg, Reg), StoreImm(Reg, u32), - Copy(Reg, Reg), + MemCopy(Reg, Reg), + RegCopy(Reg, Reg), Nop, Halt, diff --git a/src/vm/vm.rs b/src/vm/vm.rs index f93737d..d83b49a 100644 --- a/src/vm/vm.rs +++ b/src/vm/vm.rs @@ -164,7 +164,8 @@ impl Vm { self.set_reg(r1, value); } Inst::Div(r1, r2) => map!(r1 = r1 / r2), - Inst::Neg(r1) => { + Inst::Mod(r1, r2) => map!(r1 = r1 % r2), + Inst::INeg(r1) => { let value = self.get_reg(r1); let ivalue = -i64::from_ne_bytes(value.to_ne_bytes()); let uvalue = u64::from_ne_bytes(ivalue.to_ne_bytes()); @@ -212,7 +213,11 @@ impl Vm { Inst::StoreImm(r1, value) => { self.set_reg(r1, value as u64); } - Inst::Copy(r1, r2) => { + Inst::RegCopy(r1, r2) => { + let w1 = self.get_reg(r2); + self.set_reg(r1, w1); + } + Inst::MemCopy(r1, r2) => { let w1 = self.load(r2); self.store(r1, w1); }