diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index b8ab60ab6c..bc6fcbb233 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -1296,20 +1296,6 @@ public: return llvm_max{std::forward(a), std::forward(b)}; } - // Get signed addition overflow into the sign bit (s = a + b) - template - static inline auto scarry(T a, T b, T s) - { - return (b ^ s) & ~(a ^ b); - } - - // Bitwise select (c ? a : b) - template - static inline auto merge(T c, T a, T b) - { - return (a & c) | (b & ~c); - } - // Rotate left template static inline auto rol(T a, T b) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 79da979a63..353de8b475 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -950,8 +950,8 @@ void PPUTranslator::VMHADDSHS(ppu_opcode_t op) // m.value = m_ir->CreateOr(m.value, m_ir->CreateLShr(m_ir->CreateMul(a.value, b.value), 15)); // const auto s = eval(c + m); // const auto z = eval((c >> 15) ^ 0x7fff); - // const auto x = eval(scarry(c, m, s) >> 15); - // set_vr(op.vd, eval(merge(x, z, s))); + // const auto x = eval(((m ^ s) & ~(c ^ m)) >> 15); + // set_vr(op.vd, eval((z & x) | (s & ~x))); //SetSat(IsNotZero(saturated.second)); } @@ -1078,8 +1078,9 @@ void PPUTranslator::VMSUMSHS(ppu_opcode_t op) const auto m = eval(ml + mh); const auto s = eval(m + c); const auto z = eval((c >> 31) ^ 0x7fffffff); - const auto x = eval(scarry(c, eval(m ^ sext(m == 0x80000000u)), s) >> 31); - set_vr(op.vd, eval(merge(x, z, s))); + const auto mx = eval(m ^ sext(m == 0x80000000u)); + const auto x = eval(((mx ^ s) & ~(c ^ mx)) >> 31); + set_vr(op.vd, eval((z & x) | (s & ~x))); SetSat(IsNotZero(x.value)); } diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 75a639409f..f3cb92ecd0 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -5678,7 +5678,8 @@ public: return; } - set_vr(op.rt4, merge(get_vr(op.rc), get_vr(op.rb), get_vr(op.ra))); + const auto c = get_vr(op.rc); + set_vr(op.rt4, (get_vr(op.rb) & c) | (get_vr(op.ra) & ~c)); } void SHUFB(spu_opcode_t op) //