From 9d9869e8034ac6babbb6f913196f684f2e99f829 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 5 Jul 2018 19:39:08 +0300 Subject: [PATCH] PPU LLVM: simplify VADDCUW, VADDUBS, VADDUHS, VADDUWS --- rpcs3/Emu/Cell/PPUTranslator.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 766adcfe92..304664829b 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -583,7 +583,7 @@ void PPUTranslator::VADDCUW(ppu_opcode_t op) { const auto a = get_vr(op.va); const auto b = get_vr(op.vb); - set_vr(op.vd, eval(ucarry(a, b, eval(a + b)) >> 31)); + set_vr(op.vd, zext(a + b < a)); } void PPUTranslator::VADDFP(ppu_opcode_t op) @@ -635,11 +635,11 @@ void PPUTranslator::VADDUBM(ppu_opcode_t op) void PPUTranslator::VADDUBS(ppu_opcode_t op) { - const auto a = get_vr(op.va); - const auto b = get_vr(op.vb); + const auto a = get_vr(op.va); + const auto b = get_vr(op.vb); const auto s = eval(a + b); - const auto x = eval(ucarry(a, b, s) >> 7); - set_vr(op.vd, eval(s | x)); + const auto x = eval(s < a); + set_vr(op.vd, select(x, splat(-1), s)); SetSat(IsNotZero(x.value)); } @@ -652,11 +652,11 @@ void PPUTranslator::VADDUHM(ppu_opcode_t op) void PPUTranslator::VADDUHS(ppu_opcode_t op) { - const auto a = get_vr(op.va); - const auto b = get_vr(op.vb); + const auto a = get_vr(op.va); + const auto b = get_vr(op.vb); const auto s = eval(a + b); - const auto x = eval(ucarry(a, b, s) >> 15); - set_vr(op.vd, eval(s | x)); + const auto x = eval(s < a); + set_vr(op.vd, select(x, splat(-1), s)); SetSat(IsNotZero(x.value)); } @@ -669,11 +669,11 @@ void PPUTranslator::VADDUWM(ppu_opcode_t op) void PPUTranslator::VADDUWS(ppu_opcode_t op) { - const auto a = get_vr(op.va); - const auto b = get_vr(op.vb); + const auto a = get_vr(op.va); + const auto b = get_vr(op.vb); const auto s = eval(a + b); - const auto x = eval(ucarry(a, b, s) >> 31); - set_vr(op.vd, eval(s | x)); + const auto x = eval(s < a); + set_vr(op.vd, select(x, splat(-1), s)); SetSat(IsNotZero(x.value)); }