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:
Fiora 2014-08-15 10:53:56 -07:00
parent d5d5580424
commit 1669b361a2
2 changed files with 10 additions and 3 deletions

View File

@ -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();

View File

@ -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)