Interpreter_Integer: Clean up casting in mulhwx() and mulhwux()
These can be expressed in a slightly cleaner manner without so many casts. While we're at it, also get rid of unnecessary indexing (we already have the result nearby).
This commit is contained in:
parent
b547f72878
commit
b29b56c61a
|
@ -546,27 +546,26 @@ void Interpreter::divwux(UGeckoInstruction inst)
|
||||||
|
|
||||||
void Interpreter::mulhwx(UGeckoInstruction inst)
|
void Interpreter::mulhwx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
u32 a = rGPR[inst.RA];
|
const s64 a = static_cast<s32>(rGPR[inst.RA]);
|
||||||
u32 b = rGPR[inst.RB];
|
const s64 b = static_cast<s32>(rGPR[inst.RB]);
|
||||||
|
const u32 d = static_cast<u32>((a * b) >> 32);
|
||||||
// This can be done better. Not in plain C/C++ though.
|
|
||||||
u32 d = (u32)((u64)(((s64)(s32)a * (s64)(s32)b)) >> 32);
|
|
||||||
|
|
||||||
rGPR[inst.RD] = d;
|
rGPR[inst.RD] = d;
|
||||||
|
|
||||||
if (inst.Rc)
|
if (inst.Rc)
|
||||||
Helper_UpdateCR0(rGPR[inst.RD]);
|
Helper_UpdateCR0(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::mulhwux(UGeckoInstruction inst)
|
void Interpreter::mulhwux(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
u32 a = rGPR[inst.RA];
|
const u64 a = rGPR[inst.RA];
|
||||||
u32 b = rGPR[inst.RB];
|
const u64 b = rGPR[inst.RB];
|
||||||
u32 d = (u32)(((u64)a * (u64)b) >> 32);
|
const u32 d = static_cast<u32>((a * b) >> 32);
|
||||||
|
|
||||||
rGPR[inst.RD] = d;
|
rGPR[inst.RD] = d;
|
||||||
|
|
||||||
if (inst.Rc)
|
if (inst.Rc)
|
||||||
Helper_UpdateCR0(rGPR[inst.RD]);
|
Helper_UpdateCR0(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::mullwx(UGeckoInstruction inst)
|
void Interpreter::mullwx(UGeckoInstruction inst)
|
||||||
|
|
Loading…
Reference in New Issue