summaryrefslogtreecommitdiffstats
path: root/bytecode/src/main.rs
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-27 08:28:40 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-27 08:28:40 -0700
commit9f5889c1263d63b953b3a324da07321deef5ca58 (patch)
treeeb4a9be038660ced671da9fbb4617812f7cd2125 /bytecode/src/main.rs
parent1d35d3c0780b1f5392517fe3c1e30950de79efb4 (diff)
downloadsml-9f5889c1263d63b953b3a324da07321deef5ca58.tar.zst
Add integer arithmetic.
Diffstat (limited to 'bytecode/src/main.rs')
-rw-r--r--bytecode/src/main.rs39
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(())
}