Impl missing operators for bytecode
This commit is contained in:
parent
02f258415d
commit
85211b127d
@ -14,13 +14,20 @@ pub enum OP {
|
||||
Subtract,
|
||||
Multiply,
|
||||
Divide,
|
||||
Modulo,
|
||||
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!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
30
src/vm.rs
30
src/vm.rs
@ -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")
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user