Add unary+, unary-

This commit is contained in:
Andrew Morris
2022-05-11 08:41:00 +10:00
parent 6fb8ca3846
commit ba48082b39
4 changed files with 21 additions and 0 deletions

View File

@@ -242,6 +242,8 @@ impl<'a> Assembler for AssemblerData<'a> {
("subcall", Instruction::SubCall),
("jmp", Instruction::Jmp),
("jmpif", Instruction::JmpIf),
("unary+", Instruction::UnaryPlus),
("unary-", Instruction::UnaryMinus),
]);
for (word, instruction) in instruction_word_map {
@@ -811,6 +813,8 @@ enum Instruction {
SubCall = 0x26,
Jmp = 0x27,
JmpIf = 0x28,
UnaryPlus = 0x29,
UnaryMinus = 0x2a,
}
enum InstructionArg {
@@ -865,6 +869,8 @@ fn get_instruction_layout(instruction: Instruction) -> Vec<InstructionArg> {
SubCall => Vec::from([Value, Value, Value, Register]),
Jmp => Vec::from([Label]),
JmpIf => Vec::from([Value, Label]),
UnaryPlus => Vec::from([Value, Register]),
UnaryMinus => Vec::from([Value, Register]),
};
}

View File

@@ -44,6 +44,8 @@ pub enum Instruction {
SubCall = 0x26,
Jmp = 0x27,
JmpIf = 0x28,
UnaryPlus = 0x29,
UnaryMinus = 0x2a,
}
impl Instruction {
@@ -92,6 +94,8 @@ impl Instruction {
0x26 => SubCall,
0x27 => Jmp,
0x28 => JmpIf,
0x29 => UnaryPlus,
0x2a => UnaryMinus,
_ => std::panic!("Unrecognized instruction: {}", byte),
};

View File

@@ -15,10 +15,18 @@ pub fn op_plus(left: Val, right: Val) -> Val {
return Val::Number(left_prim.to_number() + right_prim.to_number());
}
pub fn op_unary_plus(input: Val) -> Val {
return Val::Number(input.to_number());
}
pub fn op_minus(left: Val, right: Val) -> Val {
return Val::Number(left.to_number() - right.to_number());
}
pub fn op_unary_minus(input: Val) -> Val {
return Val::Number(-input.to_number());
}
pub fn op_mul(left: Val, right: Val) -> Val {
return Val::Number(left.to_number() * right.to_number());
}

View File

@@ -259,6 +259,9 @@ impl VirtualMachine {
frame.decoder.pos = dst;
}
}
UnaryPlus => frame.apply_unary_op(operations::op_unary_plus),
UnaryMinus => frame.apply_unary_op(operations::op_unary_minus),
};
}