JitIL: fix carry computation for srawi.
The carry computation needs to be based on the input value, not the output of the shift.
This commit is contained in:
parent
f034983b62
commit
1a4156a4a0
|
@ -503,16 +503,18 @@ void JitILBase::srawix(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(bJITIntegerOff)
|
JITDISABLE(bJITIntegerOff)
|
||||||
IREmitter::InstLoc val = ibuild.EmitLoadGReg(inst.RS), test;
|
// Shift right by two
|
||||||
val = ibuild.EmitSarl(val, ibuild.EmitIntConst(inst.SH));
|
IREmitter::InstLoc input = ibuild.EmitLoadGReg(inst.RS);
|
||||||
ibuild.EmitStoreGReg(val, inst.RA);
|
IREmitter::InstLoc output = ibuild.EmitSarl(input, ibuild.EmitIntConst(inst.SH));
|
||||||
|
ibuild.EmitStoreGReg(output, inst.RA);
|
||||||
|
// Check whether the input is negative and any bits got shifted out.
|
||||||
unsigned int mask = -1u << inst.SH;
|
unsigned int mask = -1u << inst.SH;
|
||||||
test = ibuild.EmitOr(val, ibuild.EmitIntConst(mask & 0x7FFFFFFF));
|
IREmitter::InstLoc test = ibuild.EmitOr(input, ibuild.EmitIntConst(mask & 0x7FFFFFFF));
|
||||||
test = ibuild.EmitICmpUgt(test, ibuild.EmitIntConst(mask));
|
test = ibuild.EmitICmpUgt(test, ibuild.EmitIntConst(mask));
|
||||||
|
|
||||||
ibuild.EmitStoreCarry(test);
|
ibuild.EmitStoreCarry(test);
|
||||||
if (inst.Rc)
|
if (inst.Rc)
|
||||||
ComputeRC(ibuild, val);
|
ComputeRC(ibuild, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
// count leading zeroes
|
// count leading zeroes
|
||||||
|
|
Loading…
Reference in New Issue