JIT: don't rely on undefined behavior for constant overflow checking
I have no idea what the compiler does with these, and this code probably isn't triggered in most games, but it's probably better not to taunt the undefined behavior demon.
This commit is contained in:
parent
d5d5580424
commit
1669b361a2
|
@ -94,6 +94,7 @@ public:
|
|||
void Cleanup();
|
||||
|
||||
void GenerateConstantOverflow(bool overflow);
|
||||
void GenerateConstantOverflow(s64 val);
|
||||
void GenerateOverflow();
|
||||
void FinalizeCarryOverflow(bool oe, bool inv = false);
|
||||
void GetCarryEAXAndClear();
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under GPLv2
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
#include "Core/PowerPC/Jit64/Jit.h"
|
||||
|
@ -10,6 +11,11 @@
|
|||
|
||||
using namespace Gen;
|
||||
|
||||
void Jit64::GenerateConstantOverflow(s64 val)
|
||||
{
|
||||
GenerateConstantOverflow(val > std::numeric_limits<s32>::max() || val < std::numeric_limits<s32>::min());
|
||||
}
|
||||
|
||||
void Jit64::GenerateConstantOverflow(bool overflow)
|
||||
{
|
||||
if (overflow)
|
||||
|
@ -925,7 +931,7 @@ void Jit64::subfx(UGeckoInstruction inst)
|
|||
}
|
||||
if (inst.OE)
|
||||
{
|
||||
GenerateConstantOverflow((s64)(i - j) != (s64)i - (s64)j);
|
||||
GenerateConstantOverflow((s64)i - (s64)j);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1014,7 +1020,7 @@ void Jit64::mullwx(UGeckoInstruction inst)
|
|||
gpr.SetImmediate32(d, i * j);
|
||||
if (inst.OE)
|
||||
{
|
||||
GenerateConstantOverflow((s64)(i*j) != (s64)i * (s64)j);
|
||||
GenerateConstantOverflow((s64)i * (s64)j);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1330,7 +1336,7 @@ void Jit64::addx(UGeckoInstruction inst)
|
|||
}
|
||||
if (inst.OE)
|
||||
{
|
||||
GenerateConstantOverflow((s64)(i + j) != (s64)i + (s64)j);
|
||||
GenerateConstantOverflow((s64)i + (s64)j);
|
||||
}
|
||||
}
|
||||
else if (gpr.R(a).IsSimpleReg() && gpr.R(b).IsSimpleReg() && !inst.Rc && !inst.OE)
|
||||
|
|
Loading…
Reference in New Issue