From ad97780c4ff81d25d6749c64106ccd17d428ec31 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 30 Nov 2017 21:01:09 -0600 Subject: [PATCH] spu: Implement DFCMGT for interpreter and recompiler --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 9 ++++++++- rpcs3/Emu/Cell/SPUInterpreter.cpp | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index c614159200..14e686873f 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -1862,7 +1862,14 @@ void spu_recompiler::FCMGT(spu_opcode_t op) void spu_recompiler::DFCMGT(spu_opcode_t op) { - fmt::throw_exception("Unexpected instruction" HERE); + const auto mask = XmmConst(_mm_set1_epi64x(0x7fffffffffffffff)); + const XmmLink& va = XmmGet(op.ra, XmmType::Double); + const XmmLink& vb = XmmGet(op.rb, XmmType::Double); + + c->andpd(va, mask); + c->andpd(vb, mask); + c->cmppd(vb, va, 1); + c->movaps(SPU_OFF_128(gpr, op.rt), vb); } void spu_recompiler::DFA(spu_opcode_t op) diff --git a/rpcs3/Emu/Cell/SPUInterpreter.cpp b/rpcs3/Emu/Cell/SPUInterpreter.cpp index bfde9e2177..fee84ae482 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/SPUInterpreter.cpp @@ -837,7 +837,10 @@ void spu_interpreter_fast::FCMGT(SPUThread& spu, spu_opcode_t op) void spu_interpreter::DFCMGT(SPUThread& spu, spu_opcode_t op) { - fmt::throw_exception("Unexpected instruction" HERE); + const auto mask = _mm_castsi128_pd(_mm_set1_epi64x(0x7fffffffffffffff)); + const auto ra = _mm_and_pd(spu.gpr[op.ra].vd, mask); + const auto rb = _mm_and_pd(spu.gpr[op.rb].vd, mask); + spu.gpr[op.rt].vd = _mm_cmpgt_pd(ra, rb); } void spu_interpreter_fast::DFA(SPUThread& spu, spu_opcode_t op)