use super::*;
impl ExecutionContext {
pub(crate) fn execute_arithmetic_binary(&mut self, opcode: u8) -> Result<bool, RuntimeError> {
match opcode {
0x9E => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.add_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0x9F => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.sub_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA0 => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.mul_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA1 => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.div_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA2 => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.mod_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA3 => {
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.pow_stack_items(a, b)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA5 => {
let modulus = self.pop_stack()?;
let b = self.pop_stack()?;
let a = self.pop_stack()?;
let result = self.modmul_stack_items(a, b, modulus)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
0xA6 => {
let modulus = self.pop_stack()?;
let exponent = self.pop_stack()?;
let base = self.pop_stack()?;
let result = self.modpow_stack_items(base, exponent, modulus)?;
self.push_stack(result)?;
self.instruction_pointer += 1;
Ok(true)
}
_ => Ok(false),
}
}
}