|
@@ -15,8 +15,10 @@ pub fn calculate_static_values(mut opcodes: Vec<OpCode>) -> (Vec<OpCode>, bool)
|
|
}
|
|
}
|
|
OpCode::JMP(_) | OpCode::HLT(_) | OpCode::LABEL(_) => {}
|
|
OpCode::JMP(_) | OpCode::HLT(_) | OpCode::LABEL(_) => {}
|
|
OpCode::MOV(dst, src) => {
|
|
OpCode::MOV(dst, src) => {
|
|
|
|
+ register.remove(dst);
|
|
if let Some(value) = register.remove(src) {
|
|
if let Some(value) = register.remove(src) {
|
|
- register.insert(*dst, value.clone());
|
|
|
|
|
|
+ *opcode = OpCode::LOAD(*dst, value);
|
|
|
|
+ has_changed = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
OpCode::LOAD_EXTERNAL(dst, _)
|
|
OpCode::LOAD_EXTERNAL(dst, _)
|
|
@@ -45,10 +47,11 @@ pub fn calculate_static_values(mut opcodes: Vec<OpCode>) -> (Vec<OpCode>, bool)
|
|
OpCode::JNE(reg, addr) => {
|
|
OpCode::JNE(reg, addr) => {
|
|
if let Some(Value::Bool(false)) = register.get(reg) {
|
|
if let Some(Value::Bool(false)) = register.get(reg) {
|
|
*opcode = OpCode::JMP(*addr);
|
|
*opcode = OpCode::JMP(*addr);
|
|
|
|
+ has_changed = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
OpCode::EQ(dst, reg1, reg2) => {
|
|
OpCode::EQ(dst, reg1, reg2) => {
|
|
- let value1 = if let Some(value) = register.get(reg1) {
|
|
|
|
|
|
+ let value1 = if let Some(value) = register.remove(reg1) {
|
|
value.clone()
|
|
value.clone()
|
|
} else {
|
|
} else {
|
|
register.remove(dst);
|
|
register.remove(dst);
|
|
@@ -61,8 +64,8 @@ pub fn calculate_static_values(mut opcodes: Vec<OpCode>) -> (Vec<OpCode>, bool)
|
|
return;
|
|
return;
|
|
};
|
|
};
|
|
let result = value1 == value2;
|
|
let result = value1 == value2;
|
|
- register.insert(*dst, result.into());
|
|
|
|
*opcode = OpCode::LOAD(*dst, result.into());
|
|
*opcode = OpCode::LOAD(*dst, result.into());
|
|
|
|
+ has_changed = true;
|
|
}
|
|
}
|
|
OpCode::MUL(dst, reg1, reg2)
|
|
OpCode::MUL(dst, reg1, reg2)
|
|
| OpCode::SUB(dst, reg1, reg2)
|
|
| OpCode::SUB(dst, reg1, reg2)
|
|
@@ -82,6 +85,8 @@ pub fn calculate_static_values(mut opcodes: Vec<OpCode>) -> (Vec<OpCode>, bool)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+ register.remove(dst);
|
|
|
|
+
|
|
if let Some(calculated_value) = match opcode {
|
|
if let Some(calculated_value) = match opcode {
|
|
OpCode::ADD(_, _, _) => number1.checked_add(number2).map(Value::Number),
|
|
OpCode::ADD(_, _, _) => number1.checked_add(number2).map(Value::Number),
|
|
OpCode::MUL(_, _, _) => number1.checked_mul(number2).map(Value::Number),
|
|
OpCode::MUL(_, _, _) => number1.checked_mul(number2).map(Value::Number),
|
|
@@ -89,11 +94,8 @@ pub fn calculate_static_values(mut opcodes: Vec<OpCode>) -> (Vec<OpCode>, bool)
|
|
OpCode::DIV(_, _, _) => number1.checked_div(number2).map(Value::Number),
|
|
OpCode::DIV(_, _, _) => number1.checked_div(number2).map(Value::Number),
|
|
_ => None,
|
|
_ => None,
|
|
} {
|
|
} {
|
|
- register.insert(*dst, calculated_value.clone());
|
|
|
|
*opcode = OpCode::LOAD(*dst, calculated_value);
|
|
*opcode = OpCode::LOAD(*dst, calculated_value);
|
|
has_changed = true;
|
|
has_changed = true;
|
|
- } else {
|
|
|
|
- register.remove(dst);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
};
|