MacroInterpreter: Avoid left shifting negative values.
The branch target is signed, so multiply by 4 instead of left shifting by 2
This commit is contained in:
parent
e119e17d18
commit
8191273a3d
|
@ -102,11 +102,11 @@ bool MacroInterpreter::Step(const std::vector<u32>& code, bool is_delay_slot) {
|
||||||
if (taken) {
|
if (taken) {
|
||||||
// Ignore the delay slot if the branch has the annul bit.
|
// Ignore the delay slot if the branch has the annul bit.
|
||||||
if (opcode.branch_annul) {
|
if (opcode.branch_annul) {
|
||||||
pc = base_address + (opcode.immediate << 2);
|
pc = base_address + opcode.GetBranchTarget();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
delayed_pc = base_address + (opcode.immediate << 2);
|
delayed_pc = base_address + opcode.GetBranchTarget();
|
||||||
// Execute one more instruction due to the delay slot.
|
// Execute one more instruction due to the delay slot.
|
||||||
return Step(code, true);
|
return Step(code, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,10 @@ private:
|
||||||
u32 GetBitfieldMask() const {
|
u32 GetBitfieldMask() const {
|
||||||
return (1 << bf_size) - 1;
|
return (1 << bf_size) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 GetBranchTarget() const {
|
||||||
|
return static_cast<s32>(immediate * sizeof(u32));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
union MethodAddress {
|
union MethodAddress {
|
||||||
|
|
Reference in New Issue