mirror of
https://github.com/jessicanataliagta/PSPRecomp
synced 2026-09-26 16:49:34 -04:00
d39586741f
otimizações round 12
1364 lines
62 KiB
C++
1364 lines
62 KiB
C++
// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py.
|
|
// Tier-2 SUPERBLOCK V4 150FPS cluster: collisionloop
|
|
#include "vcs_tier2_superblocks.hpp"
|
|
#include "psprecomp/runtime.hpp"
|
|
#include "generated_units.hpp"
|
|
#include "vcs_fast_paths.hpp"
|
|
#include "vcs_tier2_direct_memory.hpp"
|
|
|
|
#include <cstdint>
|
|
|
|
namespace vcs {
|
|
using namespace psprecomp;
|
|
|
|
void tier2_superblock_collisionloop(psprecomp::Runtime &rt,
|
|
psprecomp::AllegrexContext &ctx,
|
|
psprecomp::GuestMemory::AotFastView &aot_mem,
|
|
std::uint32_t entry_pc) {
|
|
tier2_detail::SampleScope tier2_scope(Tier2ClusterId::CollisionLoop);
|
|
auto &tier2_stats = tier2_scope.stats();
|
|
Tier2DirectMemoryView tier2_mem(rt.memory().direct_fastmem_base_address());
|
|
constexpr std::uint32_t kTier2ReturnCapacity = 32u;
|
|
std::uint32_t tier2_pending_transfers = 0u;
|
|
std::uint32_t tier2_return_depth = 0u;
|
|
std::uint32_t tier2_return_pc[kTier2ReturnCapacity];
|
|
std::uint32_t tier2_return_unit[kTier2ReturnCapacity];
|
|
std::uint32_t tier2_return_pending_base[kTier2ReturnCapacity];
|
|
std::uint32_t tier2_resume_pc = 0u;
|
|
std::uint32_t tier2_resume_unit = 0u;
|
|
std::uint32_t jump_target = 0u;
|
|
std::uint32_t local_pc = 0u;
|
|
std::uint32_t local_transfers = 0u;
|
|
std::uint32_t entry_id = 0u;
|
|
std::uint32_t tier2_gpr_4 = ctx.gpr[4];
|
|
std::uint32_t tier2_gpr_29 = ctx.gpr[29];
|
|
std::uint32_t tier2_gpr_5 = ctx.gpr[5];
|
|
std::uint32_t tier2_gpr_18 = ctx.gpr[18];
|
|
std::uint32_t tier2_gpr_16 = ctx.gpr[16];
|
|
std::uint32_t tier2_gpr_6 = ctx.gpr[6];
|
|
bool tier2_gpr_shadow_valid = true;
|
|
#define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[29] = tier2_gpr_29; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[18] = tier2_gpr_18; ctx.gpr[16] = tier2_gpr_16; ctx.gpr[6] = tier2_gpr_6; } } while (false)
|
|
#define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_29 = ctx.gpr[29]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_18 = ctx.gpr[18]; tier2_gpr_16 = ctx.gpr[16]; tier2_gpr_6 = ctx.gpr[6]; } } while (false)
|
|
#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false)
|
|
|
|
auto tier2_complete_shadow = [&](std::uint32_t count) -> bool {
|
|
TIER2_GPR_SYNC_OUT();
|
|
const bool same = rt.tier2_complete_fused_transfers(ctx, count);
|
|
if (!same) tier2_gpr_shadow_valid = false;
|
|
return same;
|
|
};
|
|
|
|
#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false)
|
|
|
|
goto TIER2_ENTRY_DISPATCH;
|
|
|
|
TIER2_FUSED_RETURN_DISPATCH:
|
|
switch (tier2_resume_pc) {
|
|
case 0x0889BFC0u: goto SB_L_0889BFC0;
|
|
case 0x0889BFD8u: goto SB_L_0889BFD8;
|
|
case 0x0889BFE4u: goto SB_L_0889BFE4;
|
|
case 0x0889C000u: goto SB_L_0889C000;
|
|
case 0x0889C008u: goto SB_L_0889C008;
|
|
case 0x0889C014u: goto SB_L_0889C014;
|
|
case 0x0889C01Cu: goto SB_L_0889C01C;
|
|
case 0x0889C024u: goto SB_L_0889C024;
|
|
case 0x0889C054u: goto SB_L_0889C054;
|
|
case 0x0889C06Cu: goto SB_L_0889C06C;
|
|
case 0x0889C074u: goto SB_L_0889C074;
|
|
case 0x0889C084u: goto SB_L_0889C084;
|
|
case 0x0889C08Cu: goto SB_L_0889C08C;
|
|
case 0x0889C094u: goto SB_L_0889C094;
|
|
case 0x0889C09Cu: goto SB_L_0889C09C;
|
|
case 0x0889C0A8u: goto SB_L_0889C0A8;
|
|
case 0x0889C0B0u: goto SB_L_0889C0B0;
|
|
case 0x0889C0B8u: goto SB_L_0889C0B8;
|
|
case 0x0889C0C0u: goto SB_L_0889C0C0;
|
|
case 0x0889C0D4u: goto SB_L_0889C0D4;
|
|
case 0x0889C0E4u: goto SB_L_0889C0E4;
|
|
case 0x0889C0F0u: goto SB_L_0889C0F0;
|
|
case 0x0889C0F8u: goto SB_L_0889C0F8;
|
|
case 0x0889C114u: goto SB_L_0889C114;
|
|
case 0x0889C120u: goto SB_L_0889C120;
|
|
case 0x0889C13Cu: goto SB_L_0889C13C;
|
|
case 0x0889C14Cu: goto SB_L_0889C14C;
|
|
case 0x0889C158u: goto SB_L_0889C158;
|
|
case 0x0889C160u: goto SB_L_0889C160;
|
|
case 0x0889C168u: goto SB_L_0889C168;
|
|
case 0x0889C180u: goto SB_L_0889C180;
|
|
case 0x0889C188u: goto SB_L_0889C188;
|
|
case 0x0889C194u: goto SB_L_0889C194;
|
|
case 0x0889C1A4u: goto SB_L_0889C1A4;
|
|
case 0x0889C1B4u: goto SB_L_0889C1B4;
|
|
case 0x0889C1C4u: goto SB_L_0889C1C4;
|
|
case 0x0889C1CCu: goto SB_L_0889C1CC;
|
|
case 0x0889C1E0u: goto SB_L_0889C1E0;
|
|
case 0x0889C1F0u: goto SB_L_0889C1F0;
|
|
case 0x0889C1FCu: goto SB_L_0889C1FC;
|
|
case 0x0889C204u: goto SB_L_0889C204;
|
|
case 0x0889C21Cu: goto SB_L_0889C21C;
|
|
case 0x0889C234u: goto SB_L_0889C234;
|
|
case 0x0889C23Cu: goto SB_L_0889C23C;
|
|
case 0x0889C254u: goto SB_L_0889C254;
|
|
case 0x0889C26Cu: goto SB_L_0889C26C;
|
|
case 0x0889C274u: goto SB_L_0889C274;
|
|
case 0x0889C298u: goto SB_L_0889C298;
|
|
case 0x0889C2A0u: goto SB_L_0889C2A0;
|
|
case 0x0889C2A8u: goto SB_L_0889C2A8;
|
|
case 0x0889C2C0u: goto SB_L_0889C2C0;
|
|
case 0x0889C2C8u: goto SB_L_0889C2C8;
|
|
case 0x0889C2D0u: goto SB_L_0889C2D0;
|
|
case 0x0889C2F8u: goto SB_L_0889C2F8;
|
|
case 0x0889C378u: goto SB_L_0889C378;
|
|
case 0x0889C380u: goto SB_L_0889C380;
|
|
case 0x0889C388u: goto SB_L_0889C388;
|
|
case 0x0889C394u: goto SB_L_0889C394;
|
|
case 0x0889C3B0u: goto SB_L_0889C3B0;
|
|
case 0x0889C3B8u: goto SB_L_0889C3B8;
|
|
case 0x0889C3DCu: goto SB_L_0889C3DC;
|
|
case 0x0889C3E4u: goto SB_L_0889C3E4;
|
|
case 0x0889C3ECu: goto SB_L_0889C3EC;
|
|
case 0x0889C404u: goto SB_L_0889C404;
|
|
case 0x0889C40Cu: goto SB_L_0889C40C;
|
|
case 0x0889C414u: goto SB_L_0889C414;
|
|
case 0x0889C43Cu: goto SB_L_0889C43C;
|
|
case 0x0889C4B8u: goto SB_L_0889C4B8;
|
|
case 0x0889C4C0u: goto SB_L_0889C4C0;
|
|
case 0x0889C4D8u: goto SB_L_0889C4D8;
|
|
case 0x0889C4E8u: goto SB_L_0889C4E8;
|
|
case 0x0889C4F4u: goto SB_L_0889C4F4;
|
|
case 0x0889C570u: goto SB_L_0889C570;
|
|
case 0x0889C580u: goto SB_L_0889C580;
|
|
case 0x0889C590u: goto SB_L_0889C590;
|
|
case 0x0889C5A0u: goto SB_L_0889C5A0;
|
|
case 0x0889C5B0u: goto SB_L_0889C5B0;
|
|
case 0x0889C5B8u: goto SB_L_0889C5B8;
|
|
default: break;
|
|
}
|
|
switch (tier2_resume_unit) {
|
|
|
|
default: break;
|
|
}
|
|
ctx.pc = tier2_resume_pc;
|
|
TIER2_SB_RETURN();
|
|
|
|
TIER2_LOCAL_DISPATCH_U0037:
|
|
if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) {
|
|
tier2_resume_pc = local_pc;
|
|
tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u];
|
|
// Match invoke_chained_direct(): when the callee has returned, ctx.pc
|
|
// already contains the caller continuation before any starvation
|
|
// boundary/accounting can run. A scheduler switch here must never see
|
|
// the stale callee PC.
|
|
ctx.pc = local_pc;
|
|
const std::uint32_t tier2_pending_base =
|
|
tier2_return_pending_base[tier2_return_depth - 1u];
|
|
bool tier2_same_context = true;
|
|
if (tier2_pending_transfers < tier2_pending_base) {
|
|
++tier2_stats.fallbacks;
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
const std::uint32_t tier2_nested_tail =
|
|
tier2_pending_transfers - tier2_pending_base;
|
|
if (tier2_nested_tail != 0u) {
|
|
tier2_pending_transfers = tier2_pending_base;
|
|
if (!tier2_complete_shadow(tier2_nested_tail))
|
|
tier2_same_context = false;
|
|
}
|
|
--tier2_return_depth;
|
|
if (!tier2_complete_shadow(1u))
|
|
tier2_same_context = false;
|
|
if (!tier2_same_context) TIER2_SB_RETURN();
|
|
goto TIER2_FUSED_RETURN_DISPATCH;
|
|
}
|
|
switch (local_pc) {
|
|
case 0x0889BFC0u: goto SB_L_0889BFC0;
|
|
case 0x0889BFD8u: goto SB_L_0889BFD8;
|
|
case 0x0889BFE4u: goto SB_L_0889BFE4;
|
|
default:
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
TIER2_LOCAL_DISPATCH_U0038:
|
|
if (tier2_return_depth != 0u && local_pc == tier2_return_pc[tier2_return_depth - 1u]) {
|
|
tier2_resume_pc = local_pc;
|
|
tier2_resume_unit = tier2_return_unit[tier2_return_depth - 1u];
|
|
// Match invoke_chained_direct(): when the callee has returned, ctx.pc
|
|
// already contains the caller continuation before any starvation
|
|
// boundary/accounting can run. A scheduler switch here must never see
|
|
// the stale callee PC.
|
|
ctx.pc = local_pc;
|
|
const std::uint32_t tier2_pending_base =
|
|
tier2_return_pending_base[tier2_return_depth - 1u];
|
|
bool tier2_same_context = true;
|
|
if (tier2_pending_transfers < tier2_pending_base) {
|
|
++tier2_stats.fallbacks;
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
const std::uint32_t tier2_nested_tail =
|
|
tier2_pending_transfers - tier2_pending_base;
|
|
if (tier2_nested_tail != 0u) {
|
|
tier2_pending_transfers = tier2_pending_base;
|
|
if (!tier2_complete_shadow(tier2_nested_tail))
|
|
tier2_same_context = false;
|
|
}
|
|
--tier2_return_depth;
|
|
if (!tier2_complete_shadow(1u))
|
|
tier2_same_context = false;
|
|
if (!tier2_same_context) TIER2_SB_RETURN();
|
|
goto TIER2_FUSED_RETURN_DISPATCH;
|
|
}
|
|
switch (local_pc) {
|
|
case 0x0889C000u: goto SB_L_0889C000;
|
|
case 0x0889C008u: goto SB_L_0889C008;
|
|
case 0x0889C014u: goto SB_L_0889C014;
|
|
case 0x0889C01Cu: goto SB_L_0889C01C;
|
|
case 0x0889C024u: goto SB_L_0889C024;
|
|
case 0x0889C054u: goto SB_L_0889C054;
|
|
case 0x0889C06Cu: goto SB_L_0889C06C;
|
|
case 0x0889C074u: goto SB_L_0889C074;
|
|
case 0x0889C084u: goto SB_L_0889C084;
|
|
case 0x0889C08Cu: goto SB_L_0889C08C;
|
|
case 0x0889C094u: goto SB_L_0889C094;
|
|
case 0x0889C09Cu: goto SB_L_0889C09C;
|
|
case 0x0889C0A8u: goto SB_L_0889C0A8;
|
|
case 0x0889C0B0u: goto SB_L_0889C0B0;
|
|
case 0x0889C0B8u: goto SB_L_0889C0B8;
|
|
case 0x0889C0C0u: goto SB_L_0889C0C0;
|
|
case 0x0889C0D4u: goto SB_L_0889C0D4;
|
|
case 0x0889C0E4u: goto SB_L_0889C0E4;
|
|
case 0x0889C0F0u: goto SB_L_0889C0F0;
|
|
case 0x0889C0F8u: goto SB_L_0889C0F8;
|
|
case 0x0889C114u: goto SB_L_0889C114;
|
|
case 0x0889C120u: goto SB_L_0889C120;
|
|
case 0x0889C13Cu: goto SB_L_0889C13C;
|
|
case 0x0889C14Cu: goto SB_L_0889C14C;
|
|
case 0x0889C158u: goto SB_L_0889C158;
|
|
case 0x0889C160u: goto SB_L_0889C160;
|
|
case 0x0889C168u: goto SB_L_0889C168;
|
|
case 0x0889C180u: goto SB_L_0889C180;
|
|
case 0x0889C188u: goto SB_L_0889C188;
|
|
case 0x0889C194u: goto SB_L_0889C194;
|
|
case 0x0889C1A4u: goto SB_L_0889C1A4;
|
|
case 0x0889C1B4u: goto SB_L_0889C1B4;
|
|
case 0x0889C1C4u: goto SB_L_0889C1C4;
|
|
case 0x0889C1CCu: goto SB_L_0889C1CC;
|
|
case 0x0889C1E0u: goto SB_L_0889C1E0;
|
|
case 0x0889C1F0u: goto SB_L_0889C1F0;
|
|
case 0x0889C1FCu: goto SB_L_0889C1FC;
|
|
case 0x0889C204u: goto SB_L_0889C204;
|
|
case 0x0889C21Cu: goto SB_L_0889C21C;
|
|
case 0x0889C234u: goto SB_L_0889C234;
|
|
case 0x0889C23Cu: goto SB_L_0889C23C;
|
|
case 0x0889C254u: goto SB_L_0889C254;
|
|
case 0x0889C26Cu: goto SB_L_0889C26C;
|
|
case 0x0889C274u: goto SB_L_0889C274;
|
|
case 0x0889C298u: goto SB_L_0889C298;
|
|
case 0x0889C2A0u: goto SB_L_0889C2A0;
|
|
case 0x0889C2A8u: goto SB_L_0889C2A8;
|
|
case 0x0889C2C0u: goto SB_L_0889C2C0;
|
|
case 0x0889C2C8u: goto SB_L_0889C2C8;
|
|
case 0x0889C2D0u: goto SB_L_0889C2D0;
|
|
case 0x0889C2F8u: goto SB_L_0889C2F8;
|
|
case 0x0889C378u: goto SB_L_0889C378;
|
|
case 0x0889C380u: goto SB_L_0889C380;
|
|
case 0x0889C388u: goto SB_L_0889C388;
|
|
case 0x0889C394u: goto SB_L_0889C394;
|
|
case 0x0889C3B0u: goto SB_L_0889C3B0;
|
|
case 0x0889C3B8u: goto SB_L_0889C3B8;
|
|
case 0x0889C3DCu: goto SB_L_0889C3DC;
|
|
case 0x0889C3E4u: goto SB_L_0889C3E4;
|
|
case 0x0889C3ECu: goto SB_L_0889C3EC;
|
|
case 0x0889C404u: goto SB_L_0889C404;
|
|
case 0x0889C40Cu: goto SB_L_0889C40C;
|
|
case 0x0889C414u: goto SB_L_0889C414;
|
|
case 0x0889C43Cu: goto SB_L_0889C43C;
|
|
case 0x0889C4B8u: goto SB_L_0889C4B8;
|
|
case 0x0889C4C0u: goto SB_L_0889C4C0;
|
|
case 0x0889C4D8u: goto SB_L_0889C4D8;
|
|
case 0x0889C4E8u: goto SB_L_0889C4E8;
|
|
case 0x0889C4F4u: goto SB_L_0889C4F4;
|
|
case 0x0889C570u: goto SB_L_0889C570;
|
|
case 0x0889C580u: goto SB_L_0889C580;
|
|
case 0x0889C590u: goto SB_L_0889C590;
|
|
case 0x0889C5A0u: goto SB_L_0889C5A0;
|
|
case 0x0889C5B0u: goto SB_L_0889C5B0;
|
|
case 0x0889C5B8u: goto SB_L_0889C5B8;
|
|
default:
|
|
ctx.pc = local_pc;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
|
|
TIER2_ENTRY_DISPATCH:
|
|
switch (entry_pc) {
|
|
case 0x0889BFC0u: goto SB_L_0889BFC0;
|
|
case 0x0889C000u: goto SB_L_0889C000;
|
|
case 0x0889C5B8u: goto SB_L_0889C5B8;
|
|
default:
|
|
ctx.pc = entry_pc;
|
|
++tier2_stats.fallbacks;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
|
|
// TIER2_GPR_BODY_BEGIN
|
|
SB_L_0889BFC0:
|
|
tier2_gpr_18 = (tier2_mem.aot_load32(ctx.gpr[30] + static_cast<std::uint32_t>(0)));
|
|
ctx.gpr[30] = (tier2_mem.aot_load32(ctx.gpr[30] + static_cast<std::uint32_t>(8)));
|
|
tier2_gpr_4 = (tier2_mem.aot_load16(tier2_gpr_18 + static_cast<std::uint32_t>(84)));
|
|
tier2_gpr_5 = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast<std::uint32_t>(-25492)));
|
|
{ const bool branch_taken = tier2_gpr_4 == tier2_gpr_5;
|
|
ctx.gpr[17] = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast<std::uint32_t>(596)));
|
|
if (branch_taken) {
|
|
if (!rt.tier2_enter_fused_transfer<38u, 0x0889C5B8u>(ctx)) {
|
|
ctx.pc = 0x0889C5B8u;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
++tier2_pending_transfers;
|
|
++tier2_stats.fused_tail_edges;
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889BFD8;
|
|
}
|
|
|
|
SB_L_0889BFD8:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(8068)));
|
|
{ const bool branch_taken = tier2_gpr_18 == tier2_gpr_4;
|
|
// nop
|
|
if (branch_taken) {
|
|
if (!rt.tier2_enter_fused_transfer<38u, 0x0889C5B8u>(ctx)) {
|
|
ctx.pc = 0x0889C5B8u;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
++tier2_pending_transfers;
|
|
++tier2_stats.fused_tail_edges;
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889BFE4;
|
|
}
|
|
|
|
SB_L_0889BFE4:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 512u);
|
|
tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u);
|
|
tier2_gpr_16 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast<std::uint32_t>(608)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
tier2_gpr_4 = (tier2_gpr_4 | ctx.gpr[17]);
|
|
tier2_gpr_4 = (tier2_gpr_4 | tier2_gpr_16);
|
|
// Generated corpus boundary: unwind any logical tail-call frames first,
|
|
// then account the outer dispatch that this local edge removes.
|
|
if (tier2_pending_transfers != 0u) {
|
|
const std::uint32_t tier2_static_pending_ = tier2_pending_transfers;
|
|
tier2_pending_transfers = 0u;
|
|
if (!tier2_complete_shadow(tier2_static_pending_)) {
|
|
tier2_gpr_shadow_valid = false;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
}
|
|
ctx.pc = 0x0889C000u;
|
|
TIER2_GPR_SYNC_OUT();
|
|
if (!rt.account_inlined_dispatch_boundary(ctx)) {
|
|
tier2_gpr_shadow_valid = false;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
TIER2_GPR_SYNC_IN();
|
|
goto SB_L_0889C000;
|
|
SB_L_0889C000:
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C008;
|
|
}
|
|
|
|
SB_L_0889C008:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(628)));
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C024;
|
|
}
|
|
goto SB_L_0889C014;
|
|
}
|
|
|
|
SB_L_0889C014:
|
|
ctx.gpr[31] = (0x0889C01Cu);
|
|
tier2_gpr_4 = (tier2_gpr_18 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0036_entry, 36u, 434u, 0x088961FCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C01Cu) goto SB_L_0889C01C;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C01C:
|
|
{ const bool branch_taken = ctx.gpr[2] != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C024;
|
|
}
|
|
|
|
SB_L_0889C024:
|
|
tier2_gpr_4 = (tier2_mem.aot_load16(ctx.gpr[28] + static_cast<std::uint32_t>(-25492)));
|
|
tier2_mem.aot_store16(tier2_gpr_18 + static_cast<std::uint32_t>(84), static_cast<std::uint16_t>(tier2_gpr_4));
|
|
ctx.gpr[19] = (0u | 0u);
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(16)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(336), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 6u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0F8;
|
|
}
|
|
goto SB_L_0889C054;
|
|
}
|
|
|
|
SB_L_0889C054:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 512u);
|
|
tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0C0;
|
|
}
|
|
goto SB_L_0889C06C;
|
|
}
|
|
|
|
SB_L_0889C06C:
|
|
{ const bool branch_taken = ctx.gpr[17] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C084;
|
|
}
|
|
goto SB_L_0889C074;
|
|
}
|
|
|
|
SB_L_0889C074:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(2228)));
|
|
tier2_gpr_5 = (0u | 58u);
|
|
{ const bool branch_taken = tier2_gpr_4 == tier2_gpr_5;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0C0;
|
|
}
|
|
goto SB_L_0889C084;
|
|
}
|
|
|
|
SB_L_0889C084:
|
|
{ const bool branch_taken = tier2_gpr_16 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0B8;
|
|
}
|
|
goto SB_L_0889C08C;
|
|
}
|
|
|
|
SB_L_0889C08C:
|
|
ctx.gpr[31] = (0x0889C094u);
|
|
tier2_gpr_4 = (tier2_gpr_18 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0067_entry, 67u, 195u, 0x08910B38u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C094u) goto SB_L_0889C094;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C094:
|
|
{ const bool branch_taken = ctx.gpr[2] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0B8;
|
|
}
|
|
goto SB_L_0889C09C;
|
|
}
|
|
|
|
SB_L_0889C09C:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(1152)));
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0B8;
|
|
}
|
|
goto SB_L_0889C0A8;
|
|
}
|
|
|
|
SB_L_0889C0A8:
|
|
ctx.gpr[31] = (0x0889C0B0u);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(1152)));
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0191_entry, 191u, 409u, 0x08B017A8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C0B0u) goto SB_L_0889C0B0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C0B0:
|
|
{ const bool branch_taken = ctx.gpr[2] != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0C0;
|
|
}
|
|
goto SB_L_0889C0B8;
|
|
}
|
|
|
|
SB_L_0889C0B8:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
ctx.gpr[19] = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C26C;
|
|
}
|
|
goto SB_L_0889C0C0;
|
|
}
|
|
|
|
SB_L_0889C0C0:
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_18 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(7656)));
|
|
tier2_gpr_6 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(tier2_gpr_6) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_6 == 0u;
|
|
tier2_gpr_5 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C0E4;
|
|
}
|
|
goto SB_L_0889C0D4;
|
|
}
|
|
|
|
SB_L_0889C0D4:
|
|
tier2_gpr_4 = (tier2_gpr_4 << 2u);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
goto SB_L_0889C0E4;
|
|
|
|
SB_L_0889C0E4:
|
|
tier2_gpr_4 = (tier2_gpr_5 | 0u);
|
|
ctx.gpr[31] = (0x0889C0F0u);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(80)));
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0063_entry, 63u, 664u, 0x089039E4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C0F0u) goto SB_L_0889C0F0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C0F0:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
ctx.gpr[19] = (ctx.gpr[2] | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C26C;
|
|
}
|
|
goto SB_L_0889C0F8;
|
|
}
|
|
|
|
SB_L_0889C0F8:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 ^ 14u);
|
|
tier2_gpr_4 = (tier2_gpr_4 < static_cast<std::uint32_t>(1) ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C23C;
|
|
}
|
|
goto SB_L_0889C114;
|
|
}
|
|
|
|
SB_L_0889C114:
|
|
tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(352)));
|
|
{ const bool branch_taken = tier2_gpr_16 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C158;
|
|
}
|
|
goto SB_L_0889C120;
|
|
}
|
|
|
|
SB_L_0889C120:
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(640), ctx.gpr[21]);
|
|
tier2_mem.aot_store8(tier2_gpr_29 + static_cast<std::uint32_t>(596), static_cast<std::uint8_t>(ctx.gpr[17]));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast<std::uint32_t>(108)));
|
|
ctx.gpr[17] = (tier2_gpr_4 + static_cast<std::uint32_t>(16));
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(ctx.gpr[17] + static_cast<std::uint32_t>(0))))));
|
|
ctx.gpr[31] = (0x0889C13Cu);
|
|
ctx.gpr[21] = (tier2_gpr_16 + tier2_gpr_4);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0115_entry, 115u, 419u, 0x089D273Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C13Cu) goto SB_L_0889C13C;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C13C:
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(4)));
|
|
tier2_gpr_4 = (ctx.gpr[21] | 0u);
|
|
jump_target = tier2_gpr_6;
|
|
ctx.gpr[31] = (0x0889C14Cu);
|
|
tier2_gpr_5 = (ctx.gpr[2] | 0u);
|
|
ctx.pc = jump_target;
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C14Cu) goto SB_L_0889C14C;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C14C:
|
|
ctx.gpr[17] = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast<std::uint32_t>(596)));
|
|
{ const bool branch_taken = ctx.gpr[2] != 0u;
|
|
ctx.gpr[21] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(640)));
|
|
if (branch_taken) {
|
|
goto SB_L_0889C160;
|
|
}
|
|
goto SB_L_0889C158;
|
|
}
|
|
|
|
SB_L_0889C158:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_gpr_16 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C160;
|
|
}
|
|
goto SB_L_0889C160;
|
|
}
|
|
|
|
SB_L_0889C160:
|
|
{ const bool branch_taken = tier2_gpr_16 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C204;
|
|
}
|
|
goto SB_L_0889C168;
|
|
}
|
|
|
|
SB_L_0889C168:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 512u);
|
|
tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C1CC;
|
|
}
|
|
goto SB_L_0889C180;
|
|
}
|
|
|
|
SB_L_0889C180:
|
|
{ const bool branch_taken = ctx.gpr[17] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C1C4;
|
|
}
|
|
goto SB_L_0889C188;
|
|
}
|
|
|
|
SB_L_0889C188:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast<std::uint32_t>(96)));
|
|
if (tier2_gpr_4 != 0u) {
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast<std::uint32_t>(96)));
|
|
goto SB_L_0889C1B4;
|
|
}
|
|
goto SB_L_0889C194;
|
|
|
|
SB_L_0889C194:
|
|
tier2_gpr_5 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_16 + static_cast<std::uint32_t>(10))))));
|
|
tier2_gpr_6 = (tier2_gpr_29 + static_cast<std::uint32_t>(384));
|
|
ctx.gpr[31] = (0x0889C1A4u);
|
|
tier2_gpr_4 = (tier2_gpr_16 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0166_entry, 166u, 47u, 0x08A9C6FCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C1A4u) goto SB_L_0889C1A4;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C1A4:
|
|
tier2_mem.aot_store32(tier2_gpr_16 + static_cast<std::uint32_t>(96), ctx.gpr[2]);
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast<std::uint32_t>(384)));
|
|
tier2_mem.aot_store8(tier2_gpr_16 + static_cast<std::uint32_t>(4), static_cast<std::uint8_t>(tier2_gpr_4));
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_16 + static_cast<std::uint32_t>(96)));
|
|
goto SB_L_0889C1B4;
|
|
|
|
SB_L_0889C1B4:
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_4 + static_cast<std::uint32_t>(180)));
|
|
tier2_gpr_5 = (0u | 58u);
|
|
{ const bool branch_taken = tier2_gpr_4 == tier2_gpr_5;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C1CC;
|
|
}
|
|
goto SB_L_0889C1C4;
|
|
}
|
|
|
|
SB_L_0889C1C4:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
ctx.gpr[19] = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C234;
|
|
}
|
|
goto SB_L_0889C1CC;
|
|
}
|
|
|
|
SB_L_0889C1CC:
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_18 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(7656)));
|
|
tier2_gpr_6 = (static_cast<std::int32_t>(tier2_gpr_4) < static_cast<std::int32_t>(tier2_gpr_6) ? 1u : 0u);
|
|
{ const bool branch_taken = tier2_gpr_6 == 0u;
|
|
tier2_gpr_5 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C1F0;
|
|
}
|
|
goto SB_L_0889C1E0;
|
|
}
|
|
|
|
SB_L_0889C1E0:
|
|
tier2_gpr_4 = (tier2_gpr_4 << 2u);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
goto SB_L_0889C1F0;
|
|
|
|
SB_L_0889C1F0:
|
|
tier2_gpr_4 = (tier2_gpr_5 | 0u);
|
|
ctx.gpr[31] = (0x0889C1FCu);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(80)));
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0063_entry, 63u, 664u, 0x089039E4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C1FCu) goto SB_L_0889C1FC;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C1FC:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
ctx.gpr[19] = (ctx.gpr[2] | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C234;
|
|
}
|
|
goto SB_L_0889C204;
|
|
}
|
|
|
|
SB_L_0889C204:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 512u);
|
|
tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C234;
|
|
}
|
|
goto SB_L_0889C21C;
|
|
}
|
|
|
|
SB_L_0889C21C:
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_18 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_4 = (tier2_gpr_4 << 2u);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
ctx.gpr[19] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(20)));
|
|
goto SB_L_0889C234;
|
|
|
|
SB_L_0889C234:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C26C;
|
|
}
|
|
goto SB_L_0889C23C;
|
|
}
|
|
|
|
SB_L_0889C23C:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(72)));
|
|
tier2_gpr_4 = (tier2_gpr_4 & 512u);
|
|
tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u);
|
|
tier2_gpr_4 = (tier2_gpr_4 & 255u);
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C26C;
|
|
}
|
|
goto SB_L_0889C254;
|
|
}
|
|
|
|
SB_L_0889C254:
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_18 + static_cast<std::uint32_t>(86))))));
|
|
tier2_gpr_4 = (tier2_gpr_4 << 2u);
|
|
tier2_gpr_5 = (tier2_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(24)));
|
|
tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(0)));
|
|
ctx.gpr[19] = (tier2_mem.aot_load32(tier2_gpr_4 + static_cast<std::uint32_t>(20)));
|
|
goto SB_L_0889C26C;
|
|
|
|
SB_L_0889C26C:
|
|
{ const bool branch_taken = ctx.gpr[19] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C388;
|
|
}
|
|
goto SB_L_0889C274;
|
|
}
|
|
|
|
SB_L_0889C274:
|
|
ctx.gpr[17] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(632)));
|
|
tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(612)));
|
|
ctx.gpr[17] = (ctx.gpr[17] & 255u);
|
|
tier2_gpr_16 = (tier2_gpr_16 & 255u);
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(600)));
|
|
tier2_gpr_6 = (ctx.gpr[19] + static_cast<std::uint32_t>(16));
|
|
ctx.gpr[7] = (tier2_gpr_29 + static_cast<std::uint32_t>(464));
|
|
ctx.gpr[31] = (0x0889C298u);
|
|
tier2_gpr_5 = (tier2_gpr_18 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 207u, 0x088B1820u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C298u) goto SB_L_0889C298;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C298:
|
|
{ const bool branch_taken = ctx.gpr[2] != 0u;
|
|
tier2_gpr_4 = (tier2_gpr_29 + static_cast<std::uint32_t>(464));
|
|
if (branch_taken) {
|
|
goto SB_L_0889C2A8;
|
|
}
|
|
goto SB_L_0889C2A0;
|
|
}
|
|
|
|
SB_L_0889C2A0:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_gpr_4 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C378;
|
|
}
|
|
goto SB_L_0889C2A8;
|
|
}
|
|
|
|
SB_L_0889C2A8:
|
|
ctx.gpr[7] = (tier2_gpr_29 + static_cast<std::uint32_t>(16));
|
|
tier2_gpr_5 = (ctx.gpr[19] | 0u);
|
|
tier2_gpr_6 = (ctx.gpr[20] | 0u);
|
|
ctx.gpr[8] = (ctx.gpr[17] | 0u);
|
|
ctx.gpr[31] = (0x0889C2C0u);
|
|
ctx.gpr[9] = (tier2_gpr_16 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 484u, 0x088B3CECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C2C0u) goto SB_L_0889C2C0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C2C0:
|
|
if (ctx.gpr[2] != 0u) {
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(0)));
|
|
goto SB_L_0889C2D0;
|
|
}
|
|
goto SB_L_0889C2C8;
|
|
|
|
SB_L_0889C2C8:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_gpr_4 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C378;
|
|
}
|
|
goto SB_L_0889C2D0;
|
|
}
|
|
|
|
SB_L_0889C2D0:
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(448), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(4)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(452), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(8)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(456), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
tier2_gpr_16 = (tier2_gpr_29 + static_cast<std::uint32_t>(448));
|
|
tier2_gpr_4 = (ctx.gpr[23] | 0u);
|
|
tier2_gpr_5 = (tier2_gpr_18 | 0u);
|
|
ctx.gpr[31] = (0x0889C2F8u);
|
|
tier2_gpr_6 = (tier2_gpr_16 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0035_entry, 35u, 194u, 0x08891710u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C2F8u) goto SB_L_0889C2F8;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C2F8:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_4 = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(4)));
|
|
tier2_gpr_5 = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[14] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(8)));
|
|
tier2_gpr_6 = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
|
{ const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6};
|
|
tier2_mem.aot_store32_block(ctx.gpr[20] + static_cast<std::uint32_t>(0), tier2_words); }
|
|
ctx.fpr[15] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(16)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(448), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
|
ctx.fpr[15] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(20)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(452), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(24)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(456), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(16);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(32);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_16 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
|
{ float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{};
|
|
ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u);
|
|
ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw);
|
|
constexpr std::uint32_t vfpu_side = 3u;
|
|
constexpr std::uint32_t vfpu_input_length = 3u;
|
|
for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f;
|
|
if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f;
|
|
if constexpr (vfpu_side == 4u) {
|
|
psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result);
|
|
} else {
|
|
for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) {
|
|
float sum = 0.0f;
|
|
for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column];
|
|
vfpu_result[row] = sum;
|
|
}
|
|
}
|
|
float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u],
|
|
vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]};
|
|
ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row);
|
|
ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target);
|
|
for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column];
|
|
const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2];
|
|
const std::uint32_t vfpu_last_lane = vfpu_side - 1u;
|
|
ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) |
|
|
((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u));
|
|
ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[23] + static_cast<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(620)));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_5 = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(4)));
|
|
tier2_gpr_6 = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[14] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[23] + static_cast<std::uint32_t>(8)));
|
|
ctx.gpr[7] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
|
{ const std::uint32_t tier2_words[3]{tier2_gpr_5, tier2_gpr_6, ctx.gpr[7]};
|
|
tier2_mem.aot_store32_block(tier2_gpr_4 + static_cast<std::uint32_t>(0), tier2_words); }
|
|
tier2_gpr_4 = (0u | 1u);
|
|
goto SB_L_0889C378;
|
|
|
|
SB_L_0889C378:
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C388;
|
|
}
|
|
goto SB_L_0889C380;
|
|
}
|
|
|
|
SB_L_0889C380:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(604)));
|
|
tier2_mem.aot_store32(tier2_gpr_4 + static_cast<std::uint32_t>(0), tier2_gpr_18);
|
|
goto SB_L_0889C388;
|
|
|
|
SB_L_0889C388:
|
|
tier2_gpr_4 = (tier2_mem.aot_load8(tier2_gpr_29 + static_cast<std::uint32_t>(624)));
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C394;
|
|
}
|
|
|
|
SB_L_0889C394:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_18 + static_cast<std::uint32_t>(92)));
|
|
tier2_gpr_5 = (tier2_gpr_4 + static_cast<std::uint32_t>(336));
|
|
tier2_gpr_4 = (static_cast<std::uint32_t>(static_cast<std::int32_t>(static_cast<std::int16_t>(tier2_mem.aot_load16(tier2_gpr_5 + static_cast<std::uint32_t>(0))))));
|
|
tier2_gpr_4 = (tier2_gpr_18 + tier2_gpr_4);
|
|
tier2_gpr_6 = (tier2_mem.aot_load32(tier2_gpr_5 + static_cast<std::uint32_t>(4)));
|
|
jump_target = tier2_gpr_6;
|
|
ctx.gpr[31] = (0x0889C3B0u);
|
|
tier2_gpr_5 = (tier2_gpr_29 + static_cast<std::uint32_t>(64));
|
|
ctx.pc = jump_target;
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C3B0u) goto SB_L_0889C3B0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C3B0:
|
|
{ const bool branch_taken = ctx.gpr[2] == 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C3B8;
|
|
}
|
|
|
|
SB_L_0889C3B8:
|
|
tier2_gpr_16 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(612)));
|
|
tier2_gpr_16 = (tier2_gpr_16 & 255u);
|
|
ctx.gpr[17] = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(600)));
|
|
tier2_gpr_4 = (ctx.gpr[17] | 0u);
|
|
tier2_gpr_6 = (tier2_gpr_29 + static_cast<std::uint32_t>(80));
|
|
ctx.gpr[19] = (tier2_gpr_29 + static_cast<std::uint32_t>(544));
|
|
tier2_gpr_5 = (tier2_gpr_18 | 0u);
|
|
ctx.gpr[31] = (0x0889C3DCu);
|
|
ctx.gpr[7] = (ctx.gpr[19] | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 207u, 0x088B1820u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C3DCu) goto SB_L_0889C3DC;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C3DC:
|
|
{ const bool branch_taken = ctx.gpr[2] != 0u;
|
|
ctx.gpr[8] = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C3EC;
|
|
}
|
|
goto SB_L_0889C3E4;
|
|
}
|
|
|
|
SB_L_0889C3E4:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_gpr_4 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C4B8;
|
|
}
|
|
goto SB_L_0889C3EC;
|
|
}
|
|
|
|
SB_L_0889C3EC:
|
|
tier2_gpr_5 = (tier2_gpr_29 + static_cast<std::uint32_t>(64));
|
|
tier2_gpr_6 = (tier2_gpr_29 + static_cast<std::uint32_t>(32));
|
|
tier2_gpr_4 = (ctx.gpr[19] | 0u);
|
|
ctx.gpr[7] = (tier2_gpr_29 + static_cast<std::uint32_t>(336));
|
|
ctx.gpr[31] = (0x0889C404u);
|
|
ctx.gpr[9] = (tier2_gpr_16 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 484u, 0x088B3CECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C404u) goto SB_L_0889C404;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C404:
|
|
if (ctx.gpr[2] != 0u) {
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(32)));
|
|
goto SB_L_0889C414;
|
|
}
|
|
goto SB_L_0889C40C;
|
|
|
|
SB_L_0889C40C:
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_gpr_4 = (0u | 0u);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C4B8;
|
|
}
|
|
goto SB_L_0889C414;
|
|
}
|
|
|
|
SB_L_0889C414:
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(528), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(36)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(532), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(40)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(536), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
tier2_gpr_16 = (tier2_gpr_29 + static_cast<std::uint32_t>(528));
|
|
tier2_gpr_4 = (ctx.gpr[22] | 0u);
|
|
tier2_gpr_5 = (tier2_gpr_18 | 0u);
|
|
ctx.gpr[31] = (0x0889C43Cu);
|
|
tier2_gpr_6 = (tier2_gpr_16 | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0035_entry, 35u, 194u, 0x08891710u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C43Cu) goto SB_L_0889C43C;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C43C:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_4 = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(4)));
|
|
tier2_gpr_5 = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[14] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(8)));
|
|
tier2_gpr_6 = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
|
{ const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6};
|
|
tier2_mem.aot_store32_block(tier2_gpr_29 + static_cast<std::uint32_t>(32), tier2_words); }
|
|
ctx.fpr[15] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(48)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(528), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
|
ctx.fpr[15] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(52)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(532), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(56)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(536), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(16);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(32);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_16 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
|
{ float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{};
|
|
ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u);
|
|
ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw);
|
|
constexpr std::uint32_t vfpu_side = 3u;
|
|
constexpr std::uint32_t vfpu_input_length = 3u;
|
|
for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f;
|
|
if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f;
|
|
if constexpr (vfpu_side == 4u) {
|
|
psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result);
|
|
} else {
|
|
for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) {
|
|
float sum = 0.0f;
|
|
for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column];
|
|
vfpu_result[row] = sum;
|
|
}
|
|
}
|
|
float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u],
|
|
vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]};
|
|
ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row);
|
|
ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target);
|
|
for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column];
|
|
const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2];
|
|
const std::uint32_t vfpu_last_lane = vfpu_side - 1u;
|
|
ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) |
|
|
((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u));
|
|
ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[22] + static_cast<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(0)));
|
|
tier2_gpr_4 = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(4)));
|
|
tier2_gpr_5 = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[14] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(8)));
|
|
tier2_gpr_6 = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
|
{ const std::uint32_t tier2_words[3]{tier2_gpr_4, tier2_gpr_5, tier2_gpr_6};
|
|
tier2_mem.aot_store32_block(tier2_gpr_29 + static_cast<std::uint32_t>(48), tier2_words); }
|
|
tier2_gpr_4 = (0u | 1u);
|
|
goto SB_L_0889C4B8;
|
|
|
|
SB_L_0889C4B8:
|
|
{ const bool branch_taken = tier2_gpr_4 == 0u;
|
|
tier2_gpr_5 = (tier2_gpr_29 + static_cast<std::uint32_t>(32));
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C4C0;
|
|
}
|
|
|
|
SB_L_0889C4C0:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(16)));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(336)));
|
|
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[13])) ? 0x00800000u : 0u);
|
|
// nop
|
|
{ const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u);
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C4F4;
|
|
}
|
|
goto SB_L_0889C4D8;
|
|
}
|
|
|
|
SB_L_0889C4D8:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(336)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(16), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.gpr[31] = (0x0889C4E8u);
|
|
tier2_gpr_4 = (ctx.gpr[20] | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 157u, 0x08805288u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C4E8u) goto SB_L_0889C4E8;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C4E8:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(604)));
|
|
{ const bool branch_taken = 0u == 0u;
|
|
tier2_mem.aot_store32(tier2_gpr_4 + static_cast<std::uint32_t>(0), tier2_gpr_18);
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C4F4;
|
|
}
|
|
|
|
SB_L_0889C4F4:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(616)));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
{ float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{};
|
|
ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s);
|
|
ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t);
|
|
for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i];
|
|
ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
ctx.execute_vfpu_vdot_ct<28u, 0u, 1u, 3u>();
|
|
tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>());
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_gpr_4);
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(0)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(368), std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(4)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(372), std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(8)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(376), std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
|
tier2_gpr_4 = (tier2_gpr_29 + static_cast<std::uint32_t>(368));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
tier2_gpr_4 = (tier2_gpr_18 + static_cast<std::uint32_t>(48));
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
{ float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{};
|
|
ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s);
|
|
ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t);
|
|
for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i];
|
|
ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); }
|
|
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
|
const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
|
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
|
tier2_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
|
{ const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
|
{ const std::uint32_t vfpu_address = tier2_gpr_18 + static_cast<std::uint32_t>(0);
|
|
std::uint32_t tier2_vfpu_words[4]{}; tier2_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
|
float vfpu_value[4]{
|
|
std::bit_cast<float>(tier2_vfpu_words[0]),
|
|
std::bit_cast<float>(tier2_vfpu_words[1]),
|
|
std::bit_cast<float>(tier2_vfpu_words[2]),
|
|
std::bit_cast<float>(tier2_vfpu_words[3])};
|
|
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
|
ctx.execute_vfpu_vdot_ct<28u, 0u, 1u, 3u>();
|
|
tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>());
|
|
ctx.fpr[13] = std::bit_cast<float>(tier2_gpr_4);
|
|
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[20])) ? 0x00800000u : 0u);
|
|
// nop
|
|
{ const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u);
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C580;
|
|
}
|
|
goto SB_L_0889C570;
|
|
}
|
|
|
|
SB_L_0889C570:
|
|
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] <= ctx.fpr[22])) ? 0x00800000u : 0u);
|
|
// nop
|
|
{ const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u);
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5A0;
|
|
}
|
|
goto SB_L_0889C580;
|
|
}
|
|
|
|
SB_L_0889C580:
|
|
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[24])) ? 0x00800000u : 0u);
|
|
// nop
|
|
{ const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u);
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C590;
|
|
}
|
|
|
|
SB_L_0889C590:
|
|
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[22])) ? 0x00800000u : 0u);
|
|
// nop
|
|
{ const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u);
|
|
// nop
|
|
if (branch_taken) {
|
|
goto SB_L_0889C5B8;
|
|
}
|
|
goto SB_L_0889C5A0;
|
|
}
|
|
|
|
SB_L_0889C5A0:
|
|
ctx.fpr[12] = std::bit_cast<float>(tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(336)));
|
|
tier2_mem.aot_store32(tier2_gpr_29 + static_cast<std::uint32_t>(16), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
|
ctx.gpr[31] = (0x0889C5B0u);
|
|
tier2_gpr_4 = (ctx.gpr[20] | 0u);
|
|
if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 157u, 0x08805288u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0889C5B0u) goto SB_L_0889C5B0;
|
|
TIER2_SB_RETURN();
|
|
|
|
SB_L_0889C5B0:
|
|
tier2_gpr_4 = (tier2_mem.aot_load32(tier2_gpr_29 + static_cast<std::uint32_t>(604)));
|
|
tier2_mem.aot_store32(tier2_gpr_4 + static_cast<std::uint32_t>(0), tier2_gpr_18);
|
|
goto SB_L_0889C5B8;
|
|
|
|
SB_L_0889C5B8:
|
|
{ const bool branch_taken = ctx.gpr[30] != 0u;
|
|
// nop
|
|
if (branch_taken) {
|
|
if (!rt.tier2_enter_fused_transfer<37u, 0x0889BFC0u>(ctx)) {
|
|
ctx.pc = 0x0889BFC0u;
|
|
TIER2_SB_RETURN();
|
|
}
|
|
++tier2_pending_transfers;
|
|
++tier2_stats.fused_tail_edges;
|
|
goto SB_L_0889BFC0;
|
|
}
|
|
++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0038_entry(rt, ctx, 76u, aot_mem); TIER2_SB_RETURN();
|
|
}
|
|
// TIER2_GPR_BODY_END
|
|
|
|
#undef TIER2_SB_RETURN
|
|
#undef TIER2_GPR_BEFORE_COLD
|
|
#undef TIER2_GPR_SYNC_IN
|
|
#undef TIER2_GPR_SYNC_OUT
|
|
}
|
|
|
|
} // namespace vcs
|