From 85920253b3fd9fc845057b2fa3972274e7b6607e Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 17 May 2019 22:28:07 +0300 Subject: [PATCH] SPU ASMJIT: fix BISLED Properly prevent losing branch target (addr) vs get_events result (flags). Move get_events() to the beginning. Match BISL indirect_branch() args. --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 9c7493fd7a..bcc92380d3 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -2688,25 +2688,26 @@ void spu_recompiler::IRET(spu_opcode_t op) void spu_recompiler::BISLED(spu_opcode_t op) { + get_events(); + c->mov(*addr, SPU_OFF_32(gpr, op.ra, &v128::_u32, 3)); - c->and_(*addr, 0x3fffc); const XmmLink& vr = XmmAlloc(); c->lea(*qw0, get_pc(m_pos + 4)); - c->and_(qw0->r32(), 0x3fffc); c->movd(vr, qw0->r32()); + c->pand(vr, XmmConst(_mm_set1_epi32(0x3fffc))); c->pslldq(vr, 12); c->movdqa(SPU_OFF_128(gpr, op.rt), vr); asmjit::Label branch_label = c->newLabel(); - get_events(); c->jne(branch_label); after.emplace_back([=] { c->align(asmjit::kAlignCode, 16); c->bind(branch_label); - branch_indirect(op); + c->and_(*addr, 0x3fffc); + branch_indirect(op, true, false); }); }