diff options
Diffstat (limited to 'bytecode/src/main.rs')
| -rw-r--r-- | bytecode/src/main.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/bytecode/src/main.rs b/bytecode/src/main.rs index bbc0ddd..4cba4ef 100644 --- a/bytecode/src/main.rs +++ b/bytecode/src/main.rs @@ -96,6 +96,34 @@ impl State { }; self.heap.locals[usize::from(op.out)] = Value::from_int(res); } + Op::Less(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("less needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("less needs an int")); + }; + let res = if v1 < v2 { 1 } else { 0 }; + self.heap.locals[usize::from(op.out)] = Value::from_int(res); + } + Op::Eq(op) => { + let Some(v1) = self.read_arg(op.val1).to_int() else { + return Err(Box::from("eq needs an int")); + }; + let Some(v2) = self.read_arg(op.val2).to_int() else { + return Err(Box::from("eq needs an int")); + }; + let res = if v1 == v2 { 1 } else { 0 }; + self.heap.locals[usize::from(op.out)] = Value::from_int(res); + } + Op::If(op) => { + let Some(t) = self.read_arg(op.test).to_int() else { + return Err(Box::from("if needs an int")); + }; + if t != 0 { + self.i = op.target; + } + } } Ok(()) } |
