Impl missing operators for bytecode

This commit is contained in:
Daniel M 2022-01-31 23:55:44 +01:00
parent 02f258415d
commit 85211b127d
2 changed files with 46 additions and 9 deletions

View File

@ -15,12 +15,19 @@ pub enum OP {
Multiply,
Divide,
Modulo,
BOr,
BAnd,
BXor,
Shl,
Shr,
Eq,
Neq,
Gt,
Ge,
Lt,
Le,
Jump,
@ -153,18 +160,18 @@ impl Compiler {
BinOpType::Mul => self.ops.push(OP::Multiply),
BinOpType::Div => self.ops.push(OP::Divide),
BinOpType::Mod => self.ops.push(OP::Modulo),
BinOpType::BOr => todo!(),
BinOpType::BAnd => todo!(),
BinOpType::BXor => todo!(),
BinOpType::Shl => todo!(),
BinOpType::Shr => todo!(),
BinOpType::BOr => self.ops.push(OP::BOr),
BinOpType::BAnd => self.ops.push(OP::BAnd),
BinOpType::BXor => self.ops.push(OP::BXor),
BinOpType::Shl => self.ops.push(OP::Shl),
BinOpType::Shr => self.ops.push(OP::Shr),
BinOpType::Equ => self.ops.push(OP::Eq),
BinOpType::Neq => self.ops.push(OP::Neq),
BinOpType::Gt => self.ops.push(OP::Gt),
BinOpType::Ge => todo!(),
BinOpType::Ge => self.ops.push(OP::Ge),
BinOpType::Lt => self.ops.push(OP::Lt),
BinOpType::Le => todo!(),
BinOpType::Assign => todo!(),
BinOpType::Le => self.ops.push(OP::Le),
BinOpType::Assign => unreachable!(),
}
}

View File

@ -101,11 +101,41 @@ impl Vm {
self.stack
.push(Value::I64(if vals.0 > vals.1 { 1 } else { 0 }))
}
OP::Ge => {
let vals = self.pop2_i64();
self.stack
.push(Value::I64(if vals.0 >= vals.1 { 1 } else { 0 }))
}
OP::Lt => {
let vals = self.pop2_i64();
self.stack
.push(Value::I64(if vals.0 < vals.1 { 1 } else { 0 }))
}
OP::Le => {
let vals = self.pop2_i64();
self.stack
.push(Value::I64(if vals.0 <= vals.1 { 1 } else { 0 }))
}
OP::BOr => {
let vals = self.pop2_i64();
self.stack.push(Value::I64(vals.0 | vals.1))
}
OP::BAnd => {
let vals = self.pop2_i64();
self.stack.push(Value::I64(vals.0 & vals.1))
}
OP::BXor => {
let vals = self.pop2_i64();
self.stack.push(Value::I64(vals.0 ^ vals.1))
}
OP::Shl => {
let vals = self.pop2_i64();
self.stack.push(Value::I64(vals.0 << vals.1))
}
OP::Shr => {
let vals = self.pop2_i64();
self.stack.push(Value::I64(vals.0 >> vals.1))
}
OP::Value(_) => {
panic!("This is not an instruction, but data. This should never be evaluated")
}