From 57f0ddd13ce24cc2ec2a089f62e644c69e656072 Mon Sep 17 00:00:00 2001 From: eladash Date: Mon, 12 Mar 2018 21:11:40 +0200 Subject: [PATCH] spu: allow branching to self on asmjit --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index cb47718ec7..44a005588c 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -9,6 +9,7 @@ #include "Utilities/sysinfo.h" #include +#include #define ASMJIT_STATIC #define ASMJIT_DEBUG @@ -2869,7 +2870,7 @@ void spu_recompiler::BRZ(spu_opcode_t op) { const u32 target = spu_branch_target(m_pos, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); c->cmp(SPU_OFF_32(gpr, op.rt, &v128::_u32, 3), 0); @@ -2915,7 +2916,7 @@ void spu_recompiler::BRNZ(spu_opcode_t op) { const u32 target = spu_branch_target(m_pos, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); c->cmp(SPU_OFF_32(gpr, op.rt, &v128::_u32, 3), 0); @@ -2940,7 +2941,7 @@ void spu_recompiler::BRHZ(spu_opcode_t op) { const u32 target = spu_branch_target(m_pos, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); c->cmp(SPU_OFF_16(gpr, op.rt, &v128::_u16, 6), 0); @@ -2965,7 +2966,7 @@ void spu_recompiler::BRHNZ(spu_opcode_t op) { const u32 target = spu_branch_target(m_pos, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); c->cmp(SPU_OFF_16(gpr, op.rt, &v128::_u16, 6), 0); @@ -3011,7 +3012,7 @@ void spu_recompiler::BRA(spu_opcode_t op) { const u32 target = spu_branch_target(0, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); if (labels[target / 4].isValid()) { @@ -3056,7 +3057,7 @@ void spu_recompiler::BRASL(spu_opcode_t op) { const u32 target = spu_branch_target(0, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); const XmmLink& vr = XmmAlloc(); c->movdqa(vr, XmmConst(_mm_set_epi32(spu_branch_target(m_pos + 4), 0, 0, 0))); @@ -3111,7 +3112,7 @@ void spu_recompiler::BRSL(spu_opcode_t op) { const u32 target = spu_branch_target(m_pos, op.i16); - if (target == m_pos) fmt::throw_exception("Branch-to-self (0x%05x)" HERE, target); + if (target == m_pos) std::this_thread::yield(); const XmmLink& vr = XmmAlloc(); c->movdqa(vr, XmmConst(_mm_set_epi32(spu_branch_target(m_pos + 4), 0, 0, 0)));