diff options
Diffstat (limited to 'bytecode/src/main.rs')
| -rw-r--r-- | bytecode/src/main.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/bytecode/src/main.rs b/bytecode/src/main.rs index a4970e0..bbc0ddd 100644 --- a/bytecode/src/main.rs +++ b/bytecode/src/main.rs @@ -57,6 +57,45 @@ impl State { }; std::process::exit(i as i32); } + Op::Add(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("add needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("add needs an int")); + }; + self.heap.locals[usize::from(op.out)] = Value::from_int(v1.wrapping_add(v2)); + } + Op::Sub(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("sub needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("sub needs an int")); + }; + self.heap.locals[usize::from(op.out)] = Value::from_int(v1.wrapping_sub(v2)); + } + Op::Mul(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("mul needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("mul needs an int")); + }; + self.heap.locals[usize::from(op.out)] = Value::from_int(v1.wrapping_mul(v2)); + } + Op::Div(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("div needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("div needs an int")); + }; + let Some(res) = v1.checked_div(v2) else { + return Err(Box::from("division by zero")); + }; + self.heap.locals[usize::from(op.out)] = Value::from_int(res); + } } Ok(()) } |
