diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index 197e19d588..8c5265ae04 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -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(); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 5676ca9af1..a6535b4b67 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include #include #include "Core/PowerPC/Jit64/Jit.h" @@ -10,6 +11,11 @@ using namespace Gen; +void Jit64::GenerateConstantOverflow(s64 val) +{ + GenerateConstantOverflow(val > std::numeric_limits::max() || val < std::numeric_limits::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)