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

@ -14,13 +14,20 @@ pub enum OP {
Subtract, Subtract,
Multiply, Multiply,
Divide, Divide,
Modulo, Modulo,
BOr,
BAnd,
BXor,
Shl,
Shr,
Eq, Eq,
Neq, Neq,
Gt, Gt,
Ge,
Lt, Lt,
Le,
Jump, Jump,
@ -153,18 +160,18 @@ impl Compiler {
BinOpType::Mul => self.ops.push(OP::Multiply), BinOpType::Mul => self.ops.push(OP::Multiply),
BinOpType::Div => self.ops.push(OP::Divide), BinOpType::Div => self.ops.push(OP::Divide),
BinOpType::Mod => self.ops.push(OP::Modulo), BinOpType::Mod => self.ops.push(OP::Modulo),
BinOpType::BOr => todo!(), BinOpType::BOr => self.ops.push(OP::BOr),
BinOpType::BAnd => todo!(), BinOpType::BAnd => self.ops.push(OP::BAnd),
BinOpType::BXor => todo!(), BinOpType::BXor => self.ops.push(OP::BXor),
BinOpType::Shl => todo!(), BinOpType::Shl => self.ops.push(OP::Shl),
BinOpType::Shr => todo!(), BinOpType::Shr => self.ops.push(OP::Shr),
BinOpType::Equ => self.ops.push(OP::Eq), BinOpType::Equ => self.ops.push(OP::Eq),
BinOpType::Neq => self.ops.push(OP::Neq), BinOpType::Neq => self.ops.push(OP::Neq),
BinOpType::Gt => self.ops.push(OP::Gt), 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::Lt => self.ops.push(OP::Lt),
BinOpType::Le => todo!(), BinOpType::Le => self.ops.push(OP::Le),
BinOpType::Assign => todo!(), BinOpType::Assign => unreachable!(),
} }
} }

View File

@ -101,11 +101,41 @@ impl Vm {
self.stack self.stack
.push(Value::I64(if vals.0 > vals.1 { 1 } else { 0 })) .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 => { OP::Lt => {
let vals = self.pop2_i64(); let vals = self.pop2_i64();
self.stack self.stack
.push(Value::I64(if vals.0 < vals.1 { 1 } else { 0 })) .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(_) => { OP::Value(_) => {
panic!("This is not an instruction, but data. This should never be evaluated") panic!("This is not an instruction, but data. This should never be evaluated")
} }