Impl missing operators for bytecode
This commit is contained in:
parent
02f258415d
commit
85211b127d
@ -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!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
30
src/vm.rs
30
src/vm.rs
@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user