diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 8c26d0e979..9a3dd82c57 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -3921,9 +3921,8 @@ void spu_recompiler::DFNMA(spu_opcode_t op) const XmmLink& va = XmmGet(op.ra, XmmType::Double); const XmmLink& vt = XmmGet(op.rt, XmmType::Double); c->mulpd(va, SPU_OFF_128(gpr, op.rb)); - c->addpd(vt, va); - c->xorpd(va, va); - c->subpd(va, vt); + c->addpd(va, vt); + c->xorpd(va, XmmConst(_mm_set1_epi64x(0x8000000000000000))); c->movapd(SPU_OFF_128(gpr, op.rt), va); } diff --git a/rpcs3/Emu/Cell/SPUInterpreter.cpp b/rpcs3/Emu/Cell/SPUInterpreter.cpp index ab07f54531..c6e98cfbee 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/SPUInterpreter.cpp @@ -1090,7 +1090,7 @@ bool spu_interpreter_fast::DFNMS(SPUThread& spu, spu_opcode_t op) bool spu_interpreter_fast::DFNMA(SPUThread& spu, spu_opcode_t op) { - spu.gpr[op.rt].vd = _mm_sub_pd(_mm_set1_pd(0.0), _mm_add_pd(_mm_mul_pd(spu.gpr[op.ra].vd, spu.gpr[op.rb].vd), spu.gpr[op.rt].vd)); + spu.gpr[op.rt].vd = _mm_xor_pd(_mm_add_pd(_mm_mul_pd(spu.gpr[op.ra].vd, spu.gpr[op.rb].vd), spu.gpr[op.rt].vd), _mm_set1_pd(-0.0)); return true; } diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index c2ed545a47..1462ee7d6a 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -4141,7 +4141,7 @@ public: void DFNMA(spu_opcode_t op) // { - set_vr(op.rt, -get_vr(op.rt) - get_vr(op.ra) * get_vr(op.rb)); + set_vr(op.rt, -(get_vr(op.ra) * get_vr(op.rb) + get_vr(op.rt))); } void FREST(spu_opcode_t op) //